126 lines
2.8 KiB
C
126 lines
2.8 KiB
C
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||
|
#include <pcmcia/ss.h>
|
||
|
|
||
|
struct module;
|
||
|
struct cpufreq_freqs;
|
||
|
|
||
|
struct soc_pcmcia_regulator {
|
||
|
struct regulator *reg;
|
||
|
bool on;
|
||
|
};
|
||
|
|
||
|
struct pcmcia_state {
|
||
|
unsigned detect: 1,
|
||
|
ready: 1,
|
||
|
bvd1: 1,
|
||
|
bvd2: 1,
|
||
|
wrprot: 1,
|
||
|
vs_3v: 1,
|
||
|
vs_Xv: 1;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* This structure encapsulates per-socket state which we might need to
|
||
|
* use when responding to a Card Services query of some kind.
|
||
|
*/
|
||
|
struct soc_pcmcia_socket {
|
||
|
struct pcmcia_socket socket;
|
||
|
|
||
|
/*
|
||
|
* Info from low level handler
|
||
|
*/
|
||
|
unsigned int nr;
|
||
|
struct clk *clk;
|
||
|
|
||
|
/*
|
||
|
* Core PCMCIA state
|
||
|
*/
|
||
|
const struct pcmcia_low_level *ops;
|
||
|
|
||
|
unsigned int status;
|
||
|
socket_state_t cs_state;
|
||
|
|
||
|
unsigned short spd_io[MAX_IO_WIN];
|
||
|
unsigned short spd_mem[MAX_WIN];
|
||
|
unsigned short spd_attr[MAX_WIN];
|
||
|
|
||
|
struct resource res_skt;
|
||
|
struct resource res_io;
|
||
|
struct resource res_io_io;
|
||
|
struct resource res_mem;
|
||
|
struct resource res_attr;
|
||
|
|
||
|
struct {
|
||
|
int gpio;
|
||
|
struct gpio_desc *desc;
|
||
|
unsigned int irq;
|
||
|
const char *name;
|
||
|
} stat[6];
|
||
|
#define SOC_STAT_CD 0 /* Card detect */
|
||
|
#define SOC_STAT_BVD1 1 /* BATDEAD / IOSTSCHG */
|
||
|
#define SOC_STAT_BVD2 2 /* BATWARN / IOSPKR */
|
||
|
#define SOC_STAT_RDY 3 /* Ready / Interrupt */
|
||
|
#define SOC_STAT_VS1 4 /* Voltage sense 1 */
|
||
|
#define SOC_STAT_VS2 5 /* Voltage sense 2 */
|
||
|
|
||
|
struct gpio_desc *gpio_reset;
|
||
|
struct gpio_desc *gpio_bus_enable;
|
||
|
struct soc_pcmcia_regulator vcc;
|
||
|
struct soc_pcmcia_regulator vpp;
|
||
|
|
||
|
unsigned int irq_state;
|
||
|
|
||
|
#ifdef CONFIG_CPU_FREQ
|
||
|
struct notifier_block cpufreq_nb;
|
||
|
#endif
|
||
|
struct timer_list poll_timer;
|
||
|
struct list_head node;
|
||
|
void *driver_data;
|
||
|
};
|
||
|
|
||
|
|
||
|
struct pcmcia_low_level {
|
||
|
struct module *owner;
|
||
|
|
||
|
/* first socket in system */
|
||
|
int first;
|
||
|
/* nr of sockets */
|
||
|
int nr;
|
||
|
|
||
|
int (*hw_init)(struct soc_pcmcia_socket *);
|
||
|
void (*hw_shutdown)(struct soc_pcmcia_socket *);
|
||
|
|
||
|
void (*socket_state)(struct soc_pcmcia_socket *, struct pcmcia_state *);
|
||
|
int (*configure_socket)(struct soc_pcmcia_socket *, const socket_state_t *);
|
||
|
|
||
|
/*
|
||
|
* Enable card status IRQs on (re-)initialisation. This can
|
||
|
* be called at initialisation, power management event, or
|
||
|
* pcmcia event.
|
||
|
*/
|
||
|
void (*socket_init)(struct soc_pcmcia_socket *);
|
||
|
|
||
|
/*
|
||
|
* Disable card status IRQs and PCMCIA bus on suspend.
|
||
|
*/
|
||
|
void (*socket_suspend)(struct soc_pcmcia_socket *);
|
||
|
|
||
|
/*
|
||
|
* Hardware specific timing routines.
|
||
|
* If provided, the get_timing routine overrides the SOC default.
|
||
|
*/
|
||
|
unsigned int (*get_timing)(struct soc_pcmcia_socket *, unsigned int, unsigned int);
|
||
|
int (*set_timing)(struct soc_pcmcia_socket *);
|
||
|
int (*show_timing)(struct soc_pcmcia_socket *, char *);
|
||
|
|
||
|
#ifdef CONFIG_CPU_FREQ
|
||
|
/*
|
||
|
* CPUFREQ support.
|
||
|
*/
|
||
|
int (*frequency_change)(struct soc_pcmcia_socket *, unsigned long, struct cpufreq_freqs *);
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
|
||
|
|