/* * linux/drivers/pcmcia/soc_common.h * * Copyright (C) 2000 John G Dorsey <john+@cs.cmu.edu> * * This file contains definitions for the PCMCIA support code common to * integrated SOCs like the SA-11x0 and PXA2xx microprocessors. */ #ifndef _ASM_ARCH_PCMCIA #define _ASM_ARCH_PCMCIA /* include the world */ #include <linux/cpufreq.h> #include <pcmcia/cs_types.h> #include <pcmcia/cs.h> #include <pcmcia/ss.h> #include <pcmcia/bulkmem.h> #include <pcmcia/cistpl.h> #include "cs_internal.h" struct device; struct pcmcia_low_level; /* * 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 */ struct device *dev; unsigned int nr; unsigned int irq; /* * Core PCMCIA state */ 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_mem; struct resource res_attr; void __iomem *virt_io; unsigned int irq_state; struct timer_list poll_timer; struct list_head node; }; struct pcmcia_state { unsigned detect: 1, ready: 1, bvd1: 1, bvd2: 1, wrprot: 1, vs_3v: 1, vs_Xv: 1; }; 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 }; struct pcmcia_irqs { int sock; int irq; const char *str; }; struct soc_pcmcia_timing { unsigned short io; unsigned short mem; unsigned short attr; }; extern int soc_pcmcia_request_irqs(struct soc_pcmcia_socket *skt, struct pcmcia_irqs *irqs, int nr); extern void soc_pcmcia_free_irqs(struct soc_pcmcia_socket *skt, struct pcmcia_irqs *irqs, int nr); extern void soc_pcmcia_disable_irqs(struct soc_pcmcia_socket *skt, struct pcmcia_irqs *irqs, int nr); extern void soc_pcmcia_enable_irqs(struct soc_pcmcia_socket *skt, struct pcmcia_irqs *irqs, int nr); extern void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *, struct soc_pcmcia_timing *); extern struct list_head soc_pcmcia_sockets; extern struct semaphore soc_pcmcia_sockets_lock; extern int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr); extern int soc_common_drv_pcmcia_remove(struct device *dev); #ifdef DEBUG extern void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func, int lvl, const char *fmt, ...); #define debug(skt, lvl, fmt, arg...) \ soc_pcmcia_debug(skt, __func__, lvl, fmt , ## arg) #else #define debug(skt, lvl, fmt, arg...) do { } while (0) #endif /* * The PC Card Standard, Release 7, section 4.13.4, says that twIORD * has a minimum value of 165ns. Section 4.13.5 says that twIOWR has * a minimum value of 165ns, as well. Section 4.7.2 (describing * common and attribute memory write timing) says that twWE has a * minimum value of 150ns for a 250ns cycle time (for 5V operation; * see section 4.7.4), or 300ns for a 600ns cycle time (for 3.3V * operation, also section 4.7.4). Section 4.7.3 says that taOE * has a maximum value of 150ns for a 300ns cycle time (for 5V * operation), or 300ns for a 600ns cycle time (for 3.3V operation). * * When configuring memory maps, Card Services appears to adopt the policy * that a memory access time of "0" means "use the default." The default * PCMCIA I/O command width time is 165ns. The default PCMCIA 5V attribute * and memory command width time is 150ns; the PCMCIA 3.3V attribute and * memory command width time is 300ns. */ #define SOC_PCMCIA_IO_ACCESS (165) #define SOC_PCMCIA_5V_MEM_ACCESS (150) #define SOC_PCMCIA_3V_MEM_ACCESS (300) #define SOC_PCMCIA_ATTR_MEM_ACCESS (300) /* * The socket driver actually works nicely in interrupt-driven form, * so the (relatively infrequent) polling is "just to be sure." */ #define SOC_PCMCIA_POLL_PERIOD (2*HZ) /* I/O pins replacing memory pins * (PCMCIA System Architecture, 2nd ed., by Don Anderson, p.75) * * These signals change meaning when going from memory-only to * memory-or-I/O interface: */ #define iostschg bvd1 #define iospkr bvd2 #endif