2005-04-17 02:20:36 +04:00
/*
* drivers / pcmcia / sa1100_shannon . c
*
* PCMCIA implementation routines for Shannon
*
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/device.h>
# include <linux/init.h>
2012-06-06 14:42:36 +04:00
# include <linux/io.h>
2005-04-17 02:20:36 +04:00
2008-08-05 19:14:15 +04:00
# include <mach/hardware.h>
2005-04-17 02:20:36 +04:00
# include <asm/mach-types.h>
2008-08-05 19:14:15 +04:00
# include <mach/shannon.h>
2005-04-17 02:20:36 +04:00
# include <asm/irq.h>
# include "sa1100_generic.h"
static int shannon_pcmcia_hw_init ( struct soc_pcmcia_socket * skt )
{
/* All those are inputs */
2012-01-14 03:06:09 +04:00
GAFR & = ~ ( GPIO_GPIO ( SHANNON_GPIO_EJECT_0 ) |
GPIO_GPIO ( SHANNON_GPIO_EJECT_1 ) |
GPIO_GPIO ( SHANNON_GPIO_RDY_0 ) |
GPIO_GPIO ( SHANNON_GPIO_RDY_1 ) ) ;
if ( skt - > nr = = 0 ) {
skt - > stat [ SOC_STAT_CD ] . gpio = SHANNON_GPIO_EJECT_0 ;
skt - > stat [ SOC_STAT_CD ] . name = " PCMCIA_CD_0 " ;
skt - > stat [ SOC_STAT_RDY ] . gpio = SHANNON_GPIO_RDY_0 ;
skt - > stat [ SOC_STAT_RDY ] . name = " PCMCIA_RDY_0 " ;
} else {
skt - > stat [ SOC_STAT_CD ] . gpio = SHANNON_GPIO_EJECT_1 ;
skt - > stat [ SOC_STAT_CD ] . name = " PCMCIA_CD_1 " ;
skt - > stat [ SOC_STAT_RDY ] . gpio = SHANNON_GPIO_RDY_1 ;
skt - > stat [ SOC_STAT_RDY ] . name = " PCMCIA_RDY_1 " ;
}
2005-04-17 02:20:36 +04:00
2012-01-14 03:06:09 +04:00
return 0 ;
2005-04-17 02:20:36 +04:00
}
static void
shannon_pcmcia_socket_state ( struct soc_pcmcia_socket * skt ,
struct pcmcia_state * state )
{
switch ( skt - > nr ) {
case 0 :
state - > bvd1 = 1 ;
state - > bvd2 = 1 ;
state - > vs_3v = 1 ; /* FIXME Can only apply 3.3V on Shannon. */
state - > vs_Xv = 0 ;
break ;
case 1 :
state - > bvd1 = 1 ;
state - > bvd2 = 1 ;
state - > vs_3v = 1 ; /* FIXME Can only apply 3.3V on Shannon. */
state - > vs_Xv = 0 ;
break ;
}
}
static int
shannon_pcmcia_configure_socket ( struct soc_pcmcia_socket * skt ,
const socket_state_t * state )
{
switch ( state - > Vcc ) {
case 0 : /* power off */
2008-05-01 15:34:54 +04:00
printk ( KERN_WARNING " %s(): CS asked for 0V, still applying 3.3V.. \n " , __func__ ) ;
2005-04-17 02:20:36 +04:00
break ;
case 50 :
2008-05-01 15:34:54 +04:00
printk ( KERN_WARNING " %s(): CS asked for 5V, applying 3.3V.. \n " , __func__ ) ;
2005-04-17 02:20:36 +04:00
case 33 :
break ;
default :
printk ( KERN_ERR " %s(): unrecognized Vcc %u \n " ,
2008-05-01 15:34:54 +04:00
__func__ , state - > Vcc ) ;
2005-04-17 02:20:36 +04:00
return - 1 ;
}
2008-05-01 15:34:54 +04:00
printk ( KERN_WARNING " %s(): Warning, Can't perform reset \n " , __func__ ) ;
2005-04-17 02:20:36 +04:00
/* Silently ignore Vpp, output enable, speaker enable. */
return 0 ;
}
static struct pcmcia_low_level shannon_pcmcia_ops = {
. owner = THIS_MODULE ,
. hw_init = shannon_pcmcia_hw_init ,
. socket_state = shannon_pcmcia_socket_state ,
. configure_socket = shannon_pcmcia_configure_socket ,
} ;
2012-11-19 22:23:12 +04:00
int pcmcia_shannon_init ( struct device * dev )
2005-04-17 02:20:36 +04:00
{
int ret = - ENODEV ;
if ( machine_is_shannon ( ) )
ret = sa11xx_drv_pcmcia_probe ( dev , & shannon_pcmcia_ops , 0 , 2 ) ;
return ret ;
}