xref: /OK3568_Linux_fs/kernel/drivers/pcmcia/soc_common.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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