On Wed, Aug 29, 2018 at 12:35:05PM +0200, Marek Vasut wrote:

> On 08/29/2018 07:32 AM, Peng Fan wrote:
> > Hi,
> 
> Hi,
> 
> > Would anyone pick up this patchset? Tom, I delegated the patchset to you, 
> > would you mind pick it up? 
> 
> I've been nagging Tom about this for a while , he said he will pick it
> for next release, but having it in this one would be IMO fine, since it
> doesn't interfere with anything and it's been posted way before the RC
> cycle started.

Yes, I still intend to pick it up after v2018.09.  Thanks for the
reminder!

> 

> > Thanks,
> > Peng.
> > 
> > -----Original Message-----
> > From: Peng Fan 
> > Sent: 2018年8月10日 14:08
> > To: [email protected]; [email protected]
> > Cc: [email protected]; dl-linux-imx <[email protected]>; Peng Fan 
> > <[email protected]>; Jean-Jacques Hiblot <[email protected]>; Kishon Vijay 
> > Abraham I <[email protected]>; Faiz Abbas <[email protected]>; Marek Vasut 
> > <[email protected]>
> > Subject: [PATCH V4 1/2] mmc: add HS400 support
> > 
> > Add HS400 support.
> > Selecting HS400 needs first select HS200 according to spec, so use a 
> > dedicated function for HS400.
> > Add HS400 related macros.
> > Remove the restriction of only using the low 6 bits of EXT_CSD_CARD_TYPE, 
> > using all the 8 bits.
> > 
> > Signed-off-by: Peng Fan <[email protected]>
> > Cc: Jaehoon Chung <[email protected]>
> > Cc: Jean-Jacques Hiblot <[email protected]>
> > Cc: Stefano Babic <[email protected]>
> > Cc: Kishon Vijay Abraham I <[email protected]>
> > Cc: Faiz Abbas <[email protected]>
> > Cc: Marek Vasut <[email protected]>
> > ---
> > 
> > V4:
> >  Add SPL_MMC_HS400_SUPPORT Kconfig entry  typo fix, HS199->HS200 in commit 
> > log.
> > 
> > V3:
> >  Simplify code
> >  add error msg
> > 
> > V2:
> >  remove 4bits support from HS400, as HS400 does not support 4bits per spec.
> > 
> >  drivers/mmc/Kconfig |  13 +++++
> >  drivers/mmc/mmc.c   | 137 
> > +++++++++++++++++++++++++++++++++++++++++-----------
> >  include/mmc.h       |  11 +++++
> >  3 files changed, 134 insertions(+), 27 deletions(-)
> > 
> > diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index 
> > 377b1c4b3b..1616022b91 100644
> > --- a/drivers/mmc/Kconfig
> > +++ b/drivers/mmc/Kconfig
> > @@ -111,6 +111,19 @@ config SPL_MMC_UHS_SUPPORT
> >       cards. The IO voltage must be switchable from 3.3v to 1.8v. The bus
> >       frequency can go up to 208MHz (SDR104)
> >  
> > +config MMC_HS400_SUPPORT
> > +   bool "enable HS400 support"
> > +   select MMC_HS200_SUPPORT
> > +   help
> > +     The HS400 mode is support by some eMMC. The bus frequency is up to
> > +     200MHz. This mode requires tuning the IO.
> > +
> > +config SPL_MMC_HS400_SUPPORT
> > +   bool "enable HS400 support in SPL"
> > +   help
> > +     The HS400 mode is support by some eMMC. The bus frequency is up to
> > +     200MHz. This mode requires tuning the IO.
> > +
> >  config MMC_HS200_SUPPORT
> >     bool "enable HS200 support"
> >     help
> > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 
> > ad429f49c9..585951cd78 100644
> > --- a/drivers/mmc/mmc.c
> > +++ b/drivers/mmc/mmc.c
> > @@ -147,6 +147,7 @@ const char *mmc_mode_name(enum bus_mode mode)
> >           [MMC_HS_52]       = "MMC High Speed (52MHz)",
> >           [MMC_DDR_52]      = "MMC DDR52 (52MHz)",
> >           [MMC_HS_200]      = "HS200 (200MHz)",
> > +         [MMC_HS_400]      = "HS400 (200MHz)",
> >     };
> >  
> >     if (mode >= MMC_MODES_END)
> > @@ -171,6 +172,7 @@ static uint mmc_mode2freq(struct mmc *mmc, enum 
> > bus_mode mode)
> >           [UHS_DDR50]       = 50000000,
> >           [UHS_SDR104]      = 208000000,
> >           [MMC_HS_200]      = 200000000,
> > +         [MMC_HS_400]      = 200000000,
> >     };
> >  
> >     if (mode == MMC_LEGACY)
> > @@ -769,6 +771,11 @@ static int mmc_set_card_speed(struct mmc *mmc, enum 
> > bus_mode mode)
> >     case MMC_HS_200:
> >             speed_bits = EXT_CSD_TIMING_HS200;
> >             break;
> > +#endif
> > +#if CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
> > +   case MMC_HS_400:
> > +           speed_bits = EXT_CSD_TIMING_HS400;
> > +           break;
> >  #endif
> >     case MMC_LEGACY:
> >             speed_bits = EXT_CSD_TIMING_LEGACY;
> > @@ -816,7 +823,7 @@ static int mmc_get_capabilities(struct mmc *mmc)
> >  
> >     mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
> >  
> > -   cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0x3f;
> > +   cardtype = ext_csd[EXT_CSD_CARD_TYPE];
> >     mmc->cardtype = cardtype;
> >  
> >  #if CONFIG_IS_ENABLED(MMC_HS200_SUPPORT)
> > @@ -824,6 +831,12 @@ static int mmc_get_capabilities(struct mmc *mmc)
> >                     EXT_CSD_CARD_TYPE_HS200_1_8V)) {
> >             mmc->card_caps |= MMC_MODE_HS200;
> >     }
> > +#endif
> > +#if CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
> > +   if (cardtype & (EXT_CSD_CARD_TYPE_HS400_1_2V |
> > +                   EXT_CSD_CARD_TYPE_HS400_1_8V)) {
> > +           mmc->card_caps |= MMC_MODE_HS400;
> > +   }
> >  #endif
> >     if (cardtype & EXT_CSD_CARD_TYPE_52) {
> >             if (cardtype & EXT_CSD_CARD_TYPE_DDR_52) @@ -1734,10 +1747,13 
> > @@ static int mmc_set_lowest_voltage(struct mmc *mmc, enum bus_mode mode,
> >     u32 card_mask = 0;
> >  
> >     switch (mode) {
> > +   case MMC_HS_400:
> >     case MMC_HS_200:
> > -           if (mmc->cardtype & EXT_CSD_CARD_TYPE_HS200_1_8V)
> > +           if (mmc->cardtype & (EXT_CSD_CARD_TYPE_HS200_1_8V |
> > +               EXT_CSD_CARD_TYPE_HS400_1_8V))
> >                     card_mask |= MMC_SIGNAL_VOLTAGE_180;
> > -           if (mmc->cardtype & EXT_CSD_CARD_TYPE_HS200_1_2V)
> > +           if (mmc->cardtype & (EXT_CSD_CARD_TYPE_HS200_1_2V |
> > +               EXT_CSD_CARD_TYPE_HS400_1_2V))
> >                     card_mask |= MMC_SIGNAL_VOLTAGE_120;
> >             break;
> >     case MMC_DDR_52:
> > @@ -1773,6 +1789,13 @@ static inline int mmc_set_lowest_voltage(struct mmc 
> > *mmc, enum bus_mode mode,  #endif
> >  
> >  static const struct mode_width_tuning mmc_modes_by_pref[] = {
> > +#if CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
> > +   {
> > +           .mode = MMC_HS_400,
> > +           .widths = MMC_MODE_8BIT,
> > +           .tuning = MMC_CMD_SEND_TUNING_BLOCK_HS200
> > +   },
> > +#endif
> >  #if CONFIG_IS_ENABLED(MMC_HS200_SUPPORT)
> >     {
> >             .mode = MMC_HS_200,
> > @@ -1816,6 +1839,54 @@ static const struct ext_csd_bus_width {
> >     {MMC_MODE_1BIT, false, EXT_CSD_BUS_WIDTH_1},  };
> >  
> > +#if CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
> > +static int mmc_select_hs400(struct mmc *mmc) {
> > +   int err;
> > +
> > +   /* Set timing to HS200 for tuning */
> > +   err = mmc_set_card_speed(mmc, MMC_HS_200);
> > +   if (err)
> > +           return err;
> > +
> > +   /* configure the bus mode (host) */
> > +   mmc_select_mode(mmc, MMC_HS_200);
> > +   mmc_set_clock(mmc, mmc->tran_speed, false);
> > +
> > +   /* execute tuning if needed */
> > +   err = mmc_execute_tuning(mmc, MMC_CMD_SEND_TUNING_BLOCK_HS200);
> > +   if (err) {
> > +           debug("tuning failed\n");
> > +           return err;
> > +   }
> > +
> > +   /* Set back to HS */
> > +   mmc_set_card_speed(mmc, MMC_HS);
> > +   mmc_set_clock(mmc, mmc_mode2freq(mmc, MMC_HS), false);
> > +
> > +   err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH,
> > +                    EXT_CSD_BUS_WIDTH_8 | EXT_CSD_DDR_FLAG);
> > +   if (err)
> > +           return err;
> > +
> > +   err = mmc_set_card_speed(mmc, MMC_HS_400);
> > +   if (err)
> > +           return err;
> > +
> > +   mmc_select_mode(mmc, MMC_HS_400);
> > +   err = mmc_set_clock(mmc, mmc->tran_speed, false);
> > +   if (err)
> > +           return err;
> > +
> > +   return 0;
> > +}
> > +#else
> > +static int mmc_select_hs400(struct mmc *mmc) {
> > +   return -ENOTSUPP;
> > +}
> > +#endif
> > +
> >  #define for_each_supported_width(caps, ddr, ecbv) \
> >     for (ecbv = ext_csd_bus_width;\
> >         ecbv < ext_csd_bus_width + ARRAY_SIZE(ext_csd_bus_width);\ @@ 
> > -1869,37 +1940,49 @@ static int mmc_select_mode_and_width(struct mmc *mmc, 
> > uint card_caps)
> >                             goto error;
> >                     mmc_set_bus_width(mmc, bus_width(ecbw->cap));
> >  
> > -                   /* configure the bus speed (card) */
> > -                   err = mmc_set_card_speed(mmc, mwt->mode);
> > -                   if (err)
> > -                           goto error;
> > -
> > -                   /*
> > -                    * configure the bus width AND the ddr mode (card)
> > -                    * The host side will be taken care of in the next step
> > -                    */
> > -                   if (ecbw->ext_csd_bits & EXT_CSD_DDR_FLAG) {
> > -                           err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
> > -                                            EXT_CSD_BUS_WIDTH,
> > -                                            ecbw->ext_csd_bits);
> > +                   if (mwt->mode == MMC_HS_400) {
> > +                           err = mmc_select_hs400(mmc);
> > +                           if (err) {
> > +                                   printf("Select HS400 failed %d\n", err);
> > +                                   goto error;
> > +                           }
> > +                   } else {
> > +                           /* configure the bus speed (card) */
> > +                           err = mmc_set_card_speed(mmc, mwt->mode);
> >                             if (err)
> >                                     goto error;
> > -                   }
> >  
> > -                   /* configure the bus mode (host) */
> > -                   mmc_select_mode(mmc, mwt->mode);
> > -                   mmc_set_clock(mmc, mmc->tran_speed, MMC_CLK_ENABLE);
> > +                           /*
> > +                            * configure the bus width AND the ddr mode
> > +                            * (card). The host side will be taken care
> > +                            * of in the next step
> > +                            */
> > +                           if (ecbw->ext_csd_bits & EXT_CSD_DDR_FLAG) {
> > +                                   err = mmc_switch(mmc,
> > +                                                    EXT_CSD_CMD_SET_NORMAL,
> > +                                                    EXT_CSD_BUS_WIDTH,
> > +                                                    ecbw->ext_csd_bits);
> > +                                   if (err)
> > +                                           goto error;
> > +                           }
> > +
> > +                           /* configure the bus mode (host) */
> > +                           mmc_select_mode(mmc, mwt->mode);
> > +                           mmc_set_clock(mmc, mmc->tran_speed,
> > +                                         MMC_CLK_ENABLE);
> >  #ifdef MMC_SUPPORTS_TUNING
> >  
> > -                   /* execute tuning if needed */
> > -                   if (mwt->tuning) {
> > -                           err = mmc_execute_tuning(mmc, mwt->tuning);
> > -                           if (err) {
> > -                                   pr_debug("tuning failed\n");
> > -                                   goto error;
> > +                           /* execute tuning if needed */
> > +                           if (mwt->tuning) {
> > +                                   err = mmc_execute_tuning(mmc,
> > +                                                            mwt->tuning);
> > +                                   if (err) {
> > +                                           pr_debug("tuning failed\n");
> > +                                           goto error;
> > +                                   }
> >                             }
> > -                   }
> >  #endif
> > +                   }
> >  
> >                     /* do a transfer to check the configuration */
> >                     err = mmc_read_and_compare_ext_csd(mmc);
> > diff --git a/include/mmc.h b/include/mmc.h index df4255b828..9b9cbedadc 
> > 100644
> > --- a/include/mmc.h
> > +++ b/include/mmc.h
> > @@ -64,6 +64,7 @@
> >  #define MMC_MODE_HS_52MHz  MMC_CAP(MMC_HS_52)
> >  #define MMC_MODE_DDR_52MHz MMC_CAP(MMC_DDR_52)
> >  #define MMC_MODE_HS200             MMC_CAP(MMC_HS_200)
> > +#define MMC_MODE_HS400             MMC_CAP(MMC_HS_400)
> >  
> >  #define MMC_MODE_8BIT              BIT(30)
> >  #define MMC_MODE_4BIT              BIT(29)
> > @@ -248,6 +249,10 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)
> >                                             /* SDR mode @1.2V I/O */
> >  #define EXT_CSD_CARD_TYPE_HS200            (EXT_CSD_CARD_TYPE_HS200_1_8V | 
> > \
> >                                      EXT_CSD_CARD_TYPE_HS200_1_2V)
> > +#define EXT_CSD_CARD_TYPE_HS400_1_8V       BIT(6)
> > +#define EXT_CSD_CARD_TYPE_HS400_1_2V       BIT(7)
> > +#define EXT_CSD_CARD_TYPE_HS400            (EXT_CSD_CARD_TYPE_HS400_1_8V | 
> > \
> > +                                    EXT_CSD_CARD_TYPE_HS400_1_2V)
> >  
> >  #define EXT_CSD_BUS_WIDTH_1        0       /* Card is in 1 bit mode */
> >  #define EXT_CSD_BUS_WIDTH_4        1       /* Card is in 4 bit mode */
> > @@ -259,6 +264,7 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)
> >  #define EXT_CSD_TIMING_LEGACY      0       /* no high speed */
> >  #define EXT_CSD_TIMING_HS  1       /* HS */
> >  #define EXT_CSD_TIMING_HS200       2       /* HS200 */
> > +#define EXT_CSD_TIMING_HS400       3       /* HS400 */
> >  
> >  #define EXT_CSD_BOOT_ACK_ENABLE                    (1 << 6)
> >  #define EXT_CSD_BOOT_PARTITION_ENABLE              (1 << 3)
> > @@ -519,6 +525,7 @@ enum bus_mode {
> >     UHS_DDR50,
> >     UHS_SDR104,
> >     MMC_HS_200,
> > +   MMC_HS_400,
> >     MMC_MODES_END
> >  };
> >  
> > @@ -532,6 +539,10 @@ static inline bool mmc_is_mode_ddr(enum bus_mode mode) 
> >  #if CONFIG_IS_ENABLED(MMC_UHS_SUPPORT)
> >     else if (mode == UHS_DDR50)
> >             return true;
> > +#endif
> > +#if CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
> > +   else if (mode == MMC_HS_400)
> > +           return true;
> >  #endif
> >     else
> >             return false;
> > --
> > 2.14.1
> > 
> 
> 
> -- 
> Best regards,
> Marek Vasut

-- 
Tom

Attachment: signature.asc
Description: PGP signature

_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to