162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#include <pcmcia/ss.h> 362306a36Sopenharmony_ci 462306a36Sopenharmony_cistruct module; 562306a36Sopenharmony_cistruct cpufreq_freqs; 662306a36Sopenharmony_ci 762306a36Sopenharmony_cistruct soc_pcmcia_regulator { 862306a36Sopenharmony_ci struct regulator *reg; 962306a36Sopenharmony_ci bool on; 1062306a36Sopenharmony_ci}; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistruct pcmcia_state { 1362306a36Sopenharmony_ci unsigned detect: 1, 1462306a36Sopenharmony_ci ready: 1, 1562306a36Sopenharmony_ci bvd1: 1, 1662306a36Sopenharmony_ci bvd2: 1, 1762306a36Sopenharmony_ci wrprot: 1, 1862306a36Sopenharmony_ci vs_3v: 1, 1962306a36Sopenharmony_ci vs_Xv: 1; 2062306a36Sopenharmony_ci}; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* 2362306a36Sopenharmony_ci * This structure encapsulates per-socket state which we might need to 2462306a36Sopenharmony_ci * use when responding to a Card Services query of some kind. 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_cistruct soc_pcmcia_socket { 2762306a36Sopenharmony_ci struct pcmcia_socket socket; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci /* 3062306a36Sopenharmony_ci * Info from low level handler 3162306a36Sopenharmony_ci */ 3262306a36Sopenharmony_ci unsigned int nr; 3362306a36Sopenharmony_ci struct clk *clk; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci /* 3662306a36Sopenharmony_ci * Core PCMCIA state 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_ci const struct pcmcia_low_level *ops; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci unsigned int status; 4162306a36Sopenharmony_ci socket_state_t cs_state; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci unsigned short spd_io[MAX_IO_WIN]; 4462306a36Sopenharmony_ci unsigned short spd_mem[MAX_WIN]; 4562306a36Sopenharmony_ci unsigned short spd_attr[MAX_WIN]; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci struct resource res_skt; 4862306a36Sopenharmony_ci struct resource res_io; 4962306a36Sopenharmony_ci struct resource res_io_io; 5062306a36Sopenharmony_ci struct resource res_mem; 5162306a36Sopenharmony_ci struct resource res_attr; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci struct { 5462306a36Sopenharmony_ci int gpio; 5562306a36Sopenharmony_ci struct gpio_desc *desc; 5662306a36Sopenharmony_ci unsigned int irq; 5762306a36Sopenharmony_ci const char *name; 5862306a36Sopenharmony_ci } stat[6]; 5962306a36Sopenharmony_ci#define SOC_STAT_CD 0 /* Card detect */ 6062306a36Sopenharmony_ci#define SOC_STAT_BVD1 1 /* BATDEAD / IOSTSCHG */ 6162306a36Sopenharmony_ci#define SOC_STAT_BVD2 2 /* BATWARN / IOSPKR */ 6262306a36Sopenharmony_ci#define SOC_STAT_RDY 3 /* Ready / Interrupt */ 6362306a36Sopenharmony_ci#define SOC_STAT_VS1 4 /* Voltage sense 1 */ 6462306a36Sopenharmony_ci#define SOC_STAT_VS2 5 /* Voltage sense 2 */ 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci struct gpio_desc *gpio_reset; 6762306a36Sopenharmony_ci struct gpio_desc *gpio_bus_enable; 6862306a36Sopenharmony_ci struct soc_pcmcia_regulator vcc; 6962306a36Sopenharmony_ci struct soc_pcmcia_regulator vpp; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci unsigned int irq_state; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#ifdef CONFIG_CPU_FREQ 7462306a36Sopenharmony_ci struct notifier_block cpufreq_nb; 7562306a36Sopenharmony_ci#endif 7662306a36Sopenharmony_ci struct timer_list poll_timer; 7762306a36Sopenharmony_ci struct list_head node; 7862306a36Sopenharmony_ci void *driver_data; 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistruct pcmcia_low_level { 8362306a36Sopenharmony_ci struct module *owner; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci /* first socket in system */ 8662306a36Sopenharmony_ci int first; 8762306a36Sopenharmony_ci /* nr of sockets */ 8862306a36Sopenharmony_ci int nr; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci int (*hw_init)(struct soc_pcmcia_socket *); 9162306a36Sopenharmony_ci void (*hw_shutdown)(struct soc_pcmcia_socket *); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci void (*socket_state)(struct soc_pcmcia_socket *, struct pcmcia_state *); 9462306a36Sopenharmony_ci int (*configure_socket)(struct soc_pcmcia_socket *, const socket_state_t *); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci /* 9762306a36Sopenharmony_ci * Enable card status IRQs on (re-)initialisation. This can 9862306a36Sopenharmony_ci * be called at initialisation, power management event, or 9962306a36Sopenharmony_ci * pcmcia event. 10062306a36Sopenharmony_ci */ 10162306a36Sopenharmony_ci void (*socket_init)(struct soc_pcmcia_socket *); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci /* 10462306a36Sopenharmony_ci * Disable card status IRQs and PCMCIA bus on suspend. 10562306a36Sopenharmony_ci */ 10662306a36Sopenharmony_ci void (*socket_suspend)(struct soc_pcmcia_socket *); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci /* 10962306a36Sopenharmony_ci * Hardware specific timing routines. 11062306a36Sopenharmony_ci * If provided, the get_timing routine overrides the SOC default. 11162306a36Sopenharmony_ci */ 11262306a36Sopenharmony_ci unsigned int (*get_timing)(struct soc_pcmcia_socket *, unsigned int, unsigned int); 11362306a36Sopenharmony_ci int (*set_timing)(struct soc_pcmcia_socket *); 11462306a36Sopenharmony_ci int (*show_timing)(struct soc_pcmcia_socket *, char *); 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#ifdef CONFIG_CPU_FREQ 11762306a36Sopenharmony_ci /* 11862306a36Sopenharmony_ci * CPUFREQ support. 11962306a36Sopenharmony_ci */ 12062306a36Sopenharmony_ci int (*frequency_change)(struct soc_pcmcia_socket *, unsigned long, struct cpufreq_freqs *); 12162306a36Sopenharmony_ci#endif 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci 126