Hi JJ,

> Subject: Re: [PATCH 1/7] mmc: support hs400 enhanced strobe mode
> 
> Hi Peng,
> 
> On 10/07/2019 09:51, Peng Fan wrote:
> > +#if CONFIG_IS_ENABLED(MMC_HS400_ES_SUPPORT)
> > +#if !CONFIG_IS_ENABLED(DM_MMC)
> > +static void mmc_set_enhanced_strobe(struct mmc *mmc) { } #endif
> > +static int mmc_select_hs400es(struct mmc *mmc) {
> > +   int err;
> > +
> > +   err = mmc_set_card_speed(mmc, MMC_HS, true);
> > +   if (err)
> > +           return err;
> > +
> > +   err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
> EXT_CSD_BUS_WIDTH,
> > +                    EXT_CSD_BUS_WIDTH_8 | EXT_CSD_DDR_FLAG |
> > +                    EXT_CSD_BUS_WIDTH_STROBE);
> > +   if (err) {
> > +           printf("switch to bus width for hs400 failed\n");
> > +           return err;
> > +   }
> > +   /* TODO: driver strength */
> 
> > +   err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
> EXT_CSD_HS_TIMING,
> > +                    EXT_CSD_TIMING_HS400 | (0 <<
> EXT_CSD_DRV_STR_SHIFT));
> 
> you can use mmc_set_card_speed() for this.

Fixed in V2.

> 
> 
> > diff --git a/include/mmc.h b/include/mmc.h index
> > 2be3e91fcb..9eb328384e 100644
> > --- a/include/mmc.h
> > +++ b/include/mmc.h
> > @@ -65,6 +65,7 @@
> >   #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_HS400_ES  MMC_CAP(MMC_HS_400_ES)
> >
> >   #define MMC_CAP_NONREMOVABLE      BIT(14)
> >   #define MMC_CAP_NEEDS_POLL        BIT(15)
> > @@ -223,6 +224,7 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)
> >   #define EXT_CSD_BOOT_BUS_WIDTH            177
> >   #define EXT_CSD_PART_CONF         179     /* R/W */
> >   #define EXT_CSD_BUS_WIDTH         183     /* R/W */
> > +#define EXT_CSD_STROBE_SUPPORT             184     /* R/W */
> >   #define EXT_CSD_HS_TIMING         185     /* R/W */
> >   #define EXT_CSD_REV                       192     /* RO */
> >   #define EXT_CSD_CARD_TYPE         196     /* RO */
> > @@ -264,11 +266,13 @@ static inline bool mmc_is_tuning_cmd(uint
> cmdidx)
> >   #define EXT_CSD_DDR_BUS_WIDTH_4   5       /* Card is in 4 bit DDR
> mode */
> >   #define EXT_CSD_DDR_BUS_WIDTH_8   6       /* Card is in 8 bit DDR
> mode */
> >   #define EXT_CSD_DDR_FLAG  BIT(2)  /* Flag for DDR mode */
> > +#define EXT_CSD_BUS_WIDTH_STROBE BIT(7)    /* Enhanced strobe
> mode */
> >
> >   #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_DRV_STR_SHIFT      4       /* Driver Strength shift */
> >
> >   #define EXT_CSD_BOOT_ACK_ENABLE                   (1 << 6)
> >   #define EXT_CSD_BOOT_PARTITION_ENABLE             (1 << 3)
> > @@ -465,6 +469,11 @@ struct dm_mmc_ops {
> >      */
> >     int (*wait_dat0)(struct udevice *dev, int state, int timeout);
> >   #endif
> > +
> > +#if CONFIG_IS_ENABLED(MMC_HS400_ES_SUPPORT)
> > +   /* set_enhanced_strobe() - set HS400 enhanced strobe */
> > +   void (*set_enhanced_strobe)(struct udevice *dev);
> 
> Can this function somehow fail ? I'd rather have it return a int if so

Fixed in v2.

Thanks,
Peng.

> 
> 
> JJ
> 
> 
> > +#endif
> >   };
> >
> >   #define mmc_get_ops(dev)        ((struct dm_mmc_ops
> *)(dev)->driver->ops)
> > @@ -485,6 +494,7 @@ int mmc_getcd(struct mmc *mmc);
> >   int mmc_getwp(struct mmc *mmc);
> >   int mmc_execute_tuning(struct mmc *mmc, uint opcode);
> >   int mmc_wait_dat0(struct mmc *mmc, int state, int timeout);
> > +void mmc_set_enhanced_strobe(struct mmc *mmc);
> >
> >   #else
> >   struct mmc_ops {
> > @@ -530,6 +540,7 @@ enum bus_mode {
> >     UHS_SDR104,
> >     MMC_HS_200,
> >     MMC_HS_400,
> > +   MMC_HS_400_ES,
> >     MMC_MODES_END
> >   };
> >
> > @@ -547,6 +558,10 @@ static inline bool mmc_is_mode_ddr(enum
> bus_mode mode)
> >   #if CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
> >     else if (mode == MMC_HS_400)
> >             return true;
> > +#endif
> > +#if CONFIG_IS_ENABLED(MMC_HS400_ES_SUPPORT)
> > +   else if (mode == MMC_HS_400_ES)
> > +           return true;
> >   #endif
> >     else
> >             return false;

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

Reply via email to