@ -96,6 +96,18 @@ static int mmc_resource_init(int sdc_no)
static int mmc_set_mod_clk ( struct sunxi_mmc_priv * priv , unsigned int hz )
{
unsigned int pll , pll_hz , div , n , oclk_dly , sclk_dly ;
bool new_mode = false ;
u32 val = 0 ;
if ( IS_ENABLED ( CONFIG_MMC_SUNXI_HAS_NEW_MODE ) & & ( priv - > mmc_no = = 2 ) )
new_mode = true ;
/*
* The MMC clock has an extra / 2 post - divider when operating in the new
* mode .
*/
if ( new_mode )
hz = hz * 2 ;
if ( hz < = 24000000 ) {
pll = CCM_MMC_CTRL_OSCM24 ;
@ -152,9 +164,18 @@ static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz)
# endif
}
writel ( CCM_MMC_CTRL_ENABLE | pll | CCM_MMC_CTRL_SCLK_DLY ( sclk_dly ) |
CCM_MMC_CTRL_N ( n ) | CCM_MMC_CTRL_OCLK_DLY ( oclk_dly ) |
CCM_MMC_CTRL_M ( div ) , priv - > mclkreg ) ;
if ( new_mode ) {
# ifdef CONFIG_MMC_SUNXI_HAS_NEW_MODE
val = CCM_MMC_CTRL_MODE_SEL_NEW ;
setbits_le32 ( & priv - > reg - > ntsr , SUNXI_MMC_NTSR_MODE_SEL_NEW ) ;
# endif
} else {
val = CCM_MMC_CTRL_OCLK_DLY ( oclk_dly ) |
CCM_MMC_CTRL_SCLK_DLY ( sclk_dly ) ;
}
writel ( CCM_MMC_CTRL_ENABLE | pll | CCM_MMC_CTRL_N ( n ) |
CCM_MMC_CTRL_M ( div ) | val , priv - > mclkreg ) ;
debug ( " mmc %u set mod-clk req %u parent %u n %u m %u rate %u \n " ,
priv - > mmc_no , hz , pll_hz , 1u < < n , div , pll_hz / ( 1u < < n ) / div ) ;
@ -498,7 +519,7 @@ struct mmc *sunxi_mmc_init(int sdc_no)
if ( ret )
return NULL ;
return mmc_create ( cfg , mmc_host ) ;
return mmc_create ( cfg , priv ) ;
}
# else