Message ID | 1616410538-2601-2-git-send-email-haibo.chen@nxp.com |
---|---|
State | Accepted |
Commit | 8974ff1a60365dedf1192632f5e0c21680d49dbc |
Delegated to: | Stefano Babic |
Headers | show |
Series | [1/2] mmc: fsl_esdhc_imx: remove redundant cmd11 related code. | expand |
Hi Haibo, On Mon, Mar 22, 2021 at 8:09 AM <haibo.chen@nxp.com> wrote: > --- a/arch/arm/dts/imx8mm-evk-u-boot.dtsi > +++ b/arch/arm/dts/imx8mm-evk-u-boot.dtsi > @@ -102,6 +102,7 @@ > u-boot,dm-spl; > sd-uhs-sdr104; > sd-uhs-ddr50; > + fsl,signal-voltage-switch-extra-delay-ms = <8>; How does the Linux kernel deal with that? I don't see such property in the mainline kernel or in the NXP tree. I am concerned that we add a U-Boot specific here. Also, the fact that common code waits 10ms is a driver implementation detail, so not happy that such information needs to be passed in the U-Boot dts.
On 3/22/21 8:04 AM, Fabio Estevam wrote: > Hi Haibo, > > On Mon, Mar 22, 2021 at 8:09 AM <haibo.chen@nxp.com> wrote: > >> --- a/arch/arm/dts/imx8mm-evk-u-boot.dtsi >> +++ b/arch/arm/dts/imx8mm-evk-u-boot.dtsi >> @@ -102,6 +102,7 @@ >> u-boot,dm-spl; >> sd-uhs-sdr104; >> sd-uhs-ddr50; >> + fsl,signal-voltage-switch-extra-delay-ms = <8>; > > How does the Linux kernel deal with that? > > I don't see such property in the mainline kernel or in the NXP tree. > > I am concerned that we add a U-Boot specific here. Also, the fact that > common code waits 10ms is a driver implementation detail, so not happy > that such information needs to be passed in the U-Boot dts. > Typically they wait in the regulator. E.g. regulator-ramp-delay or regulator-settling-time-us. There should be no need to wait in the MMC driver. --Sean
> From: Haibo Chen <haibo.chen@nxp.com> > Some board like imx8mm-evkb, IO voltage switch from 3.3v to 1.8v need > around 18ms, common code only delay 10ms, so need to delay extra 8ms. > Otherwise voltage switch will timeout when wait for data0 line. > This IO voltage switch time depends on board design, depend on the > PMIC and capacitance. imx8mm-evkb board use PCA9450(PMIC) and 10uF > capacitance. > Signed-off-by: Haibo Chen <haibo.chen@nxp.com> Applied to u-boot-imx, master, thanks ! Best regards, Stefano Babic
diff --git a/arch/arm/dts/imx8mm-evk-u-boot.dtsi b/arch/arm/dts/imx8mm-evk-u-boot.dtsi index e843a5648e..bccf4fe947 100644 --- a/arch/arm/dts/imx8mm-evk-u-boot.dtsi +++ b/arch/arm/dts/imx8mm-evk-u-boot.dtsi @@ -102,6 +102,7 @@ u-boot,dm-spl; sd-uhs-sdr104; sd-uhs-ddr50; + fsl,signal-voltage-switch-extra-delay-ms = <8>; }; &usdhc3 { diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c index 722f33c68c..ef2b71e6b7 100644 --- a/drivers/mmc/fsl_esdhc_imx.c +++ b/drivers/mmc/fsl_esdhc_imx.c @@ -146,6 +146,7 @@ struct esdhc_soc_data { * @start_tuning_tap: the start point for tuning in tuning_ctrl register * @strobe_dll_delay_target: settings in strobe_dllctrl * @signal_voltage: indicating the current voltage + * @signal_voltage_switch_extra_delay_ms: extra delay for IO voltage switch * @cd_gpio: gpio for card detection * @wp_gpio: gpio for write protection */ @@ -170,6 +171,7 @@ struct fsl_esdhc_priv { u32 tuning_start_tap; u32 strobe_dll_delay_target; u32 signal_voltage; + u32 signal_voltage_switch_extra_delay_ms; #if CONFIG_IS_ENABLED(DM_REGULATOR) struct udevice *vqmmc_dev; struct udevice *vmmc_dev; @@ -836,6 +838,14 @@ static int esdhc_set_voltage(struct mmc *mmc) } #endif esdhc_setbits32(®s->vendorspec, ESDHC_VENDORSPEC_VSELECT); + /* + * some board like imx8mm-evk need about 18ms to switch + * the IO voltage from 3.3v to 1.8v, common code only + * delay 10ms, so need to delay extra time to make sure + * the IO voltage change to 1.8v. + */ + if (priv->signal_voltage_switch_extra_delay_ms) + mdelay(priv->signal_voltage_switch_extra_delay_ms); if (esdhc_read32(®s->vendorspec) & ESDHC_VENDORSPEC_VSELECT) return 0; @@ -1450,6 +1460,8 @@ static int fsl_esdhc_of_to_plat(struct udevice *dev) val = fdtdec_get_int(fdt, node, "fsl,strobe-dll-delay-target", ESDHC_STROBE_DLL_CTRL_SLV_DLY_TARGET_DEFAULT); priv->strobe_dll_delay_target = val; + val = fdtdec_get_int(fdt, node, "fsl,signal-voltage-switch-extra-delay-ms", 0); + priv->signal_voltage_switch_extra_delay_ms = val; if (dev_read_bool(dev, "broken-cd")) priv->broken_cd = 1;