xref: /linux/include/pcmcia/soc_common.h (revision 24bce201d79807b668bf9d9e0aca801c5c0d5f78)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include <pcmcia/ss.h>
3 
4 struct module;
5 struct cpufreq_freqs;
6 
7 struct soc_pcmcia_regulator {
8 	struct regulator	*reg;
9 	bool			on;
10 };
11 
12 struct pcmcia_state {
13   unsigned detect: 1,
14             ready: 1,
15              bvd1: 1,
16              bvd2: 1,
17            wrprot: 1,
18             vs_3v: 1,
19             vs_Xv: 1;
20 };
21 
22 /*
23  * This structure encapsulates per-socket state which we might need to
24  * use when responding to a Card Services query of some kind.
25  */
26 struct soc_pcmcia_socket {
27 	struct pcmcia_socket	socket;
28 
29 	/*
30 	 * Info from low level handler
31 	 */
32 	unsigned int		nr;
33 	struct clk		*clk;
34 
35 	/*
36 	 * Core PCMCIA state
37 	 */
38 	const struct pcmcia_low_level *ops;
39 
40 	unsigned int		status;
41 	socket_state_t		cs_state;
42 
43 	unsigned short		spd_io[MAX_IO_WIN];
44 	unsigned short		spd_mem[MAX_WIN];
45 	unsigned short		spd_attr[MAX_WIN];
46 
47 	struct resource		res_skt;
48 	struct resource		res_io;
49 	struct resource		res_io_io;
50 	struct resource		res_mem;
51 	struct resource		res_attr;
52 
53 	struct {
54 		int		gpio;
55 		struct gpio_desc *desc;
56 		unsigned int	irq;
57 		const char	*name;
58 	} stat[6];
59 #define SOC_STAT_CD		0	/* Card detect */
60 #define SOC_STAT_BVD1		1	/* BATDEAD / IOSTSCHG */
61 #define SOC_STAT_BVD2		2	/* BATWARN / IOSPKR */
62 #define SOC_STAT_RDY		3	/* Ready / Interrupt */
63 #define SOC_STAT_VS1		4	/* Voltage sense 1 */
64 #define SOC_STAT_VS2		5	/* Voltage sense 2 */
65 
66 	struct gpio_desc	*gpio_reset;
67 	struct gpio_desc	*gpio_bus_enable;
68 	struct soc_pcmcia_regulator vcc;
69 	struct soc_pcmcia_regulator vpp;
70 
71 	unsigned int		irq_state;
72 
73 #ifdef CONFIG_CPU_FREQ
74 	struct notifier_block	cpufreq_nb;
75 #endif
76 	struct timer_list	poll_timer;
77 	struct list_head	node;
78 	void *driver_data;
79 };
80 
81 
82 struct pcmcia_low_level {
83 	struct module *owner;
84 
85 	/* first socket in system */
86 	int first;
87 	/* nr of sockets */
88 	int nr;
89 
90 	int (*hw_init)(struct soc_pcmcia_socket *);
91 	void (*hw_shutdown)(struct soc_pcmcia_socket *);
92 
93 	void (*socket_state)(struct soc_pcmcia_socket *, struct pcmcia_state *);
94 	int (*configure_socket)(struct soc_pcmcia_socket *, const socket_state_t *);
95 
96 	/*
97 	 * Enable card status IRQs on (re-)initialisation.  This can
98 	 * be called at initialisation, power management event, or
99 	 * pcmcia event.
100 	 */
101 	void (*socket_init)(struct soc_pcmcia_socket *);
102 
103 	/*
104 	 * Disable card status IRQs and PCMCIA bus on suspend.
105 	 */
106 	void (*socket_suspend)(struct soc_pcmcia_socket *);
107 
108 	/*
109 	 * Hardware specific timing routines.
110 	 * If provided, the get_timing routine overrides the SOC default.
111 	 */
112 	unsigned int (*get_timing)(struct soc_pcmcia_socket *, unsigned int, unsigned int);
113 	int (*set_timing)(struct soc_pcmcia_socket *);
114 	int (*show_timing)(struct soc_pcmcia_socket *, char *);
115 
116 #ifdef CONFIG_CPU_FREQ
117 	/*
118 	 * CPUFREQ support.
119 	 */
120 	int (*frequency_change)(struct soc_pcmcia_socket *, unsigned long, struct cpufreq_freqs *);
121 #endif
122 };
123 
124 
125 
126