1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * linux/drivers/pcmcia/soc_common.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2000 John G Dorsey <john+@cs.cmu.edu> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * This file contains definitions for the PCMCIA support code common to 8*4882a593Smuzhiyun * integrated SOCs like the SA-11x0 and PXA2xx microprocessors. 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun #ifndef _ASM_ARCH_PCMCIA 11*4882a593Smuzhiyun #define _ASM_ARCH_PCMCIA 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* include the world */ 14*4882a593Smuzhiyun #include <linux/clk.h> 15*4882a593Smuzhiyun #include <linux/cpufreq.h> 16*4882a593Smuzhiyun #include <pcmcia/ss.h> 17*4882a593Smuzhiyun #include <pcmcia/cistpl.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun struct device; 21*4882a593Smuzhiyun struct gpio_desc; 22*4882a593Smuzhiyun struct pcmcia_low_level; 23*4882a593Smuzhiyun struct regulator; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct soc_pcmcia_regulator { 26*4882a593Smuzhiyun struct regulator *reg; 27*4882a593Smuzhiyun bool on; 28*4882a593Smuzhiyun }; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* 31*4882a593Smuzhiyun * This structure encapsulates per-socket state which we might need to 32*4882a593Smuzhiyun * use when responding to a Card Services query of some kind. 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun struct soc_pcmcia_socket { 35*4882a593Smuzhiyun struct pcmcia_socket socket; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* 38*4882a593Smuzhiyun * Info from low level handler 39*4882a593Smuzhiyun */ 40*4882a593Smuzhiyun unsigned int nr; 41*4882a593Smuzhiyun struct clk *clk; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 44*4882a593Smuzhiyun * Core PCMCIA state 45*4882a593Smuzhiyun */ 46*4882a593Smuzhiyun const struct pcmcia_low_level *ops; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun unsigned int status; 49*4882a593Smuzhiyun socket_state_t cs_state; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun unsigned short spd_io[MAX_IO_WIN]; 52*4882a593Smuzhiyun unsigned short spd_mem[MAX_WIN]; 53*4882a593Smuzhiyun unsigned short spd_attr[MAX_WIN]; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct resource res_skt; 56*4882a593Smuzhiyun struct resource res_io; 57*4882a593Smuzhiyun struct resource res_mem; 58*4882a593Smuzhiyun struct resource res_attr; 59*4882a593Smuzhiyun void __iomem *virt_io; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun struct { 62*4882a593Smuzhiyun int gpio; 63*4882a593Smuzhiyun struct gpio_desc *desc; 64*4882a593Smuzhiyun unsigned int irq; 65*4882a593Smuzhiyun const char *name; 66*4882a593Smuzhiyun } stat[6]; 67*4882a593Smuzhiyun #define SOC_STAT_CD 0 /* Card detect */ 68*4882a593Smuzhiyun #define SOC_STAT_BVD1 1 /* BATDEAD / IOSTSCHG */ 69*4882a593Smuzhiyun #define SOC_STAT_BVD2 2 /* BATWARN / IOSPKR */ 70*4882a593Smuzhiyun #define SOC_STAT_RDY 3 /* Ready / Interrupt */ 71*4882a593Smuzhiyun #define SOC_STAT_VS1 4 /* Voltage sense 1 */ 72*4882a593Smuzhiyun #define SOC_STAT_VS2 5 /* Voltage sense 2 */ 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct gpio_desc *gpio_reset; 75*4882a593Smuzhiyun struct gpio_desc *gpio_bus_enable; 76*4882a593Smuzhiyun struct soc_pcmcia_regulator vcc; 77*4882a593Smuzhiyun struct soc_pcmcia_regulator vpp; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun unsigned int irq_state; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #ifdef CONFIG_CPU_FREQ 82*4882a593Smuzhiyun struct notifier_block cpufreq_nb; 83*4882a593Smuzhiyun #endif 84*4882a593Smuzhiyun struct timer_list poll_timer; 85*4882a593Smuzhiyun struct list_head node; 86*4882a593Smuzhiyun void *driver_data; 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct skt_dev_info { 90*4882a593Smuzhiyun int nskt; 91*4882a593Smuzhiyun struct soc_pcmcia_socket skt[]; 92*4882a593Smuzhiyun }; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun struct pcmcia_state { 95*4882a593Smuzhiyun unsigned detect: 1, 96*4882a593Smuzhiyun ready: 1, 97*4882a593Smuzhiyun bvd1: 1, 98*4882a593Smuzhiyun bvd2: 1, 99*4882a593Smuzhiyun wrprot: 1, 100*4882a593Smuzhiyun vs_3v: 1, 101*4882a593Smuzhiyun vs_Xv: 1; 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct pcmcia_low_level { 105*4882a593Smuzhiyun struct module *owner; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* first socket in system */ 108*4882a593Smuzhiyun int first; 109*4882a593Smuzhiyun /* nr of sockets */ 110*4882a593Smuzhiyun int nr; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun int (*hw_init)(struct soc_pcmcia_socket *); 113*4882a593Smuzhiyun void (*hw_shutdown)(struct soc_pcmcia_socket *); 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun void (*socket_state)(struct soc_pcmcia_socket *, struct pcmcia_state *); 116*4882a593Smuzhiyun int (*configure_socket)(struct soc_pcmcia_socket *, const socket_state_t *); 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* 119*4882a593Smuzhiyun * Enable card status IRQs on (re-)initialisation. This can 120*4882a593Smuzhiyun * be called at initialisation, power management event, or 121*4882a593Smuzhiyun * pcmcia event. 122*4882a593Smuzhiyun */ 123*4882a593Smuzhiyun void (*socket_init)(struct soc_pcmcia_socket *); 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* 126*4882a593Smuzhiyun * Disable card status IRQs and PCMCIA bus on suspend. 127*4882a593Smuzhiyun */ 128*4882a593Smuzhiyun void (*socket_suspend)(struct soc_pcmcia_socket *); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* 131*4882a593Smuzhiyun * Hardware specific timing routines. 132*4882a593Smuzhiyun * If provided, the get_timing routine overrides the SOC default. 133*4882a593Smuzhiyun */ 134*4882a593Smuzhiyun unsigned int (*get_timing)(struct soc_pcmcia_socket *, unsigned int, unsigned int); 135*4882a593Smuzhiyun int (*set_timing)(struct soc_pcmcia_socket *); 136*4882a593Smuzhiyun int (*show_timing)(struct soc_pcmcia_socket *, char *); 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun #ifdef CONFIG_CPU_FREQ 139*4882a593Smuzhiyun /* 140*4882a593Smuzhiyun * CPUFREQ support. 141*4882a593Smuzhiyun */ 142*4882a593Smuzhiyun int (*frequency_change)(struct soc_pcmcia_socket *, unsigned long, struct cpufreq_freqs *); 143*4882a593Smuzhiyun #endif 144*4882a593Smuzhiyun }; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun struct soc_pcmcia_timing { 148*4882a593Smuzhiyun unsigned short io; 149*4882a593Smuzhiyun unsigned short mem; 150*4882a593Smuzhiyun unsigned short attr; 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun extern void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *, struct soc_pcmcia_timing *); 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun void soc_pcmcia_init_one(struct soc_pcmcia_socket *skt, 156*4882a593Smuzhiyun const struct pcmcia_low_level *ops, struct device *dev); 157*4882a593Smuzhiyun void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt); 158*4882a593Smuzhiyun int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt); 159*4882a593Smuzhiyun int soc_pcmcia_request_gpiods(struct soc_pcmcia_socket *skt); 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun void soc_common_cf_socket_state(struct soc_pcmcia_socket *skt, 162*4882a593Smuzhiyun struct pcmcia_state *state); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun int soc_pcmcia_regulator_set(struct soc_pcmcia_socket *skt, 165*4882a593Smuzhiyun struct soc_pcmcia_regulator *r, int v); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun #ifdef CONFIG_PCMCIA_DEBUG 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun extern void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func, 170*4882a593Smuzhiyun int lvl, const char *fmt, ...); 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define debug(skt, lvl, fmt, arg...) \ 173*4882a593Smuzhiyun soc_pcmcia_debug(skt, __func__, lvl, fmt , ## arg) 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun #else 176*4882a593Smuzhiyun #define debug(skt, lvl, fmt, arg...) do { } while (0) 177*4882a593Smuzhiyun #endif 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun /* 181*4882a593Smuzhiyun * The PC Card Standard, Release 7, section 4.13.4, says that twIORD 182*4882a593Smuzhiyun * has a minimum value of 165ns. Section 4.13.5 says that twIOWR has 183*4882a593Smuzhiyun * a minimum value of 165ns, as well. Section 4.7.2 (describing 184*4882a593Smuzhiyun * common and attribute memory write timing) says that twWE has a 185*4882a593Smuzhiyun * minimum value of 150ns for a 250ns cycle time (for 5V operation; 186*4882a593Smuzhiyun * see section 4.7.4), or 300ns for a 600ns cycle time (for 3.3V 187*4882a593Smuzhiyun * operation, also section 4.7.4). Section 4.7.3 says that taOE 188*4882a593Smuzhiyun * has a maximum value of 150ns for a 300ns cycle time (for 5V 189*4882a593Smuzhiyun * operation), or 300ns for a 600ns cycle time (for 3.3V operation). 190*4882a593Smuzhiyun * 191*4882a593Smuzhiyun * When configuring memory maps, Card Services appears to adopt the policy 192*4882a593Smuzhiyun * that a memory access time of "0" means "use the default." The default 193*4882a593Smuzhiyun * PCMCIA I/O command width time is 165ns. The default PCMCIA 5V attribute 194*4882a593Smuzhiyun * and memory command width time is 150ns; the PCMCIA 3.3V attribute and 195*4882a593Smuzhiyun * memory command width time is 300ns. 196*4882a593Smuzhiyun */ 197*4882a593Smuzhiyun #define SOC_PCMCIA_IO_ACCESS (165) 198*4882a593Smuzhiyun #define SOC_PCMCIA_5V_MEM_ACCESS (150) 199*4882a593Smuzhiyun #define SOC_PCMCIA_3V_MEM_ACCESS (300) 200*4882a593Smuzhiyun #define SOC_PCMCIA_ATTR_MEM_ACCESS (300) 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun /* 203*4882a593Smuzhiyun * The socket driver actually works nicely in interrupt-driven form, 204*4882a593Smuzhiyun * so the (relatively infrequent) polling is "just to be sure." 205*4882a593Smuzhiyun */ 206*4882a593Smuzhiyun #define SOC_PCMCIA_POLL_PERIOD (2*HZ) 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun /* I/O pins replacing memory pins 210*4882a593Smuzhiyun * (PCMCIA System Architecture, 2nd ed., by Don Anderson, p.75) 211*4882a593Smuzhiyun * 212*4882a593Smuzhiyun * These signals change meaning when going from memory-only to 213*4882a593Smuzhiyun * memory-or-I/O interface: 214*4882a593Smuzhiyun */ 215*4882a593Smuzhiyun #define iostschg bvd1 216*4882a593Smuzhiyun #define iospkr bvd2 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun #endif 219