diff mbox series

[V2] mmc: sdhci-pci: Prefer SDR25 timing for High Speed mode for BYT-based Intel controllers

Message ID 20201112133656.20317-1-adrian.hunter@intel.com (mailing list archive)
State New, archived
Headers show
Series [V2] mmc: sdhci-pci: Prefer SDR25 timing for High Speed mode for BYT-based Intel controllers | expand

Commit Message

Adrian Hunter Nov. 12, 2020, 1:36 p.m. UTC
A UHS setting of SDR25 can give better results for High Speed mode.
This is because there is no setting corresponding to high speed.  Currently
SDHCI sets no value, which means zero which is also the setting for SDR12.
There was an attempt to change this in sdhci.c but it caused problems for
some drivers, so it was reverted and the change was made to sdhci-brcmstb
in commit 2fefc7c5f7d16e ("mmc: sdhci-brcmstb: Fix incorrect switch to HS
mode").  Several other drivers also do this.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: stable@vger.kernel.org # v5.4+
---


Changes in V2:

	Expand commit message.


 drivers/mmc/host/sdhci-pci-core.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

Comments

Ulf Hansson Nov. 17, 2020, 11:50 a.m. UTC | #1
On Thu, 12 Nov 2020 at 14:37, Adrian Hunter <adrian.hunter@intel.com> wrote:
>
> A UHS setting of SDR25 can give better results for High Speed mode.
> This is because there is no setting corresponding to high speed.  Currently
> SDHCI sets no value, which means zero which is also the setting for SDR12.
> There was an attempt to change this in sdhci.c but it caused problems for
> some drivers, so it was reverted and the change was made to sdhci-brcmstb
> in commit 2fefc7c5f7d16e ("mmc: sdhci-brcmstb: Fix incorrect switch to HS
> mode").  Several other drivers also do this.
>
> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
> Cc: stable@vger.kernel.org # v5.4+

Applied for fixes, thanks!

Kind regards
Uffe


> ---
>
>
> Changes in V2:
>
>         Expand commit message.
>
>
>  drivers/mmc/host/sdhci-pci-core.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c
> index 23da7f7fe093..9552708846ca 100644
> --- a/drivers/mmc/host/sdhci-pci-core.c
> +++ b/drivers/mmc/host/sdhci-pci-core.c
> @@ -665,6 +665,15 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
>         }
>  }
>
> +static void sdhci_intel_set_uhs_signaling(struct sdhci_host *host,
> +                                         unsigned int timing)
> +{
> +       /* Set UHS timing to SDR25 for High Speed mode */
> +       if (timing == MMC_TIMING_MMC_HS || timing == MMC_TIMING_SD_HS)
> +               timing = MMC_TIMING_UHS_SDR25;
> +       sdhci_set_uhs_signaling(host, timing);
> +}
> +
>  #define INTEL_HS400_ES_REG 0x78
>  #define INTEL_HS400_ES_BIT BIT(0)
>
> @@ -721,7 +730,7 @@ static const struct sdhci_ops sdhci_intel_byt_ops = {
>         .enable_dma             = sdhci_pci_enable_dma,
>         .set_bus_width          = sdhci_set_bus_width,
>         .reset                  = sdhci_reset,
> -       .set_uhs_signaling      = sdhci_set_uhs_signaling,
> +       .set_uhs_signaling      = sdhci_intel_set_uhs_signaling,
>         .hw_reset               = sdhci_pci_hw_reset,
>  };
>
> @@ -731,7 +740,7 @@ static const struct sdhci_ops sdhci_intel_glk_ops = {
>         .enable_dma             = sdhci_pci_enable_dma,
>         .set_bus_width          = sdhci_set_bus_width,
>         .reset                  = sdhci_cqhci_reset,
> -       .set_uhs_signaling      = sdhci_set_uhs_signaling,
> +       .set_uhs_signaling      = sdhci_intel_set_uhs_signaling,
>         .hw_reset               = sdhci_pci_hw_reset,
>         .irq                    = sdhci_cqhci_irq,
>  };
> --
> 2.17.1
>
diff mbox series

Patch

diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c
index 23da7f7fe093..9552708846ca 100644
--- a/drivers/mmc/host/sdhci-pci-core.c
+++ b/drivers/mmc/host/sdhci-pci-core.c
@@ -665,6 +665,15 @@  static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
 	}
 }
 
+static void sdhci_intel_set_uhs_signaling(struct sdhci_host *host,
+					  unsigned int timing)
+{
+	/* Set UHS timing to SDR25 for High Speed mode */
+	if (timing == MMC_TIMING_MMC_HS || timing == MMC_TIMING_SD_HS)
+		timing = MMC_TIMING_UHS_SDR25;
+	sdhci_set_uhs_signaling(host, timing);
+}
+
 #define INTEL_HS400_ES_REG 0x78
 #define INTEL_HS400_ES_BIT BIT(0)
 
@@ -721,7 +730,7 @@  static const struct sdhci_ops sdhci_intel_byt_ops = {
 	.enable_dma		= sdhci_pci_enable_dma,
 	.set_bus_width		= sdhci_set_bus_width,
 	.reset			= sdhci_reset,
-	.set_uhs_signaling	= sdhci_set_uhs_signaling,
+	.set_uhs_signaling	= sdhci_intel_set_uhs_signaling,
 	.hw_reset		= sdhci_pci_hw_reset,
 };
 
@@ -731,7 +740,7 @@  static const struct sdhci_ops sdhci_intel_glk_ops = {
 	.enable_dma		= sdhci_pci_enable_dma,
 	.set_bus_width		= sdhci_set_bus_width,
 	.reset			= sdhci_cqhci_reset,
-	.set_uhs_signaling	= sdhci_set_uhs_signaling,
+	.set_uhs_signaling	= sdhci_intel_set_uhs_signaling,
 	.hw_reset		= sdhci_pci_hw_reset,
 	.irq			= sdhci_cqhci_irq,
 };