1/* SPDX-License-Identifier: GPL-2.0 */
2#include <pcmcia/ss.h>
3
4struct module;
5struct cpufreq_freqs;
6
7struct soc_pcmcia_regulator {
8	struct regulator	*reg;
9	bool			on;
10};
11
12struct 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 */
26struct 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
82struct 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