2019-05-28 19:57:05 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2010-11-08 00:57:12 +03: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
*/
2012-07-05 14:14:01 +04:00
# include <linux/clk.h>
# include <linux/err.h>
2012-11-23 03:55:51 +04:00
# include <linux/io.h>
2010-11-08 00:57:12 +03:00
# include <linux/mmc/host.h>
2012-11-23 03:55:51 +04:00
# include <linux/module.h>
2012-07-31 12:12:59 +04:00
# include <linux/of.h>
2010-11-08 00:57:12 +03:00
# 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 ;
2012-11-23 03:55:51 +04:00
ret = readl ( host - > ioaddr + reg ) ;
2010-11-08 00:57:12 +03:00
switch ( reg ) {
case SDHCI_CAPABILITIES :
/* Mask the support for 3.0V */
ret & = ~ SDHCI_CAN_VDD_300 ;
break ;
}
return ret ;
}
2013-03-13 22:26:05 +04:00
static const struct sdhci_ops sdhci_dove_ops = {
2010-11-08 00:57:12 +03:00
. read_w = sdhci_dove_readw ,
. read_l = sdhci_dove_readl ,
2014-04-25 15:58:55 +04:00
. set_clock = sdhci_set_clock ,
2014-04-25 15:57:07 +04:00
. set_bus_width = sdhci_set_bus_width ,
2014-04-25 15:57:12 +04:00
. reset = sdhci_reset ,
2014-04-25 15:59:26 +04:00
. set_uhs_signaling = sdhci_set_uhs_signaling ,
2010-11-08 00:57:12 +03:00
} ;
2013-03-13 22:26:03 +04:00
static const struct sdhci_pltfm_data sdhci_dove_pdata = {
2010-11-08 00:57:12 +03:00
. ops = & sdhci_dove_ops ,
. quirks = SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER |
SDHCI_QUIRK_NO_BUSY_IRQ |
SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
2012-07-22 03:26:19 +04:00
SDHCI_QUIRK_FORCE_DMA |
SDHCI_QUIRK_NO_HISPD_BIT ,
2010-11-08 00:57:12 +03:00
} ;
2011-05-27 19:48:12 +04:00
2012-11-19 22:23:06 +04:00
static int sdhci_dove_probe ( struct platform_device * pdev )
2011-05-27 19:48:12 +04:00
{
2012-07-05 14:14:01 +04:00
struct sdhci_host * host ;
struct sdhci_pltfm_host * pltfm_host ;
int ret ;
2013-05-30 00:50:05 +04:00
host = sdhci_pltfm_init ( pdev , & sdhci_dove_pdata , 0 ) ;
2014-05-23 02:16:52 +04:00
if ( IS_ERR ( host ) )
return PTR_ERR ( host ) ;
2012-10-30 01:43:07 +04:00
2012-07-05 14:14:01 +04:00
pltfm_host = sdhci_priv ( host ) ;
2015-02-27 10:47:26 +03:00
pltfm_host - > clk = devm_clk_get ( & pdev - > dev , NULL ) ;
2012-07-05 14:14:01 +04:00
2015-02-27 10:47:26 +03:00
if ( ! IS_ERR ( pltfm_host - > clk ) )
clk_prepare_enable ( pltfm_host - > clk ) ;
2012-11-23 03:55:30 +04:00
2014-05-23 02:16:52 +04:00
ret = mmc_of_parse ( host - > mmc ) ;
if ( ret )
goto err_sdhci_add ;
2012-11-23 03:55:30 +04:00
ret = sdhci_add_host ( host ) ;
if ( ret )
goto err_sdhci_add ;
2012-07-05 14:14:01 +04:00
return 0 ;
2012-11-23 03:55:30 +04:00
err_sdhci_add :
2015-02-27 10:47:26 +03:00
clk_disable_unprepare ( pltfm_host - > clk ) ;
2012-11-23 03:55:30 +04:00
sdhci_pltfm_free ( pdev ) ;
2012-07-05 14:14:01 +04:00
return ret ;
2011-05-27 19:48:12 +04:00
}
2012-11-19 22:24:22 +04:00
static const struct of_device_id sdhci_dove_of_match_table [ ] = {
2012-07-31 12:12:59 +04:00
{ . compatible = " marvell,dove-sdhci " , } ,
{ }
} ;
MODULE_DEVICE_TABLE ( of , sdhci_dove_of_match_table ) ;
2011-05-27 19:48:12 +04:00
static struct platform_driver sdhci_dove_driver = {
. driver = {
. name = " sdhci-dove " ,
2020-09-04 02:24:36 +03:00
. probe_type = PROBE_PREFER_ASYNCHRONOUS ,
2016-07-27 14:07:21 +03:00
. pm = & sdhci_pltfm_pmops ,
2014-02-25 13:48:24 +04:00
. of_match_table = sdhci_dove_of_match_table ,
2011-05-27 19:48:12 +04:00
} ,
. probe = sdhci_dove_probe ,
2015-02-27 10:47:31 +03:00
. remove = sdhci_pltfm_unregister ,
2011-05-27 19:48:12 +04:00
} ;
2011-11-26 08:55:43 +04:00
module_platform_driver ( sdhci_dove_driver ) ;
2011-05-27 19:48:12 +04:00
MODULE_DESCRIPTION ( " SDHCI driver for Dove " ) ;
MODULE_AUTHOR ( " Saeed Bishara <saeed@marvell.com>, "
" Mike Rapoport <mike@compulab.co.il> " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;