Hi, On 08/23/2017 07:03 PM, Maxime Ripard wrote: > Almost all of the newer Allwinner SoCs have a new operating mode for the > eMMC clocks that needs to be enabled in both the clock and the MMC > controller. > > Details about that mode are sparse, and the name itself (new mode vs old > mode) doesn't give much details, but it seems that the it changes the > sampling of the MMC clock. One side effect is also that it divides the > parent clock rate by 2. > > Add support for it through a Kconfig option.
Well, i don't know exactly what mode likes your mention.. I think it can be got from dt if it's provided from controller IP or SoC. how about? Best Regards, Jaehoon Chung > > Signed-off-by: Maxime Ripard <maxime.rip...@free-electrons.com> > > --- > Changes from v1: > - Switched to IS_ENABLED when possible > - Added some defines > - Tried to put more details in the commit log > - Added a depends on in the Kconfig option > --- > arch/arm/include/asm/arch-sunxi/clock_sun8i_a83t.h | 1 + > arch/arm/include/asm/arch-sunxi/mmc.h | 11 ++++++--- > drivers/mmc/Kconfig | 4 ++++ > drivers/mmc/sunxi_mmc.c | 27 > +++++++++++++++++++--- > 4 files changed, 37 insertions(+), 6 deletions(-) > > diff --git a/arch/arm/include/asm/arch-sunxi/clock_sun8i_a83t.h > b/arch/arm/include/asm/arch-sunxi/clock_sun8i_a83t.h > index 5e1346e5242a..5dfcbf3b017b 100644 > --- a/arch/arm/include/asm/arch-sunxi/clock_sun8i_a83t.h > +++ b/arch/arm/include/asm/arch-sunxi/clock_sun8i_a83t.h > @@ -220,6 +220,7 @@ struct sunxi_ccm_reg { > #define CCM_MMC_CTRL_SCLK_DLY(x) ((x) << 20) > #define CCM_MMC_CTRL_OSCM24 (0x0 << 24) > #define CCM_MMC_CTRL_PLL6 (0x1 << 24) > +#define CCM_MMC_CTRL_MODE_SEL_NEW (0x1 << 30) > #define CCM_MMC_CTRL_ENABLE (0x1 << 31) > > #define CCM_USB_CTRL_PHY0_RST (0x1 << 0) > diff --git a/arch/arm/include/asm/arch-sunxi/mmc.h > b/arch/arm/include/asm/arch-sunxi/mmc.h > index cb52e648731c..69f737f3bffc 100644 > --- a/arch/arm/include/asm/arch-sunxi/mmc.h > +++ b/arch/arm/include/asm/arch-sunxi/mmc.h > @@ -35,16 +35,19 @@ struct sunxi_mmc { > u32 cbcr; /* 0x48 CIU byte count */ > u32 bbcr; /* 0x4c BIU byte count */ > u32 dbgc; /* 0x50 debug enable */ > - u32 res0[11]; > + u32 res0; /* 0x54 reserved */ > + u32 a12a; /* 0x58 Auto command 12 argument */ > + u32 ntsr; /* 0x5c New timing set register */ > + u32 res1[8]; > u32 dmac; /* 0x80 internal DMA control */ > u32 dlba; /* 0x84 internal DMA descr list base address */ > u32 idst; /* 0x88 internal DMA status */ > u32 idie; /* 0x8c internal DMA interrupt enable */ > u32 chda; /* 0x90 */ > u32 cbda; /* 0x94 */ > - u32 res1[26]; > + u32 res2[26]; > #ifdef CONFIG_SUNXI_GEN_SUN6I > - u32 res2[64]; > + u32 res3[64]; > #endif > u32 fifo; /* 0x100 / 0x200 FIFO access address */ > }; > @@ -116,6 +119,8 @@ struct sunxi_mmc { > #define SUNXI_MMC_STATUS_CARD_DATA_BUSY (0x1 << 9) > #define SUNXI_MMC_STATUS_DATA_FSM_BUSY (0x1 << 10) > > +#define SUNXI_MMC_NTSR_MODE_SEL_NEW (0x1 << 31) > + > #define SUNXI_MMC_IDMAC_RESET (0x1 << 0) > #define SUNXI_MMC_IDMAC_FIXBURST (0x1 << 1) > #define SUNXI_MMC_IDMAC_ENABLE (0x1 << 7) > diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig > index 51a87cdd77dc..9075b346036b 100644 > --- a/drivers/mmc/Kconfig > +++ b/drivers/mmc/Kconfig > @@ -389,6 +389,10 @@ config MMC_SUNXI > This selects support for the SD/MMC Host Controller on > Allwinner sunxi SoCs. > > +config MMC_SUNXI_HAS_NEW_MODE > + bool > + depends on MMC_SUNXI > + > config GENERIC_ATMEL_MCI > bool "Atmel Multimedia Card Interface support" > depends on DM_MMC && BLK && DM_MMC_OPS && ARCH_AT91 > diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c > index 588574fab6a9..bc638ae2e64a 100644 > --- a/drivers/mmc/sunxi_mmc.c > +++ b/drivers/mmc/sunxi_mmc.c > @@ -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; > + writel(SUNXI_MMC_NTSR_MODE_SEL_NEW, &priv->reg->ntsr); > +#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); > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot