2005-04-17 02:20:36 +04:00
/*
* drivers / pcmcia / sa1100_cerf . c
*
* PCMCIA implementation routines for CerfBoard
* Based off the Assabet .
*
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/device.h>
# include <linux/init.h>
# include <linux/delay.h>
2012-01-18 16:32:37 +04:00
# include <linux/gpio.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>
# include <asm/irq.h>
2008-08-05 19:14:15 +04:00
# include <mach/cerf.h>
2005-04-17 02:20:36 +04:00
# include "sa1100_generic.h"
# define CERF_SOCKET 1
static int cerf_pcmcia_hw_init ( struct soc_pcmcia_socket * skt )
{
2012-01-18 16:32:37 +04:00
int ret ;
ret = gpio_request_one ( CERF_GPIO_CF_RESET , GPIOF_OUT_INIT_LOW , " CF_RESET " ) ;
if ( ret )
return ret ;
2012-01-14 03:03:57 +04:00
skt - > stat [ SOC_STAT_CD ] . gpio = CERF_GPIO_CF_CD ;
skt - > stat [ SOC_STAT_CD ] . name = " CF_CD " ;
skt - > stat [ SOC_STAT_BVD1 ] . gpio = CERF_GPIO_CF_BVD1 ;
skt - > stat [ SOC_STAT_BVD1 ] . name = " CF_BVD1 " ;
skt - > stat [ SOC_STAT_BVD2 ] . gpio = CERF_GPIO_CF_BVD2 ;
skt - > stat [ SOC_STAT_BVD2 ] . name = " CF_BVD2 " ;
skt - > stat [ SOC_STAT_RDY ] . gpio = CERF_GPIO_CF_IRQ ;
skt - > stat [ SOC_STAT_RDY ] . name = " CF_IRQ " ;
2005-04-17 02:20:36 +04:00
2012-01-14 03:03:57 +04:00
return 0 ;
2005-04-17 02:20:36 +04:00
}
2012-01-18 16:32:37 +04:00
static void cerf_pcmcia_hw_shutdown ( struct soc_pcmcia_socket * skt )
{
gpio_free ( CERF_GPIO_CF_RESET ) ;
}
2005-04-17 02:20:36 +04:00
static void
cerf_pcmcia_socket_state ( struct soc_pcmcia_socket * skt , struct pcmcia_state * state )
{
state - > vs_3v = 1 ;
state - > vs_Xv = 0 ;
}
static int
cerf_pcmcia_configure_socket ( struct soc_pcmcia_socket * skt ,
const socket_state_t * state )
{
switch ( state - > Vcc ) {
case 0 :
case 50 :
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 ;
}
2012-01-18 16:32:37 +04:00
gpio_set_value ( CERF_GPIO_CF_RESET , ! ! ( state - > flags & SS_RESET ) ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
static struct pcmcia_low_level cerf_pcmcia_ops = {
. owner = THIS_MODULE ,
. hw_init = cerf_pcmcia_hw_init ,
2012-01-18 16:32:37 +04:00
. hw_shutdown = cerf_pcmcia_hw_shutdown ,
2005-04-17 02:20:36 +04:00
. socket_state = cerf_pcmcia_socket_state ,
. configure_socket = cerf_pcmcia_configure_socket ,
} ;
2012-11-19 22:23:12 +04:00
int pcmcia_cerf_init ( struct device * dev )
2005-04-17 02:20:36 +04:00
{
int ret = - ENODEV ;
if ( machine_is_cerf ( ) )
ret = sa11xx_drv_pcmcia_probe ( dev , & cerf_pcmcia_ops , CERF_SOCKET , 1 ) ;
return ret ;
}