Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #include <pcmcia/ss.h>
0003 
0004 struct module;
0005 struct cpufreq_freqs;
0006 
0007 struct soc_pcmcia_regulator {
0008     struct regulator    *reg;
0009     bool            on;
0010 };
0011 
0012 struct pcmcia_state {
0013   unsigned detect: 1,
0014             ready: 1,
0015              bvd1: 1,
0016              bvd2: 1,
0017            wrprot: 1,
0018             vs_3v: 1,
0019             vs_Xv: 1;
0020 };
0021 
0022 /*
0023  * This structure encapsulates per-socket state which we might need to
0024  * use when responding to a Card Services query of some kind.
0025  */
0026 struct soc_pcmcia_socket {
0027     struct pcmcia_socket    socket;
0028 
0029     /*
0030      * Info from low level handler
0031      */
0032     unsigned int        nr;
0033     struct clk      *clk;
0034 
0035     /*
0036      * Core PCMCIA state
0037      */
0038     const struct pcmcia_low_level *ops;
0039 
0040     unsigned int        status;
0041     socket_state_t      cs_state;
0042 
0043     unsigned short      spd_io[MAX_IO_WIN];
0044     unsigned short      spd_mem[MAX_WIN];
0045     unsigned short      spd_attr[MAX_WIN];
0046 
0047     struct resource     res_skt;
0048     struct resource     res_io;
0049     struct resource     res_io_io;
0050     struct resource     res_mem;
0051     struct resource     res_attr;
0052 
0053     struct {
0054         int     gpio;
0055         struct gpio_desc *desc;
0056         unsigned int    irq;
0057         const char  *name;
0058     } stat[6];
0059 #define SOC_STAT_CD     0   /* Card detect */
0060 #define SOC_STAT_BVD1       1   /* BATDEAD / IOSTSCHG */
0061 #define SOC_STAT_BVD2       2   /* BATWARN / IOSPKR */
0062 #define SOC_STAT_RDY        3   /* Ready / Interrupt */
0063 #define SOC_STAT_VS1        4   /* Voltage sense 1 */
0064 #define SOC_STAT_VS2        5   /* Voltage sense 2 */
0065 
0066     struct gpio_desc    *gpio_reset;
0067     struct gpio_desc    *gpio_bus_enable;
0068     struct soc_pcmcia_regulator vcc;
0069     struct soc_pcmcia_regulator vpp;
0070 
0071     unsigned int        irq_state;
0072 
0073 #ifdef CONFIG_CPU_FREQ
0074     struct notifier_block   cpufreq_nb;
0075 #endif
0076     struct timer_list   poll_timer;
0077     struct list_head    node;
0078     void *driver_data;
0079 };
0080 
0081 
0082 struct pcmcia_low_level {
0083     struct module *owner;
0084 
0085     /* first socket in system */
0086     int first;
0087     /* nr of sockets */
0088     int nr;
0089 
0090     int (*hw_init)(struct soc_pcmcia_socket *);
0091     void (*hw_shutdown)(struct soc_pcmcia_socket *);
0092 
0093     void (*socket_state)(struct soc_pcmcia_socket *, struct pcmcia_state *);
0094     int (*configure_socket)(struct soc_pcmcia_socket *, const socket_state_t *);
0095 
0096     /*
0097      * Enable card status IRQs on (re-)initialisation.  This can
0098      * be called at initialisation, power management event, or
0099      * pcmcia event.
0100      */
0101     void (*socket_init)(struct soc_pcmcia_socket *);
0102 
0103     /*
0104      * Disable card status IRQs and PCMCIA bus on suspend.
0105      */
0106     void (*socket_suspend)(struct soc_pcmcia_socket *);
0107 
0108     /*
0109      * Hardware specific timing routines.
0110      * If provided, the get_timing routine overrides the SOC default.
0111      */
0112     unsigned int (*get_timing)(struct soc_pcmcia_socket *, unsigned int, unsigned int);
0113     int (*set_timing)(struct soc_pcmcia_socket *);
0114     int (*show_timing)(struct soc_pcmcia_socket *, char *);
0115 
0116 #ifdef CONFIG_CPU_FREQ
0117     /*
0118      * CPUFREQ support.
0119      */
0120     int (*frequency_change)(struct soc_pcmcia_socket *, unsigned long, struct cpufreq_freqs *);
0121 #endif
0122 };
0123 
0124 
0125