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.y...@rock-chips.com>
>> Cc: Peng Fan <peng....@nxp.com>
>> Tested-by: Suniel Mahesh <su...@amarulasolutions.com> # roc-rk3399-pc
>> Signed-off-by: Jagan Teki <ja...@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
> 
> 

Reply via email to