于 2018年7月24日 GMT+08:00 下午4:37:43, Maxime Ripard <maxime.rip...@bootlin.com> 写到:
>On Sat, Jul 21, 2018 at 04:20:29PM +0800, Icenowy Zheng wrote:
>> The Allwinner H6 SoC has 3 MMC controllers like the ones in A64, with
>> the MMC2 come with the capability to do crypto by EMCE.
>> 
>> Add MMC support for H6. EMCE support is not added yet.
>> 
>> Signed-off-by: Icenowy Zheng <icen...@aosc.io>
>> ---
>>  arch/arm/include/asm/arch-sunxi/mmc.h |  2 +-
>>  board/sunxi/board.c                   |  7 +++++++
>>  drivers/mmc/sunxi_mmc.c               | 13 ++++++++++++-
>>  3 files changed, 20 insertions(+), 2 deletions(-)
>> 
>> diff --git a/arch/arm/include/asm/arch-sunxi/mmc.h
>b/arch/arm/include/asm/arch-sunxi/mmc.h
>> index 1574b8e8fe..d98c53faaa 100644
>> --- a/arch/arm/include/asm/arch-sunxi/mmc.h
>> +++ b/arch/arm/include/asm/arch-sunxi/mmc.h
>> @@ -45,7 +45,7 @@ struct sunxi_mmc {
>>      u32 chda;               /* 0x90 */
>>      u32 cbda;               /* 0x94 */
>>      u32 res2[26];
>> -#ifdef CONFIG_SUNXI_GEN_SUN6I
>> +#if defined(CONFIG_SUNXI_GEN_SUN6I) ||
>defined(CONFIG_MACH_SUN50I_H6)
>>      u32 res3[64];
>>  #endif
>>      u32 fifo;               /* 0x100 / 0x200 FIFO access address */
>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>> index 5ed1b8bae1..857d5ff010 100644
>> --- a/board/sunxi/board.c
>> +++ b/board/sunxi/board.c
>> @@ -443,6 +443,13 @@ static void mmc_pinmux_setup(int sdc)
>>                      sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP);
>>                      sunxi_gpio_set_drv(pin, 2);
>>              }
>> +#elif defined(CONFIG_MACH_SUN50I_H6)
>> +            /* SDC2: PC4-PC14 */
>> +            for (pin = SUNXI_GPC(4); pin <= SUNXI_GPC(14); pin++) {
>> +                    sunxi_gpio_set_cfgpin(pin, SUNXI_GPC_SDC2);
>> +                    sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP);
>> +                    sunxi_gpio_set_drv(pin, 2);
>> +            }
>>  #elif defined(CONFIG_MACH_SUN9I)
>>              /* SDC2: PC6-PC16 */
>>              for (pin = SUNXI_GPC(6); pin <= SUNXI_GPC(16); pin++) {
>> diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
>> index 7fa1ae8b16..39f15eb423 100644
>> --- a/drivers/mmc/sunxi_mmc.c
>> +++ b/drivers/mmc/sunxi_mmc.c
>> @@ -70,10 +70,12 @@ static int mmc_resource_init(int sdc_no)
>>              priv->reg = (struct sunxi_mmc *)SUNXI_MMC2_BASE;
>>              priv->mclkreg = &ccm->sd2_clk_cfg;
>>              break;
>> +#ifdef SUNXI_MMC3_BASE
>>      case 3:
>>              priv->reg = (struct sunxi_mmc *)SUNXI_MMC3_BASE;
>>              priv->mclkreg = &ccm->sd3_clk_cfg;
>>              break;
>> +#endif
>>      default:
>>              printf("Wrong mmc number %d\n", sdc_no);
>>              return -1;
>> @@ -116,6 +118,9 @@ static int mmc_set_mod_clk(struct sunxi_mmc_priv
>*priv, unsigned int hz)
>>  #ifdef CONFIG_MACH_SUN9I
>>              pll = CCM_MMC_CTRL_PLL_PERIPH0;
>>              pll_hz = clock_get_pll4_periph0();
>> +#elif defined(CONFIG_MACH_SUN50I_H6)
>> +            pll = CCM_MMC_CTRL_PLL6X2;
>> +            pll_hz = clock_get_pll6() * 2;
>>  #else
>>              pll = CCM_MMC_CTRL_PLL6;
>>              pll_hz = clock_get_pll6();
>> @@ -494,7 +499,7 @@ struct mmc *sunxi_mmc_init(int sdc_no)
>>  
>>      cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
>>      cfg->host_caps = MMC_MODE_4BIT;
>> -#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN8I)
>> +#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN8I) ||
>defined(CONFIG_MACH_SUN50I_H6)
>>      if (sdc_no == 2)
>>              cfg->host_caps = MMC_MODE_8BIT;
>>  #endif
>> @@ -509,6 +514,7 @@ struct mmc *sunxi_mmc_init(int sdc_no)
>>  
>>      /* config ahb clock */
>>      debug("init mmc %d clock and io\n", sdc_no);
>> +#if !defined(CONFIG_MACH_SUN50I_H6)
>>      setbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_MMC(sdc_no));
>>  
>>  #ifdef CONFIG_SUNXI_GEN_SUN6I
>> @@ -519,6 +525,11 @@ struct mmc *sunxi_mmc_init(int sdc_no)
>>      /* sun9i has a mmc-common module, also set the gate and reset there
>*/
>>      writel(SUNXI_MMC_COMMON_CLK_GATE | SUNXI_MMC_COMMON_RESET,
>>             SUNXI_MMC_COMMON_BASE + 4 * sdc_no);
>> +#endif
>> +#else /* CONFIG_MACH_SUN50I_H6 */
>> +    setbits_le32(&ccm->sd_gate_reset, 1 << sdc_no);
>> +    /* unassert reset */
>> +    setbits_le32(&ccm->sd_gate_reset, 1 << (RESET_SHIFT + sdc_no));
>>  #endif
>>      ret = mmc_set_mod_clk(priv, 24000000);
>>      if (ret)
>
>You should use the DM instead.

Then we still need the DM-less ver for SPL.

>
>Maxime
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to