2020-01-08 15:45:47

by Faiz Abbas

[permalink] [raw]
Subject: [PATCH 0/3] Fixes for Am65x controllers

The following are some fixes for sdhci_am654 driver.

Patch 3 depends on patch 2.

v1 of patch 2 was posted:
https://patchwork.kernel.org/project/linux-mmc/list/?series=222279

Faiz Abbas (3):
mmc: sdhci_am654: Remove Inverted Write Protect flag
mmc: sdhci_am654: Reset Command and Data line after tuning
mmc: sdhci_am654: Fix Command Queuing in AM65x

drivers/mmc/host/sdhci_am654.c | 54 ++++++++++++++++++++++------------
1 file changed, 35 insertions(+), 19 deletions(-)

--
2.19.2


2020-01-08 15:46:09

by Faiz Abbas

[permalink] [raw]
Subject: [PATCH 2/3] mmc: sdhci_am654: Reset Command and Data line after tuning

The tuning data is leftover in the buffer after tuning. This can cause
issues in future data commands, especially with CQHCI. Reset the command
and data lines after tuning to continue from a clean state.

Fixes: 41fd4caeb00b ("mmc: sdhci_am654: Add Initial Support for AM654 SDHCI driver")
Cc: [email protected]
Signed-off-by: Faiz Abbas <[email protected]>
---
drivers/mmc/host/sdhci_am654.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)

diff --git a/drivers/mmc/host/sdhci_am654.c b/drivers/mmc/host/sdhci_am654.c
index 2d38b1e12a7e..59c0c41b3739 100644
--- a/drivers/mmc/host/sdhci_am654.c
+++ b/drivers/mmc/host/sdhci_am654.c
@@ -240,6 +240,22 @@ static void sdhci_am654_write_b(struct sdhci_host *host, u8 val, int reg)
writeb(val, host->ioaddr + reg);
}

+static int sdhci_am654_execute_tuning(struct mmc_host *mmc, u32 opcode)
+{
+ struct sdhci_host *host = mmc_priv(mmc);
+ int err = sdhci_execute_tuning(mmc, opcode);
+
+ if (err)
+ return err;
+ /*
+ * Tuning data remains in the buffer after tuning.
+ * Do a command and data reset to get rid of it
+ */
+ sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
+
+ return 0;
+}
+
static struct sdhci_ops sdhci_am654_ops = {
.get_max_clock = sdhci_pltfm_clk_get_max_clock,
.get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
@@ -546,6 +562,8 @@ static int sdhci_am654_probe(struct platform_device *pdev)
goto pm_runtime_put;
}

+ host->mmc_host_ops.execute_tuning = sdhci_am654_execute_tuning;
+
ret = sdhci_am654_init(host);
if (ret)
goto pm_runtime_put;
--
2.19.2

2020-01-08 15:59:51

by Faiz Abbas

[permalink] [raw]
Subject: [PATCH 3/3] mmc: sdhci_am654: Fix Command Queuing in AM65x

Command Queuing was enabled completely for J721e controllers which lead
to partial enablement even for Am65x. Complete CQ implementation for
AM65x by adding the irq callback.

Fixes: f545702b74f9 ("mmc: sdhci_am654: Add Support for Command Queuing Engine to J721E")
Cc: [email protected]
Signed-off-by: Faiz Abbas <[email protected]>
---
drivers/mmc/host/sdhci_am654.c | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/drivers/mmc/host/sdhci_am654.c b/drivers/mmc/host/sdhci_am654.c
index 59c0c41b3739..b8fe94fd9525 100644
--- a/drivers/mmc/host/sdhci_am654.c
+++ b/drivers/mmc/host/sdhci_am654.c
@@ -256,6 +256,19 @@ static int sdhci_am654_execute_tuning(struct mmc_host *mmc, u32 opcode)
return 0;
}

+static u32 sdhci_am654_cqhci_irq(struct sdhci_host *host, u32 intmask)
+{
+ int cmd_error = 0;
+ int data_error = 0;
+
+ if (!sdhci_cqe_irq(host, intmask, &cmd_error, &data_error))
+ return intmask;
+
+ cqhci_irq(host->mmc, intmask, cmd_error, data_error);
+
+ return 0;
+}
+
static struct sdhci_ops sdhci_am654_ops = {
.get_max_clock = sdhci_pltfm_clk_get_max_clock,
.get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
@@ -264,6 +277,7 @@ static struct sdhci_ops sdhci_am654_ops = {
.set_power = sdhci_am654_set_power,
.set_clock = sdhci_am654_set_clock,
.write_b = sdhci_am654_write_b,
+ .irq = sdhci_am654_cqhci_irq,
.reset = sdhci_reset,
};

@@ -278,19 +292,6 @@ static const struct sdhci_am654_driver_data sdhci_am654_drvdata = {
.flags = IOMUX_PRESENT | FREQSEL_2_BIT | STRBSEL_4_BIT | DLL_PRESENT,
};

-static u32 sdhci_am654_cqhci_irq(struct sdhci_host *host, u32 intmask)
-{
- int cmd_error = 0;
- int data_error = 0;
-
- if (!sdhci_cqe_irq(host, intmask, &cmd_error, &data_error))
- return intmask;
-
- cqhci_irq(host->mmc, intmask, cmd_error, data_error);
-
- return 0;
-}
-
static struct sdhci_ops sdhci_j721e_8bit_ops = {
.get_max_clock = sdhci_pltfm_clk_get_max_clock,
.get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
--
2.19.2

2020-01-08 17:35:50

by Faiz Abbas

[permalink] [raw]
Subject: [PATCH 1/3] mmc: sdhci_am654: Remove Inverted Write Protect flag

The MMC/SD controllers on am65x and j721e don't in fact detect the write
protect line as inverted. No issues were detected because of this
because the sdwp line is not connected on any of the evms. Fix this by
removing the flag.

Fixes: 1accbced1c32 ("mmc: sdhci_am654: Add Support for 4 bit IP on J721E")
Cc: [email protected]
Signed-off-by: Faiz Abbas <[email protected]>
---
drivers/mmc/host/sdhci_am654.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/mmc/host/sdhci_am654.c b/drivers/mmc/host/sdhci_am654.c
index b8e897e31e2e..2d38b1e12a7e 100644
--- a/drivers/mmc/host/sdhci_am654.c
+++ b/drivers/mmc/host/sdhci_am654.c
@@ -253,8 +253,7 @@ static struct sdhci_ops sdhci_am654_ops = {

static const struct sdhci_pltfm_data sdhci_am654_pdata = {
.ops = &sdhci_am654_ops,
- .quirks = SDHCI_QUIRK_INVERTED_WRITE_PROTECT |
- SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
+ .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
};

@@ -290,8 +289,7 @@ static struct sdhci_ops sdhci_j721e_8bit_ops = {

static const struct sdhci_pltfm_data sdhci_j721e_8bit_pdata = {
.ops = &sdhci_j721e_8bit_ops,
- .quirks = SDHCI_QUIRK_INVERTED_WRITE_PROTECT |
- SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
+ .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
};

@@ -314,8 +312,7 @@ static struct sdhci_ops sdhci_j721e_4bit_ops = {

static const struct sdhci_pltfm_data sdhci_j721e_4bit_pdata = {
.ops = &sdhci_j721e_4bit_ops,
- .quirks = SDHCI_QUIRK_INVERTED_WRITE_PROTECT |
- SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
+ .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
};

--
2.19.2

2020-01-15 13:14:50

by Adrian Hunter

[permalink] [raw]
Subject: Re: [PATCH 2/3] mmc: sdhci_am654: Reset Command and Data line after tuning

On 8/01/20 4:33 pm, Faiz Abbas wrote:
> The tuning data is leftover in the buffer after tuning. This can cause
> issues in future data commands, especially with CQHCI. Reset the command
> and data lines after tuning to continue from a clean state.
>
> Fixes: 41fd4caeb00b ("mmc: sdhci_am654: Add Initial Support for AM654 SDHCI driver")
> Cc: [email protected]
> Signed-off-by: Faiz Abbas <[email protected]>

Acked-by: Adrian Hunter <[email protected]>

> ---
> drivers/mmc/host/sdhci_am654.c | 18 ++++++++++++++++++
> 1 file changed, 18 insertions(+)
>
> diff --git a/drivers/mmc/host/sdhci_am654.c b/drivers/mmc/host/sdhci_am654.c
> index 2d38b1e12a7e..59c0c41b3739 100644
> --- a/drivers/mmc/host/sdhci_am654.c
> +++ b/drivers/mmc/host/sdhci_am654.c
> @@ -240,6 +240,22 @@ static void sdhci_am654_write_b(struct sdhci_host *host, u8 val, int reg)
> writeb(val, host->ioaddr + reg);
> }
>
> +static int sdhci_am654_execute_tuning(struct mmc_host *mmc, u32 opcode)
> +{
> + struct sdhci_host *host = mmc_priv(mmc);
> + int err = sdhci_execute_tuning(mmc, opcode);
> +
> + if (err)
> + return err;
> + /*
> + * Tuning data remains in the buffer after tuning.
> + * Do a command and data reset to get rid of it
> + */
> + sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
> +
> + return 0;
> +}
> +
> static struct sdhci_ops sdhci_am654_ops = {
> .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> .get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
> @@ -546,6 +562,8 @@ static int sdhci_am654_probe(struct platform_device *pdev)
> goto pm_runtime_put;
> }
>
> + host->mmc_host_ops.execute_tuning = sdhci_am654_execute_tuning;
> +
> ret = sdhci_am654_init(host);
> if (ret)
> goto pm_runtime_put;
>

2020-01-15 13:15:20

by Adrian Hunter

[permalink] [raw]
Subject: Re: [PATCH 1/3] mmc: sdhci_am654: Remove Inverted Write Protect flag

On 8/01/20 4:32 pm, Faiz Abbas wrote:
> The MMC/SD controllers on am65x and j721e don't in fact detect the write
> protect line as inverted. No issues were detected because of this
> because the sdwp line is not connected on any of the evms. Fix this by
> removing the flag.
>
> Fixes: 1accbced1c32 ("mmc: sdhci_am654: Add Support for 4 bit IP on J721E")
> Cc: [email protected]
> Signed-off-by: Faiz Abbas <[email protected]>

Acked-by: Adrian Hunter <[email protected]>

> ---
> drivers/mmc/host/sdhci_am654.c | 9 +++------
> 1 file changed, 3 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci_am654.c b/drivers/mmc/host/sdhci_am654.c
> index b8e897e31e2e..2d38b1e12a7e 100644
> --- a/drivers/mmc/host/sdhci_am654.c
> +++ b/drivers/mmc/host/sdhci_am654.c
> @@ -253,8 +253,7 @@ static struct sdhci_ops sdhci_am654_ops = {
>
> static const struct sdhci_pltfm_data sdhci_am654_pdata = {
> .ops = &sdhci_am654_ops,
> - .quirks = SDHCI_QUIRK_INVERTED_WRITE_PROTECT |
> - SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
> + .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
> .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
> };
>
> @@ -290,8 +289,7 @@ static struct sdhci_ops sdhci_j721e_8bit_ops = {
>
> static const struct sdhci_pltfm_data sdhci_j721e_8bit_pdata = {
> .ops = &sdhci_j721e_8bit_ops,
> - .quirks = SDHCI_QUIRK_INVERTED_WRITE_PROTECT |
> - SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
> + .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
> .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
> };
>
> @@ -314,8 +312,7 @@ static struct sdhci_ops sdhci_j721e_4bit_ops = {
>
> static const struct sdhci_pltfm_data sdhci_j721e_4bit_pdata = {
> .ops = &sdhci_j721e_4bit_ops,
> - .quirks = SDHCI_QUIRK_INVERTED_WRITE_PROTECT |
> - SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
> + .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
> .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
> };
>
>

2020-01-15 13:18:07

by Adrian Hunter

[permalink] [raw]
Subject: Re: [PATCH 3/3] mmc: sdhci_am654: Fix Command Queuing in AM65x

On 8/01/20 4:33 pm, Faiz Abbas wrote:
> Command Queuing was enabled completely for J721e controllers which lead
> to partial enablement even for Am65x. Complete CQ implementation for
> AM65x by adding the irq callback.
>
> Fixes: f545702b74f9 ("mmc: sdhci_am654: Add Support for Command Queuing Engine to J721E")
> Cc: [email protected]
> Signed-off-by: Faiz Abbas <[email protected]>

Acked-by: Adrian Hunter <[email protected]>

> ---
> drivers/mmc/host/sdhci_am654.c | 27 ++++++++++++++-------------
> 1 file changed, 14 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci_am654.c b/drivers/mmc/host/sdhci_am654.c
> index 59c0c41b3739..b8fe94fd9525 100644
> --- a/drivers/mmc/host/sdhci_am654.c
> +++ b/drivers/mmc/host/sdhci_am654.c
> @@ -256,6 +256,19 @@ static int sdhci_am654_execute_tuning(struct mmc_host *mmc, u32 opcode)
> return 0;
> }
>
> +static u32 sdhci_am654_cqhci_irq(struct sdhci_host *host, u32 intmask)
> +{
> + int cmd_error = 0;
> + int data_error = 0;
> +
> + if (!sdhci_cqe_irq(host, intmask, &cmd_error, &data_error))
> + return intmask;
> +
> + cqhci_irq(host->mmc, intmask, cmd_error, data_error);
> +
> + return 0;
> +}
> +
> static struct sdhci_ops sdhci_am654_ops = {
> .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> .get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
> @@ -264,6 +277,7 @@ static struct sdhci_ops sdhci_am654_ops = {
> .set_power = sdhci_am654_set_power,
> .set_clock = sdhci_am654_set_clock,
> .write_b = sdhci_am654_write_b,
> + .irq = sdhci_am654_cqhci_irq,
> .reset = sdhci_reset,
> };
>
> @@ -278,19 +292,6 @@ static const struct sdhci_am654_driver_data sdhci_am654_drvdata = {
> .flags = IOMUX_PRESENT | FREQSEL_2_BIT | STRBSEL_4_BIT | DLL_PRESENT,
> };
>
> -static u32 sdhci_am654_cqhci_irq(struct sdhci_host *host, u32 intmask)
> -{
> - int cmd_error = 0;
> - int data_error = 0;
> -
> - if (!sdhci_cqe_irq(host, intmask, &cmd_error, &data_error))
> - return intmask;
> -
> - cqhci_irq(host->mmc, intmask, cmd_error, data_error);
> -
> - return 0;
> -}
> -
> static struct sdhci_ops sdhci_j721e_8bit_ops = {
> .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> .get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
>

2020-01-16 14:41:37

by Ulf Hansson

[permalink] [raw]
Subject: Re: [PATCH 0/3] Fixes for Am65x controllers

On Wed, 8 Jan 2020 at 15:31, Faiz Abbas <[email protected]> wrote:
>
> The following are some fixes for sdhci_am654 driver.
>
> Patch 3 depends on patch 2.
>
> v1 of patch 2 was posted:
> https://patchwork.kernel.org/project/linux-mmc/list/?series=222279
>
> Faiz Abbas (3):
> mmc: sdhci_am654: Remove Inverted Write Protect flag
> mmc: sdhci_am654: Reset Command and Data line after tuning
> mmc: sdhci_am654: Fix Command Queuing in AM65x
>
> drivers/mmc/host/sdhci_am654.c | 54 ++++++++++++++++++++++------------
> 1 file changed, 35 insertions(+), 19 deletions(-)
>
> --
> 2.19.2
>

Applied for fixes, thanks!

Kind regards
Uffe