mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 0/3] mci: sdhci Rockchip tuning fixes
@ 2026-05-21  8:05 Sascha Hauer
  2026-05-21  8:05 ` [PATCH 1/3] mci: rockchip-dwcmshc-sdhci: poll DATA_AVAIL for tuning commands Sascha Hauer
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Sascha Hauer @ 2026-05-21  8:05 UTC (permalink / raw)
  To: BAREBOX

Tuning operation on Rockchip used to fail. I never noticed because
errors from tuning were not properly propagated. This is fixed in [1]
and since this commit HSx00 speeds do not work work anymore. HS400
modes worked for me despite the tuning failed, but with likely
suboptimal timing. This series fixes this and we now pass tuning.

Also switch the Rockchip SDHCI controller to the recently introduced
sdhci_send_command() helper.

[1] 85995b4d54 ("mci: sdhci: propagate tuning failures from sdhci_execute_tuning()")

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
Sascha Hauer (3):
      mci: rockchip-dwcmshc-sdhci: poll DATA_AVAIL for tuning commands
      mci: sdhci: Fix TIMEOUT_CONTROL register value
      mci: sdhci: rockchip: Use generic sdhci_send_command()

 drivers/mci/rockchip-dwcmshc-sdhci.c | 57 +-----------------------------------
 drivers/mci/sdhci.c                  |  2 +-
 2 files changed, 2 insertions(+), 57 deletions(-)
---
base-commit: f5956c772dc00837bad36fc66df8a53aae86558d
change-id: 20260521-rockchip-emmc-fixes-0fd673597897

Best regards,
-- 
Sascha Hauer <s.hauer@pengutronix.de>




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/3] mci: rockchip-dwcmshc-sdhci: poll DATA_AVAIL for tuning commands
  2026-05-21  8:05 [PATCH 0/3] mci: sdhci Rockchip tuning fixes Sascha Hauer
@ 2026-05-21  8:05 ` Sascha Hauer
  2026-05-21  8:05 ` [PATCH 2/3] mci: sdhci: Fix TIMEOUT_CONTROL register value Sascha Hauer
  2026-05-21  8:05 ` [PATCH 3/3] mci: sdhci: rockchip: Use generic sdhci_send_command() Sascha Hauer
  2 siblings, 0 replies; 4+ messages in thread
From: Sascha Hauer @ 2026-05-21  8:05 UTC (permalink / raw)
  To: BAREBOX

Per SDHCI v3.00 the controller only generates Buffer Read Ready
(SDHCI_INT_DATA_AVAIL) during a tuning sequence; CMD_COMPLETE does
not fire. Switch the wait mask for CMD19/21 so HS200 tuning can
converge. Mirrors the arasan-sdhci driver.

This is done only to put the finger on this issue. The next commit
will replace the rockchip specific rk_sdhci_send_cmd() with the
generic sdhci_send_command() which does the same.

Assisted-by: Claude Opus 4.7
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/mci/rockchip-dwcmshc-sdhci.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/mci/rockchip-dwcmshc-sdhci.c b/drivers/mci/rockchip-dwcmshc-sdhci.c
index 57d5fe1369..1fdea7c4ab 100644
--- a/drivers/mci/rockchip-dwcmshc-sdhci.c
+++ b/drivers/mci/rockchip-dwcmshc-sdhci.c
@@ -333,6 +333,10 @@ static int rk_sdhci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 	sdhci_write32(&host->sdhci, SDHCI_ARGUMENT, cmd->cmdarg);
 	sdhci_write16(&host->sdhci, SDHCI_COMMAND, command);
 
+	/* CMD19/21 generate _only_ Buffer Read Ready interrupt */
+	if (mmc_op_tuning(cmd->cmdidx))
+		mask = SDHCI_INT_DATA_AVAIL;
+
 	ret = sdhci_wait_for_done(&host->sdhci, mask);
 	if (ret) {
 		sdhci_teardown_data(&host->sdhci, data, dma);

-- 
2.47.3




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2/3] mci: sdhci: Fix TIMEOUT_CONTROL register value
  2026-05-21  8:05 [PATCH 0/3] mci: sdhci Rockchip tuning fixes Sascha Hauer
  2026-05-21  8:05 ` [PATCH 1/3] mci: rockchip-dwcmshc-sdhci: poll DATA_AVAIL for tuning commands Sascha Hauer
@ 2026-05-21  8:05 ` Sascha Hauer
  2026-05-21  8:05 ` [PATCH 3/3] mci: sdhci: rockchip: Use generic sdhci_send_command() Sascha Hauer
  2 siblings, 0 replies; 4+ messages in thread
From: Sascha Hauer @ 2026-05-21  8:05 UTC (permalink / raw)
  To: BAREBOX

A timeout value of 0xf is reserved for most (all?) controllers. Use 0xe
which is the maximum allowed value and used throughout all controllers
in barebox.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/mci/sdhci.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/mci/sdhci.c b/drivers/mci/sdhci.c
index 19b845302e..0d20f3b63e 100644
--- a/drivers/mci/sdhci.c
+++ b/drivers/mci/sdhci.c
@@ -138,7 +138,7 @@ int sdhci_send_command(struct sdhci *host, struct mci_cmd *cmd)
 				dma == SDHCI_NO_DMA ? false : true,
 				&command, &xfer);
 
-	sdhci_write8(host, SDHCI_TIMEOUT_CONTROL, 0xf);
+	sdhci_write8(host, SDHCI_TIMEOUT_CONTROL, 0xe);
 	if (xfer)
 		sdhci_write16(host, SDHCI_TRANSFER_MODE, xfer);
 	if (cmd->data) {

-- 
2.47.3




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 3/3] mci: sdhci: rockchip: Use generic sdhci_send_command()
  2026-05-21  8:05 [PATCH 0/3] mci: sdhci Rockchip tuning fixes Sascha Hauer
  2026-05-21  8:05 ` [PATCH 1/3] mci: rockchip-dwcmshc-sdhci: poll DATA_AVAIL for tuning commands Sascha Hauer
  2026-05-21  8:05 ` [PATCH 2/3] mci: sdhci: Fix TIMEOUT_CONTROL register value Sascha Hauer
@ 2026-05-21  8:05 ` Sascha Hauer
  2 siblings, 0 replies; 4+ messages in thread
From: Sascha Hauer @ 2026-05-21  8:05 UTC (permalink / raw)
  To: BAREBOX

We now have a generic sdhci_send_command() which exactly matches the
rockchip variant, so switch to the generic implementation.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/mci/rockchip-dwcmshc-sdhci.c | 61 +-----------------------------------
 1 file changed, 1 insertion(+), 60 deletions(-)

diff --git a/drivers/mci/rockchip-dwcmshc-sdhci.c b/drivers/mci/rockchip-dwcmshc-sdhci.c
index 1fdea7c4ab..0be5d9ff63 100644
--- a/drivers/mci/rockchip-dwcmshc-sdhci.c
+++ b/drivers/mci/rockchip-dwcmshc-sdhci.c
@@ -293,70 +293,11 @@ static void rk_sdhci_set_ios(struct mci_host *mci, struct mci_ios *ios)
 	sdhci_set_bus_width(&host->sdhci, ios->bus_width);
 }
 
-static void print_error(struct rk_sdhci_host *host, int cmdidx)
-{
-	dev_dbg(host->mci.hw_dev,
-		"error while transfering data for command %d\n", cmdidx);
-	dev_dbg(host->mci.hw_dev, "state = 0x%08x , interrupt = 0x%08x\n",
-		sdhci_read32(&host->sdhci, SDHCI_PRESENT_STATE),
-		sdhci_read32(&host->sdhci, SDHCI_INT_NORMAL_STATUS));
-}
-
 static int rk_sdhci_send_cmd(struct mci_host *mci, struct mci_cmd *cmd)
 {
 	struct rk_sdhci_host *host = to_rk_sdhci_host(mci);
-	struct mci_data *data = cmd->data;
-	u32 mask, command, xfer;
-	int ret;
-	dma_addr_t dma;
-
-	ret = sdhci_wait_idle_data(&host->sdhci, cmd);
-	if (ret)
-		return ret;
-
-	sdhci_write32(&host->sdhci, SDHCI_INT_STATUS, ~0);
-
-	mask = SDHCI_INT_CMD_COMPLETE;
-	if (cmd->resp_type & MMC_RSP_BUSY)
-		mask |= SDHCI_INT_XFER_COMPLETE;
-
-	sdhci_write8(&host->sdhci, SDHCI_TIMEOUT_CONTROL, 0xe);
-
-	sdhci_setup_data_dma(&host->sdhci, data, &dma);
-
-	sdhci_set_cmd_xfer_mode(&host->sdhci, cmd, data,
-				dma == SDHCI_NO_DMA ? false : true,
-				&command, &xfer);
-
-	sdhci_write16(&host->sdhci, SDHCI_TRANSFER_MODE, xfer);
-
-	sdhci_write32(&host->sdhci, SDHCI_ARGUMENT, cmd->cmdarg);
-	sdhci_write16(&host->sdhci, SDHCI_COMMAND, command);
-
-	/* CMD19/21 generate _only_ Buffer Read Ready interrupt */
-	if (mmc_op_tuning(cmd->cmdidx))
-		mask = SDHCI_INT_DATA_AVAIL;
-
-	ret = sdhci_wait_for_done(&host->sdhci, mask);
-	if (ret) {
-		sdhci_teardown_data(&host->sdhci, data, dma);
-		goto error;
-	}
-
-	sdhci_read_response(&host->sdhci, cmd);
-	sdhci_write32(&host->sdhci, SDHCI_INT_STATUS, SDHCI_INT_CMD_COMPLETE);
-
-	ret = sdhci_transfer_data_dma(&host->sdhci, cmd, data, dma);
-
-error:
-	if (ret) {
-		print_error(host, cmd->cmdidx);
-		sdhci_reset(&host->sdhci, SDHCI_RESET_CMD);
-		sdhci_reset(&host->sdhci, SDHCI_RESET_DATA);
-	}
 
-	sdhci_write32(&host->sdhci, SDHCI_INT_STATUS, ~0);
-	return ret;
+	return sdhci_send_command(&host->sdhci, cmd);
 }
 
 static int rk_sdhci_execute_tuning(struct mci_host *mci, u32 opcode)

-- 
2.47.3




^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-05-21  8:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-21  8:05 [PATCH 0/3] mci: sdhci Rockchip tuning fixes Sascha Hauer
2026-05-21  8:05 ` [PATCH 1/3] mci: rockchip-dwcmshc-sdhci: poll DATA_AVAIL for tuning commands Sascha Hauer
2026-05-21  8:05 ` [PATCH 2/3] mci: sdhci: Fix TIMEOUT_CONTROL register value Sascha Hauer
2026-05-21  8:05 ` [PATCH 3/3] mci: sdhci: rockchip: Use generic sdhci_send_command() Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox