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