[PATCH v4] mmc: sdhci: Fix HISPD bit handling
Jaehoon Chung
jh80.chung at samsung.com
Mon Jun 22 11:24:56 CEST 2020
Hi Peng,
On 6/22/20 10:49 AM, Peng Fan wrote:
> Jaehoon,
>
>> Subject: [PATCH v4] mmc: sdhci: Fix HISPD bit handling
>
> Are you fine with this v4?
Thanks for sharing it. i didn't see patch v4.
>
> Thanks,
> Peng.
>
>>
>> SDHCI HISPD bits need to be configured based on desired mmc timings mode
>> and some HISPD quirks.
>>
>> So, handle the HISPD bit based on the mmc computed selected mode(timing
>> parameter) rather than fixed mmc card clock frequency.
>>
>> Linux handle the HISPD similar like this in below commit but no
>> SDHCI_QUIRK_BROKEN_HISPD_MODE,
>>
>> commit <501639bf2173> ("mmc: sdhci: fix SDHCI_QUIRK_NO_HISPD_BIT
>> handling")
>>
>> This eventually fixed the mmc write issue observed in
>> rk3399 sdhci controller.
>>
>> Bug log for refernece,
>> => gpt write mmc 0 $partitions
>> Writing GPT: mmc write failed
>> ** Can't write to device 0 **
>> ** Can't write to device 0 **
>> error!
>>
>> Cc: Kever Yang <kever.yang at rock-chips.com>
>> Cc: Peng Fan <peng.fan at nxp.com>
>> Tested-by: Suniel Mahesh <sunil at amarulasolutions.com> # roc-rk3399-pc
>> Signed-off-by: Jagan Teki <jagan at amarulasolutions.com>
>> ---
>> Changes for v4:
>> - update commit message
>> - simplify the logic.
>>
>> drivers/mmc/sdhci.c | 23 +++++++++++++++++------
>> 1 file changed, 17 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index
>> 92cc8434af..6cb702111b 100644
>> --- a/drivers/mmc/sdhci.c
>> +++ b/drivers/mmc/sdhci.c
>> @@ -567,6 +567,7 @@ static int sdhci_set_ios(struct mmc *mmc) #endif
>> u32 ctrl;
>> struct sdhci_host *host = mmc->priv;
>> + bool no_hispd_bit = false;
>>
>> if (host->ops && host->ops->set_control_reg)
>> host->ops->set_control_reg(host);
>> @@ -594,14 +595,24 @@ static int sdhci_set_ios(struct mmc *mmc)
>> ctrl &= ~SDHCI_CTRL_4BITBUS;
>> }
>>
>> - if (mmc->clock > 26000000)
>> - ctrl |= SDHCI_CTRL_HISPD;
>> - else
>> - ctrl &= ~SDHCI_CTRL_HISPD;
>> -
>> if ((host->quirks & SDHCI_QUIRK_NO_HISPD_BIT) ||
>> (host->quirks & SDHCI_QUIRK_BROKEN_HISPD_MODE))
>> - ctrl &= ~SDHCI_CTRL_HISPD;
>> + no_hispd_bit = true;
No. ctrl variable is set to bit[2] of HOST_CONTROL register.
But Some samsung SoCs are using its bit[2] as other purpose.
So it needs to revert the value with "ctrl &= ~SDHCI_CTRL_HISPD".
Because it's possible to set to 1.
SDHCI_QUIRK_NO_HISPD_BIT means that it's used other purpose.
Best Regards,
Jaehoon Chung
>> +
>> + if (!no_hispd_bit) {
>> + if (mmc->selected_mode == MMC_HS ||
>> + mmc->selected_mode == SD_HS ||
>> + mmc->selected_mode == MMC_DDR_52 ||
>> + mmc->selected_mode == MMC_HS_200 ||
>> + mmc->selected_mode == MMC_HS_400 ||
>> + mmc->selected_mode == UHS_SDR25 ||
>> + mmc->selected_mode == UHS_SDR50 ||
>> + mmc->selected_mode == UHS_SDR104 ||
>> + mmc->selected_mode == UHS_DDR50)
>> + ctrl |= SDHCI_CTRL_HISPD;
>> + else
>> + ctrl &= ~SDHCI_CTRL_HISPD;
>> + }
>>
>> sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
>>
>> --
>> 2.25.1
>
>
More information about the U-Boot
mailing list