* [PATCH v3 1/2] mmc: xenon: fix PHY init clock stability
@ 2024-02-22 20:07 Elad Nachman
0 siblings, 0 replies; 3+ messages in thread
From: Elad Nachman @ 2024-02-22 20:07 UTC (permalink / raw)
To: huziji, ulf.hansson, adrian.hunter, linux-mmc, linux-kernel
Cc: enachman, stable
From: Elad Nachman <enachman@marvell.com>
Each time SD/mmc phy is initialized, at times, in some of
the attempts, phy fails to completes its initialization
which results into timeout error. Per the HW spec, it is
a pre-requisite to ensure a stable SD clock before a phy
initialization is attempted.
Fixes: 06c8b667ff5b ("mmc: sdhci-xenon: Add support to PHYs of Marvell Xenon SDHC")
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: stable@vger.kernel.org
Signed-off-by: Elad Nachman <enachman@marvell.com>
---
drivers/mmc/host/sdhci-xenon-phy.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/mmc/host/sdhci-xenon-phy.c b/drivers/mmc/host/sdhci-xenon-phy.c
index 8cf3a375de65..c3096230a969 100644
--- a/drivers/mmc/host/sdhci-xenon-phy.c
+++ b/drivers/mmc/host/sdhci-xenon-phy.c
@@ -11,6 +11,7 @@
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/ktime.h>
+#include <linux/iopoll.h>
#include <linux/of_address.h>
#include "sdhci-pltfm.h"
@@ -216,6 +217,19 @@ static int xenon_alloc_emmc_phy(struct sdhci_host *host)
return 0;
}
+static int xenon_check_stability_internal_clk(struct sdhci_host *host)
+{
+ u32 reg;
+ int err;
+
+ err = read_poll_timeout(sdhci_readw, reg, reg & SDHCI_CLOCK_INT_STABLE,
+ 1100, 20000, false, host, SDHCI_CLOCK_CONTROL);
+ if (err)
+ dev_err(mmc_dev(host->mmc), "phy_init: Internal clock never stabilized.\n");
+
+ return err;
+}
+
/*
* eMMC 5.0/5.1 PHY init/re-init.
* eMMC PHY init should be executed after:
@@ -232,6 +246,11 @@ static int xenon_emmc_phy_init(struct sdhci_host *host)
struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
struct xenon_emmc_phy_regs *phy_regs = priv->emmc_phy_regs;
+ int ret = xenon_check_stability_internal_clk(host);
+
+ if (ret)
+ return ret;
+
reg = sdhci_readl(host, phy_regs->timing_adj);
reg |= XENON_PHY_INITIALIZAION;
sdhci_writel(host, reg, phy_regs->timing_adj);
--
2.25.1
^ permalink raw reply [flat|nested] 3+ messages in thread* [PATCH v3 1/2] mmc: xenon: fix PHY init clock stability
@ 2024-02-22 20:09 Elad Nachman
0 siblings, 0 replies; 3+ messages in thread
From: Elad Nachman @ 2024-02-22 20:09 UTC (permalink / raw)
To: ulf.hansson, adrian.hunter, linux-mmc, linux-kernel; +Cc: enachman, stable
From: Elad Nachman <enachman@marvell.com>
Each time SD/mmc phy is initialized, at times, in some of
the attempts, phy fails to completes its initialization
which results into timeout error. Per the HW spec, it is
a pre-requisite to ensure a stable SD clock before a phy
initialization is attempted.
Fixes: 06c8b667ff5b ("mmc: sdhci-xenon: Add support to PHYs of Marvell Xenon SDHC")
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: stable@vger.kernel.org
Signed-off-by: Elad Nachman <enachman@marvell.com>
---
drivers/mmc/host/sdhci-xenon-phy.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/mmc/host/sdhci-xenon-phy.c b/drivers/mmc/host/sdhci-xenon-phy.c
index 8cf3a375de65..c3096230a969 100644
--- a/drivers/mmc/host/sdhci-xenon-phy.c
+++ b/drivers/mmc/host/sdhci-xenon-phy.c
@@ -11,6 +11,7 @@
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/ktime.h>
+#include <linux/iopoll.h>
#include <linux/of_address.h>
#include "sdhci-pltfm.h"
@@ -216,6 +217,19 @@ static int xenon_alloc_emmc_phy(struct sdhci_host *host)
return 0;
}
+static int xenon_check_stability_internal_clk(struct sdhci_host *host)
+{
+ u32 reg;
+ int err;
+
+ err = read_poll_timeout(sdhci_readw, reg, reg & SDHCI_CLOCK_INT_STABLE,
+ 1100, 20000, false, host, SDHCI_CLOCK_CONTROL);
+ if (err)
+ dev_err(mmc_dev(host->mmc), "phy_init: Internal clock never stabilized.\n");
+
+ return err;
+}
+
/*
* eMMC 5.0/5.1 PHY init/re-init.
* eMMC PHY init should be executed after:
@@ -232,6 +246,11 @@ static int xenon_emmc_phy_init(struct sdhci_host *host)
struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
struct xenon_emmc_phy_regs *phy_regs = priv->emmc_phy_regs;
+ int ret = xenon_check_stability_internal_clk(host);
+
+ if (ret)
+ return ret;
+
reg = sdhci_readl(host, phy_regs->timing_adj);
reg |= XENON_PHY_INITIALIZAION;
sdhci_writel(host, reg, phy_regs->timing_adj);
--
2.25.1
^ permalink raw reply [flat|nested] 3+ messages in thread* [PATCH v3 0/2] Fix PHY init timeout issues
@ 2024-02-22 19:17 Elad Nachman
2024-02-22 19:17 ` [PATCH v3 1/2] mmc: xenon: fix PHY init clock stability Elad Nachman
0 siblings, 1 reply; 3+ messages in thread
From: Elad Nachman @ 2024-02-22 19:17 UTC (permalink / raw)
To: huziji, ulf.hansson, adrian.hunter, linux-mmc, linux-kernel; +Cc: enachman
From: Elad Nachman <enachman@marvell.com>
Fix PHY init timeout issues:
1. Clock Stability issue causing PHY timeout
2. Timeout taking longer than needed on AC5X.
Solve by constantly testing the PHY init bit
until it toggles, but up to 100X timeout factor.
v2:
1) convert polling loop to read_poll_timeout()
for both patches.
v3:
1) Add Acked-by, Fixes and CC for stable
Elad Nachman (2):
mmc: xenon: fix PHY init clock stability
mmc: xenon: add timeout for PHY init complete
drivers/mmc/host/sdhci-xenon-phy.c | 48 ++++++++++++++++++++++++------
1 file changed, 39 insertions(+), 9 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 3+ messages in thread* [PATCH v3 1/2] mmc: xenon: fix PHY init clock stability
2024-02-22 19:17 [PATCH v3 0/2] Fix PHY init timeout issues Elad Nachman
@ 2024-02-22 19:17 ` Elad Nachman
0 siblings, 0 replies; 3+ messages in thread
From: Elad Nachman @ 2024-02-22 19:17 UTC (permalink / raw)
To: huziji, ulf.hansson, adrian.hunter, linux-mmc, linux-kernel
Cc: enachman, stable
From: Elad Nachman <enachman@marvell.com>
Each time SD/mmc phy is initialized, at times, in some of
the attempts, phy fails to completes its initialization
which results into timeout error. Per the HW spec, it is
a pre-requisite to ensure a stable SD clock before a phy
initialization is attempted.
Fixes: 06c8b667ff5b ("mmc: sdhci-xenon: Add support to PHYs of Marvell Xenon SDHC")
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: stable@vger.kernel.org
Signed-off-by: Elad Nachman <enachman@marvell.com>
---
drivers/mmc/host/sdhci-xenon-phy.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/mmc/host/sdhci-xenon-phy.c b/drivers/mmc/host/sdhci-xenon-phy.c
index 8cf3a375de65..c3096230a969 100644
--- a/drivers/mmc/host/sdhci-xenon-phy.c
+++ b/drivers/mmc/host/sdhci-xenon-phy.c
@@ -11,6 +11,7 @@
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/ktime.h>
+#include <linux/iopoll.h>
#include <linux/of_address.h>
#include "sdhci-pltfm.h"
@@ -216,6 +217,19 @@ static int xenon_alloc_emmc_phy(struct sdhci_host *host)
return 0;
}
+static int xenon_check_stability_internal_clk(struct sdhci_host *host)
+{
+ u32 reg;
+ int err;
+
+ err = read_poll_timeout(sdhci_readw, reg, reg & SDHCI_CLOCK_INT_STABLE,
+ 1100, 20000, false, host, SDHCI_CLOCK_CONTROL);
+ if (err)
+ dev_err(mmc_dev(host->mmc), "phy_init: Internal clock never stabilized.\n");
+
+ return err;
+}
+
/*
* eMMC 5.0/5.1 PHY init/re-init.
* eMMC PHY init should be executed after:
@@ -232,6 +246,11 @@ static int xenon_emmc_phy_init(struct sdhci_host *host)
struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host);
struct xenon_emmc_phy_regs *phy_regs = priv->emmc_phy_regs;
+ int ret = xenon_check_stability_internal_clk(host);
+
+ if (ret)
+ return ret;
+
reg = sdhci_readl(host, phy_regs->timing_adj);
reg |= XENON_PHY_INITIALIZAION;
sdhci_writel(host, reg, phy_regs->timing_adj);
--
2.25.1
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-02-22 22:12 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-22 20:07 [PATCH v3 1/2] mmc: xenon: fix PHY init clock stability Elad Nachman
-- strict thread matches above, loose matches on Subject: below --
2024-02-22 20:09 Elad Nachman
2024-02-22 19:17 [PATCH v3 0/2] Fix PHY init timeout issues Elad Nachman
2024-02-22 19:17 ` [PATCH v3 1/2] mmc: xenon: fix PHY init clock stability Elad Nachman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®