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