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

source code of linux/include/pcmcia/soc_common.h