[RFC PATCH v1 0/1] mmc: zynq_sdhci: Only evaluate card-stable signal if card was detected

From: Lukas Funke lukas.funke@weidmueller.com
On ZynqMp there seems to be a dependency between the card-stable bit and the card-detect bit. The card-stable bit is set *if and only if* the card-detect bit was set before, indicating that the signal was stable and reliable during card insertion.
If the card-detect bit is *not* evaluated the corresponding check leads to a timeout indicating that the card-detect was not stable.
There was another patch that tried to mitigate this behaviour:
https://lore.kernel.org/u-boot/20230516142116.29996-1-stefan.herbrechtsmeier...
However, the discussion stalled and the solution was not accepted. This patch introduces another way to deal with the observed behaviour.
Lukas Funke (1): mmc: zynq_sdhci: Only evaluate card-stable signal if card was detected
drivers/mmc/zynq_sdhci.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)

From: Lukas Funke lukas.funke@weidmueller.com
On ZynqMp there seems to be a dependency between the card-stable bit and the card-detect bit. The card-stable bit is set *if and only if* the card-detect bit was set before, indicating that the signal was stable and reliable during card insertion.
If the card-detect bit is *not* evaluated the corresponding check leads to a timeout indicating that the card-detect was not stable.
Signed-off-by: Lukas Funke lukas.funke@weidmueller.com ---
drivers/mmc/zynq_sdhci.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c index 935540d171..d0bccd41cc 100644 --- a/drivers/mmc/zynq_sdhci.c +++ b/drivers/mmc/zynq_sdhci.c @@ -1168,11 +1168,14 @@ static int arasan_sdhci_probe(struct udevice *dev) */ if (IS_ENABLED(CONFIG_ARCH_ZYNQMP) || IS_ENABLED(CONFIG_ARCH_VERSAL)) { u32 timeout = 1000000; + u32 value;
- while (((sdhci_readl(host, SDHCI_PRESENT_STATE) & - SDHCI_CARD_STATE_STABLE) == 0) && timeout) { + value = sdhci_readl(host, SDHCI_PRESENT_STATE); + while ((value & SDHCI_CARD_PRESENT) && + ((value & SDHCI_CARD_STATE_STABLE) == 0) && timeout) { udelay(1); timeout--; + value = sdhci_readl(host, SDHCI_PRESENT_STATE); } if (!timeout) { dev_err(dev, "Sdhci card detect state not stable\n");

On 4/24/24 10:23, lukas.funke-oss@weidmueller.com wrote:
From: Lukas Funke lukas.funke@weidmueller.com
On ZynqMp there seems to be a dependency between the card-stable bit and the card-detect bit. The card-stable bit is set *if and only if* the card-detect bit was set before, indicating that the signal was stable and reliable during card insertion.
If the card-detect bit is *not* evaluated the corresponding check leads to a timeout indicating that the card-detect was not stable.
Signed-off-by: Lukas Funke lukas.funke@weidmueller.com
drivers/mmc/zynq_sdhci.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c index 935540d171..d0bccd41cc 100644 --- a/drivers/mmc/zynq_sdhci.c +++ b/drivers/mmc/zynq_sdhci.c @@ -1168,11 +1168,14 @@ static int arasan_sdhci_probe(struct udevice *dev) */ if (IS_ENABLED(CONFIG_ARCH_ZYNQMP) || IS_ENABLED(CONFIG_ARCH_VERSAL)) { u32 timeout = 1000000;
u32 value;
while (((sdhci_readl(host, SDHCI_PRESENT_STATE) &
SDHCI_CARD_STATE_STABLE) == 0) && timeout) {
value = sdhci_readl(host, SDHCI_PRESENT_STATE);
while ((value & SDHCI_CARD_PRESENT) &&
((value & SDHCI_CARD_STATE_STABLE) == 0) && timeout) { udelay(1); timeout--;
} if (!timeout) { dev_err(dev, "Sdhci card detect state not stable\n");value = sdhci_readl(host, SDHCI_PRESENT_STATE);
Venkatesh: Can you please take a look at this?
Thanks, Michal

Hi Lukas, The polling of card-stable bit alone is enough, as if card-detect bit is not set anyways the card-stable bit won't be set which leads to timeout. I don’t think it is specific to zynqmp platform.
Could you please let me know if you observe this issue on any of the zynqmp board?
Thanks Venkatesh
-----Original Message----- From: Simek, Michal michal.simek@amd.com Sent: Wednesday, May 29, 2024 8:33 PM To: lukas.funke-oss@weidmueller.com; u-boot@lists.denx.de; Abbarapu, Venkatesh venkatesh.abbarapu@amd.com Cc: Stefan Herbrechtsmeier Stefan.Herbrechtsmeier@weidmueller.com; Ashok Reddy Soma ashok.reddy.soma@amd.com; Lukas Funke lukas.funke@weidmueller.com; Jaehoon Chung jh80.chung@samsung.com; Johan Jonker jbx6244@gmail.com; Peng Fan peng.fan@nxp.com; Simon Glass sjg@chromium.org; Tom Rini trini@konsulko.com Subject: Re: [RFC PATCH v1 1/1] mmc: zynq_sdhci: Only evaluate card-stable signal if card was detected
On 4/24/24 10:23, lukas.funke-oss@weidmueller.com wrote:
From: Lukas Funke lukas.funke@weidmueller.com
On ZynqMp there seems to be a dependency between the card-stable bit and the card-detect bit. The card-stable bit is set *if and only if* the card-detect bit was set before, indicating that the signal was stable and reliable during card insertion.
If the card-detect bit is *not* evaluated the corresponding check leads to a timeout indicating that the card-detect was not stable.
Signed-off-by: Lukas Funke lukas.funke@weidmueller.com
drivers/mmc/zynq_sdhci.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c index 935540d171..d0bccd41cc 100644 --- a/drivers/mmc/zynq_sdhci.c +++ b/drivers/mmc/zynq_sdhci.c @@ -1168,11 +1168,14 @@ static int arasan_sdhci_probe(struct udevice
*dev)
*/
if (IS_ENABLED(CONFIG_ARCH_ZYNQMP) ||
IS_ENABLED(CONFIG_ARCH_VERSAL)) {
u32 timeout = 1000000;
u32 value;
while (((sdhci_readl(host, SDHCI_PRESENT_STATE) &
SDHCI_CARD_STATE_STABLE) == 0) && timeout) {
value = sdhci_readl(host, SDHCI_PRESENT_STATE);
while ((value & SDHCI_CARD_PRESENT) &&
((value & SDHCI_CARD_STATE_STABLE) == 0) && timeout)
{
udelay(1); timeout--;
} if (!timeout) { dev_err(dev, "Sdhci card detect state not stable\n");value = sdhci_readl(host, SDHCI_PRESENT_STATE);
Venkatesh: Can you please take a look at this?
Thanks, Michal

Hi Venkatesh,
On 30.05.2024 07:39, Abbarapu, Venkatesh wrote:
Hi Lukas, The polling of card-stable bit alone is enough, as if card-detect bit is not set anyways the card-stable bit won't be set which leads to timeout. I don’t think it is specific to zynqmp platform.
Could you please let me know if you observe this issue on any of the zynqmp board?
We can observe this behaviour on zu2cg and zu3eg. I haven't tried it on an eval-board but this would be the next step.
The main problem is that the stable-bit is not set if there is no sd-card plugged in from the beginning, but only if the cd-signal changes.
Is there any documentation how this bit should behave then?
Best regards - Lukas
Thanks Venkatesh
-----Original Message----- From: Simek, Michal michal.simek@amd.com Sent: Wednesday, May 29, 2024 8:33 PM To: lukas.funke-oss@weidmueller.com; u-boot@lists.denx.de; Abbarapu, Venkatesh venkatesh.abbarapu@amd.com Cc: Stefan Herbrechtsmeier Stefan.Herbrechtsmeier@weidmueller.com; Ashok Reddy Soma ashok.reddy.soma@amd.com; Lukas Funke lukas.funke@weidmueller.com; Jaehoon Chung jh80.chung@samsung.com; Johan Jonker jbx6244@gmail.com; Peng Fan peng.fan@nxp.com; Simon Glass sjg@chromium.org; Tom Rini trini@konsulko.com Subject: Re: [RFC PATCH v1 1/1] mmc: zynq_sdhci: Only evaluate card-stable signal if card was detected
On 4/24/24 10:23, lukas.funke-oss@weidmueller.com wrote:
From: Lukas Funke lukas.funke@weidmueller.com
On ZynqMp there seems to be a dependency between the card-stable bit and the card-detect bit. The card-stable bit is set *if and only if* the card-detect bit was set before, indicating that the signal was stable and reliable during card insertion.
If the card-detect bit is *not* evaluated the corresponding check leads to a timeout indicating that the card-detect was not stable.
Signed-off-by: Lukas Funke lukas.funke@weidmueller.com
drivers/mmc/zynq_sdhci.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c index 935540d171..d0bccd41cc 100644 --- a/drivers/mmc/zynq_sdhci.c +++ b/drivers/mmc/zynq_sdhci.c @@ -1168,11 +1168,14 @@ static int arasan_sdhci_probe(struct udevice
*dev)
*/ if (IS_ENABLED(CONFIG_ARCH_ZYNQMP) ||
IS_ENABLED(CONFIG_ARCH_VERSAL)) {
u32 timeout = 1000000;
u32 value;
while (((sdhci_readl(host, SDHCI_PRESENT_STATE) &
SDHCI_CARD_STATE_STABLE) == 0) && timeout) {
value = sdhci_readl(host, SDHCI_PRESENT_STATE);
while ((value & SDHCI_CARD_PRESENT) &&
((value & SDHCI_CARD_STATE_STABLE) == 0) && timeout)
{
udelay(1); timeout--;
value = sdhci_readl(host, SDHCI_PRESENT_STATE); } if (!timeout) { dev_err(dev, "Sdhci card detect state not stable\n");
Venkatesh: Can you please take a look at this?
Thanks, Michal
participants (4)
-
Abbarapu, Venkatesh
-
Lukas Funke
-
lukas.funke-oss@weidmueller.com
-
Michal Simek