2005-04-17 02:20:36 +04:00
/*
* 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 - 11 x0 and PXA2xx microprocessors .
*/
# ifndef _ASM_ARCH_PCMCIA
# define _ASM_ARCH_PCMCIA
/* include the world */
2010-11-22 17:48:49 +03:00
# include <linux/clk.h>
2005-04-17 02:20:36 +04:00
# include <linux/cpufreq.h>
# include <pcmcia/ss.h>
# include <pcmcia/cistpl.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
*/
unsigned int nr ;
2010-11-22 17:48:49 +03:00
struct clk * clk ;
2005-04-17 02:20:36 +04:00
/*
* Core PCMCIA state
*/
2009-03-30 01:14:32 +04:00
const struct pcmcia_low_level * ops ;
2005-04-17 02:20:36 +04:00
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 ;
2011-12-20 02:00:22 +04:00
struct {
int gpio ;
unsigned int irq ;
const char * name ;
} stat [ 4 ] ;
# define SOC_STAT_CD 0 /* Card detect */
# define SOC_STAT_BVD1 1 /* BATDEAD / IOSTSCHG */
# define SOC_STAT_BVD2 2 /* BATWARN / IOSPKR */
# define SOC_STAT_RDY 3 /* Ready / Interrupt */
2005-04-17 02:20:36 +04:00
unsigned int irq_state ;
struct timer_list poll_timer ;
struct list_head node ;
} ;
2009-01-19 12:34:27 +03:00
struct skt_dev_info {
int nskt ;
2010-11-22 17:48:49 +03:00
struct clk * clk ;
2009-01-19 12:34:27 +03:00
struct soc_pcmcia_socket skt [ 0 ] ;
} ;
2005-04-17 02:20:36 +04:00
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 soc_pcmcia_timing {
unsigned short io ;
unsigned short mem ;
unsigned short attr ;
} ;
extern void soc_common_pcmcia_get_timing ( struct soc_pcmcia_socket * , struct soc_pcmcia_timing * ) ;
2011-12-19 18:07:31 +04:00
void soc_pcmcia_init_one ( struct soc_pcmcia_socket * skt ,
struct pcmcia_low_level * ops , struct device * dev ) ;
2009-03-27 00:45:05 +03:00
void soc_pcmcia_remove_one ( struct soc_pcmcia_socket * skt ) ;
int soc_pcmcia_add_one ( struct soc_pcmcia_socket * skt ) ;
2005-04-17 02:20:36 +04:00
2008-08-02 23:02:01 +04:00
# ifdef CONFIG_PCMCIA_DEBUG
2005-04-17 02:20:36 +04:00
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 165 ns . Section 4.13 .5 says that twIOWR has
* a minimum value of 165 ns , as well . Section 4.7 .2 ( describing
* common and attribute memory write timing ) says that twWE has a
* minimum value of 150 ns for a 250 ns cycle time ( for 5 V operation ;
* see section 4.7 .4 ) , or 300 ns for a 600 ns cycle time ( for 3.3 V
* operation , also section 4.7 .4 ) . Section 4.7 .3 says that taOE
* has a maximum value of 150 ns for a 300 ns cycle time ( for 5 V
* operation ) , or 300 ns for a 600 ns cycle time ( for 3.3 V 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 165 ns . The default PCMCIA 5 V attribute
* and memory command width time is 150 ns ; the PCMCIA 3.3 V attribute and
* memory command width time is 300 ns .
*/
# 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 , 2 nd 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