2010-11-07 16:57:12 -05:00
/*
* sdhci - dove . c Support for SDHCI on Marvell ' s Dove SoC
*
* Author : Saeed Bishara < saeed @ marvell . com >
* Mike Rapoport < mike @ compulab . co . il >
* Based on sdhci - cns3xxx . c
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include <linux/io.h>
# include <linux/mmc/host.h>
# include "sdhci-pltfm.h"
static u16 sdhci_dove_readw ( struct sdhci_host * host , int reg )
{
u16 ret ;
switch ( reg ) {
case SDHCI_HOST_VERSION :
case SDHCI_SLOT_INT_STATUS :
/* those registers don't exist */
return 0 ;
default :
ret = readw ( host - > ioaddr + reg ) ;
}
return ret ;
}
static u32 sdhci_dove_readl ( struct sdhci_host * host , int reg )
{
u32 ret ;
switch ( reg ) {
case SDHCI_CAPABILITIES :
ret = readl ( host - > ioaddr + reg ) ;
/* Mask the support for 3.0V */
ret & = ~ SDHCI_CAN_VDD_300 ;
break ;
default :
ret = readl ( host - > ioaddr + reg ) ;
}
return ret ;
}
static struct sdhci_ops sdhci_dove_ops = {
. read_w = sdhci_dove_readw ,
. read_l = sdhci_dove_readl ,
} ;
2011-05-27 23:48:12 +08:00
static struct sdhci_pltfm_data sdhci_dove_pdata = {
2010-11-07 16:57:12 -05:00
. ops = & sdhci_dove_ops ,
. quirks = SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER |
SDHCI_QUIRK_NO_BUSY_IRQ |
SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
SDHCI_QUIRK_FORCE_DMA ,
} ;
2011-05-27 23:48:12 +08:00
static int __devinit sdhci_dove_probe ( struct platform_device * pdev )
{
return sdhci_pltfm_register ( pdev , & sdhci_dove_pdata ) ;
}
static int __devexit sdhci_dove_remove ( struct platform_device * pdev )
{
return sdhci_pltfm_unregister ( pdev ) ;
}
static struct platform_driver sdhci_dove_driver = {
. driver = {
. name = " sdhci-dove " ,
. owner = THIS_MODULE ,
} ,
. probe = sdhci_dove_probe ,
. remove = __devexit_p ( sdhci_dove_remove ) ,
# ifdef CONFIG_PM
. suspend = sdhci_pltfm_suspend ,
. resume = sdhci_pltfm_resume ,
# endif
} ;
static int __init sdhci_dove_init ( void )
{
return platform_driver_register ( & sdhci_dove_driver ) ;
}
module_init ( sdhci_dove_init ) ;
static void __exit sdhci_dove_exit ( void )
{
platform_driver_unregister ( & sdhci_dove_driver ) ;
}
module_exit ( sdhci_dove_exit ) ;
MODULE_DESCRIPTION ( " SDHCI driver for Dove " ) ;
MODULE_AUTHOR ( " Saeed Bishara <saeed@marvell.com>, "
" Mike Rapoport <mike@compulab.co.il> " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;