18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * linux/drivers/pcmcia/soc_common.h
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2000 John G Dorsey <john+@cs.cmu.edu>
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * This file contains definitions for the PCMCIA support code common to
88c2ecf20Sopenharmony_ci * integrated SOCs like the SA-11x0 and PXA2xx microprocessors.
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci#ifndef _ASM_ARCH_PCMCIA
118c2ecf20Sopenharmony_ci#define _ASM_ARCH_PCMCIA
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci/* include the world */
148c2ecf20Sopenharmony_ci#include <linux/clk.h>
158c2ecf20Sopenharmony_ci#include <linux/cpufreq.h>
168c2ecf20Sopenharmony_ci#include <pcmcia/ss.h>
178c2ecf20Sopenharmony_ci#include <pcmcia/cistpl.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistruct device;
218c2ecf20Sopenharmony_cistruct gpio_desc;
228c2ecf20Sopenharmony_cistruct pcmcia_low_level;
238c2ecf20Sopenharmony_cistruct regulator;
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cistruct soc_pcmcia_regulator {
268c2ecf20Sopenharmony_ci	struct regulator	*reg;
278c2ecf20Sopenharmony_ci	bool			on;
288c2ecf20Sopenharmony_ci};
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci/*
318c2ecf20Sopenharmony_ci * This structure encapsulates per-socket state which we might need to
328c2ecf20Sopenharmony_ci * use when responding to a Card Services query of some kind.
338c2ecf20Sopenharmony_ci */
348c2ecf20Sopenharmony_cistruct soc_pcmcia_socket {
358c2ecf20Sopenharmony_ci	struct pcmcia_socket	socket;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	/*
388c2ecf20Sopenharmony_ci	 * Info from low level handler
398c2ecf20Sopenharmony_ci	 */
408c2ecf20Sopenharmony_ci	unsigned int		nr;
418c2ecf20Sopenharmony_ci	struct clk		*clk;
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	/*
448c2ecf20Sopenharmony_ci	 * Core PCMCIA state
458c2ecf20Sopenharmony_ci	 */
468c2ecf20Sopenharmony_ci	const struct pcmcia_low_level *ops;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	unsigned int		status;
498c2ecf20Sopenharmony_ci	socket_state_t		cs_state;
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	unsigned short		spd_io[MAX_IO_WIN];
528c2ecf20Sopenharmony_ci	unsigned short		spd_mem[MAX_WIN];
538c2ecf20Sopenharmony_ci	unsigned short		spd_attr[MAX_WIN];
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	struct resource		res_skt;
568c2ecf20Sopenharmony_ci	struct resource		res_io;
578c2ecf20Sopenharmony_ci	struct resource		res_mem;
588c2ecf20Sopenharmony_ci	struct resource		res_attr;
598c2ecf20Sopenharmony_ci	void __iomem		*virt_io;
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	struct {
628c2ecf20Sopenharmony_ci		int		gpio;
638c2ecf20Sopenharmony_ci		struct gpio_desc *desc;
648c2ecf20Sopenharmony_ci		unsigned int	irq;
658c2ecf20Sopenharmony_ci		const char	*name;
668c2ecf20Sopenharmony_ci	} stat[6];
678c2ecf20Sopenharmony_ci#define SOC_STAT_CD		0	/* Card detect */
688c2ecf20Sopenharmony_ci#define SOC_STAT_BVD1		1	/* BATDEAD / IOSTSCHG */
698c2ecf20Sopenharmony_ci#define SOC_STAT_BVD2		2	/* BATWARN / IOSPKR */
708c2ecf20Sopenharmony_ci#define SOC_STAT_RDY		3	/* Ready / Interrupt */
718c2ecf20Sopenharmony_ci#define SOC_STAT_VS1		4	/* Voltage sense 1 */
728c2ecf20Sopenharmony_ci#define SOC_STAT_VS2		5	/* Voltage sense 2 */
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci	struct gpio_desc	*gpio_reset;
758c2ecf20Sopenharmony_ci	struct gpio_desc	*gpio_bus_enable;
768c2ecf20Sopenharmony_ci	struct soc_pcmcia_regulator vcc;
778c2ecf20Sopenharmony_ci	struct soc_pcmcia_regulator vpp;
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	unsigned int		irq_state;
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_FREQ
828c2ecf20Sopenharmony_ci	struct notifier_block	cpufreq_nb;
838c2ecf20Sopenharmony_ci#endif
848c2ecf20Sopenharmony_ci	struct timer_list	poll_timer;
858c2ecf20Sopenharmony_ci	struct list_head	node;
868c2ecf20Sopenharmony_ci	void *driver_data;
878c2ecf20Sopenharmony_ci};
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_cistruct skt_dev_info {
908c2ecf20Sopenharmony_ci	int nskt;
918c2ecf20Sopenharmony_ci	struct soc_pcmcia_socket skt[];
928c2ecf20Sopenharmony_ci};
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_cistruct pcmcia_state {
958c2ecf20Sopenharmony_ci  unsigned detect: 1,
968c2ecf20Sopenharmony_ci            ready: 1,
978c2ecf20Sopenharmony_ci             bvd1: 1,
988c2ecf20Sopenharmony_ci             bvd2: 1,
998c2ecf20Sopenharmony_ci           wrprot: 1,
1008c2ecf20Sopenharmony_ci            vs_3v: 1,
1018c2ecf20Sopenharmony_ci            vs_Xv: 1;
1028c2ecf20Sopenharmony_ci};
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_cistruct pcmcia_low_level {
1058c2ecf20Sopenharmony_ci	struct module *owner;
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci	/* first socket in system */
1088c2ecf20Sopenharmony_ci	int first;
1098c2ecf20Sopenharmony_ci	/* nr of sockets */
1108c2ecf20Sopenharmony_ci	int nr;
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci	int (*hw_init)(struct soc_pcmcia_socket *);
1138c2ecf20Sopenharmony_ci	void (*hw_shutdown)(struct soc_pcmcia_socket *);
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci	void (*socket_state)(struct soc_pcmcia_socket *, struct pcmcia_state *);
1168c2ecf20Sopenharmony_ci	int (*configure_socket)(struct soc_pcmcia_socket *, const socket_state_t *);
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	/*
1198c2ecf20Sopenharmony_ci	 * Enable card status IRQs on (re-)initialisation.  This can
1208c2ecf20Sopenharmony_ci	 * be called at initialisation, power management event, or
1218c2ecf20Sopenharmony_ci	 * pcmcia event.
1228c2ecf20Sopenharmony_ci	 */
1238c2ecf20Sopenharmony_ci	void (*socket_init)(struct soc_pcmcia_socket *);
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	/*
1268c2ecf20Sopenharmony_ci	 * Disable card status IRQs and PCMCIA bus on suspend.
1278c2ecf20Sopenharmony_ci	 */
1288c2ecf20Sopenharmony_ci	void (*socket_suspend)(struct soc_pcmcia_socket *);
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ci	/*
1318c2ecf20Sopenharmony_ci	 * Hardware specific timing routines.
1328c2ecf20Sopenharmony_ci	 * If provided, the get_timing routine overrides the SOC default.
1338c2ecf20Sopenharmony_ci	 */
1348c2ecf20Sopenharmony_ci	unsigned int (*get_timing)(struct soc_pcmcia_socket *, unsigned int, unsigned int);
1358c2ecf20Sopenharmony_ci	int (*set_timing)(struct soc_pcmcia_socket *);
1368c2ecf20Sopenharmony_ci	int (*show_timing)(struct soc_pcmcia_socket *, char *);
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_FREQ
1398c2ecf20Sopenharmony_ci	/*
1408c2ecf20Sopenharmony_ci	 * CPUFREQ support.
1418c2ecf20Sopenharmony_ci	 */
1428c2ecf20Sopenharmony_ci	int (*frequency_change)(struct soc_pcmcia_socket *, unsigned long, struct cpufreq_freqs *);
1438c2ecf20Sopenharmony_ci#endif
1448c2ecf20Sopenharmony_ci};
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_cistruct soc_pcmcia_timing {
1488c2ecf20Sopenharmony_ci	unsigned short io;
1498c2ecf20Sopenharmony_ci	unsigned short mem;
1508c2ecf20Sopenharmony_ci	unsigned short attr;
1518c2ecf20Sopenharmony_ci};
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ciextern void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *, struct soc_pcmcia_timing *);
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_civoid soc_pcmcia_init_one(struct soc_pcmcia_socket *skt,
1568c2ecf20Sopenharmony_ci	const struct pcmcia_low_level *ops, struct device *dev);
1578c2ecf20Sopenharmony_civoid soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt);
1588c2ecf20Sopenharmony_ciint soc_pcmcia_add_one(struct soc_pcmcia_socket *skt);
1598c2ecf20Sopenharmony_ciint soc_pcmcia_request_gpiods(struct soc_pcmcia_socket *skt);
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_civoid soc_common_cf_socket_state(struct soc_pcmcia_socket *skt,
1628c2ecf20Sopenharmony_ci	struct pcmcia_state *state);
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ciint soc_pcmcia_regulator_set(struct soc_pcmcia_socket *skt,
1658c2ecf20Sopenharmony_ci	struct soc_pcmcia_regulator *r, int v);
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci#ifdef CONFIG_PCMCIA_DEBUG
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_ciextern void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func,
1708c2ecf20Sopenharmony_ci			     int lvl, const char *fmt, ...);
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ci#define debug(skt, lvl, fmt, arg...) \
1738c2ecf20Sopenharmony_ci	soc_pcmcia_debug(skt, __func__, lvl, fmt , ## arg)
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci#else
1768c2ecf20Sopenharmony_ci#define debug(skt, lvl, fmt, arg...) do { } while (0)
1778c2ecf20Sopenharmony_ci#endif
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ci/*
1818c2ecf20Sopenharmony_ci * The PC Card Standard, Release 7, section 4.13.4, says that twIORD
1828c2ecf20Sopenharmony_ci * has a minimum value of 165ns. Section 4.13.5 says that twIOWR has
1838c2ecf20Sopenharmony_ci * a minimum value of 165ns, as well. Section 4.7.2 (describing
1848c2ecf20Sopenharmony_ci * common and attribute memory write timing) says that twWE has a
1858c2ecf20Sopenharmony_ci * minimum value of 150ns for a 250ns cycle time (for 5V operation;
1868c2ecf20Sopenharmony_ci * see section 4.7.4), or 300ns for a 600ns cycle time (for 3.3V
1878c2ecf20Sopenharmony_ci * operation, also section 4.7.4). Section 4.7.3 says that taOE
1888c2ecf20Sopenharmony_ci * has a maximum value of 150ns for a 300ns cycle time (for 5V
1898c2ecf20Sopenharmony_ci * operation), or 300ns for a 600ns cycle time (for 3.3V operation).
1908c2ecf20Sopenharmony_ci *
1918c2ecf20Sopenharmony_ci * When configuring memory maps, Card Services appears to adopt the policy
1928c2ecf20Sopenharmony_ci * that a memory access time of "0" means "use the default." The default
1938c2ecf20Sopenharmony_ci * PCMCIA I/O command width time is 165ns. The default PCMCIA 5V attribute
1948c2ecf20Sopenharmony_ci * and memory command width time is 150ns; the PCMCIA 3.3V attribute and
1958c2ecf20Sopenharmony_ci * memory command width time is 300ns.
1968c2ecf20Sopenharmony_ci */
1978c2ecf20Sopenharmony_ci#define SOC_PCMCIA_IO_ACCESS		(165)
1988c2ecf20Sopenharmony_ci#define SOC_PCMCIA_5V_MEM_ACCESS	(150)
1998c2ecf20Sopenharmony_ci#define SOC_PCMCIA_3V_MEM_ACCESS	(300)
2008c2ecf20Sopenharmony_ci#define SOC_PCMCIA_ATTR_MEM_ACCESS	(300)
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ci/*
2038c2ecf20Sopenharmony_ci * The socket driver actually works nicely in interrupt-driven form,
2048c2ecf20Sopenharmony_ci * so the (relatively infrequent) polling is "just to be sure."
2058c2ecf20Sopenharmony_ci */
2068c2ecf20Sopenharmony_ci#define SOC_PCMCIA_POLL_PERIOD    (2*HZ)
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_ci/* I/O pins replacing memory pins
2108c2ecf20Sopenharmony_ci * (PCMCIA System Architecture, 2nd ed., by Don Anderson, p.75)
2118c2ecf20Sopenharmony_ci *
2128c2ecf20Sopenharmony_ci * These signals change meaning when going from memory-only to
2138c2ecf20Sopenharmony_ci * memory-or-I/O interface:
2148c2ecf20Sopenharmony_ci */
2158c2ecf20Sopenharmony_ci#define iostschg bvd1
2168c2ecf20Sopenharmony_ci#define iospkr   bvd2
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci#endif
219