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