[U-Boot] [PATCH v2 1/2] mmc: sunxi: Support new mode

Jaehoon Chung jh80.chung at samsung.com
Wed Aug 23 11:14:53 UTC 2017


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.ripard at 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);
> 



More information about the U-Boot mailing list