mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
mmc: sdhci_am654: Clear ITAPDLY on tuning failure
When tuning fails, stale ITAPDLY values can persist and interfere with
subsequent I/O accesses, for example in DDR50 mode in cards with no tuning
support. Move the ITAPDLY enable setting out of the tuning loop to after
successful tuning, and explicitly clear ITAPDLY (delay and enable) when
tuning fails so that we are sure only working values are actually left in
hardware.
Fixes: 901d16e462 ("mmc: sdhci_am654: Add retry tuning")
Cc: stable@vger.kernel.org
Signed-off-by: Diogo Ivo (Schneider Electric) <diogo.ivo@bootlin.com>
Reviewed-by: Judith Mendez <jm@ti.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulfh@kernel.org>
This commit is contained in:
parent
7197d9107d
commit
c9f47cc8c3
|
|
@ -527,7 +527,6 @@ static int sdhci_am654_do_tuning(struct sdhci_host *host,
|
|||
{
|
||||
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
||||
struct sdhci_am654_data *sdhci_am654 = sdhci_pltfm_priv(pltfm_host);
|
||||
unsigned char timing = host->mmc->ios.timing;
|
||||
struct window fail_window[ITAPDLY_LENGTH];
|
||||
struct device *dev = mmc_dev(host->mmc);
|
||||
u8 curr_pass, itap;
|
||||
|
|
@ -536,11 +535,8 @@ static int sdhci_am654_do_tuning(struct sdhci_host *host,
|
|||
|
||||
memset(fail_window, 0, sizeof(fail_window));
|
||||
|
||||
/* Enable ITAPDLY */
|
||||
sdhci_am654->itap_del_ena[timing] = 0x1;
|
||||
|
||||
for (itap = 0; itap < ITAPDLY_LENGTH; itap++) {
|
||||
sdhci_am654_write_itapdly(sdhci_am654, itap, sdhci_am654->itap_del_ena[timing]);
|
||||
sdhci_am654_write_itapdly(sdhci_am654, itap, 0x1);
|
||||
|
||||
curr_pass = !mmc_send_tuning(host->mmc, opcode, NULL);
|
||||
|
||||
|
|
@ -584,10 +580,16 @@ static int sdhci_am654_platform_execute_tuning(struct sdhci_host *host,
|
|||
|
||||
if (itapdly < 0) {
|
||||
dev_err(dev, "Failed to find itapdly, fail tuning\n");
|
||||
sdhci_am654_write_itapdly(sdhci_am654, 0, 0);
|
||||
sdhci_am654->itap_del_ena[timing] = 0;
|
||||
sdhci_am654->itap_del_sel[timing] = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "Passed tuning, final itapdly=%d\n", itapdly);
|
||||
|
||||
/* Enable ITAPDLY */
|
||||
sdhci_am654->itap_del_ena[timing] = 0x1;
|
||||
sdhci_am654_write_itapdly(sdhci_am654, itapdly, sdhci_am654->itap_del_ena[timing]);
|
||||
/* Save ITAPDLY */
|
||||
sdhci_am654->itap_del_sel[timing] = itapdly;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user