Re: [PATCH v2 3/3] mmc: renesas_sdhi: add eMMC HS400 mode support

2018-02-13 Thread Wolfram Sang
On Tue, Feb 13, 2018 at 12:38:44PM +0100, Simon Horman wrote:
> On Wed, Feb 07, 2018 at 11:21:44PM +0100, Wolfram Sang wrote:
> > 
> > > + /* Reset HS400 mode */
> > > + sd_ctrl_write16(host, CTL_SDIF_MODE, ~0x0001 &
> > > + sd_ctrl_read16(host, CTL_SDIF_MODE));
> > > + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2,
> > > +~(SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN |
> > > +  SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) &
> > > + sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2));
> > > +
> > 
> > This looks like code duplication. Can't we simply call
> > renesas_sdhi_reset_hs400_mode()?
> 
> Yes, thanks for noticing. I will make that so.
> 
> I think that the previous few lines, not added by this patch,
> can also be consolidated into a renesas_sdhi_reset_scc() function
> and re-used in renesas_sdhi_reset_scc().

Even better!



signature.asc
Description: PGP signature


Re: [PATCH v2 3/3] mmc: renesas_sdhi: add eMMC HS400 mode support

2018-02-13 Thread Simon Horman
On Wed, Feb 07, 2018 at 11:21:44PM +0100, Wolfram Sang wrote:
> 
> > +   /* Reset HS400 mode */
> > +   sd_ctrl_write16(host, CTL_SDIF_MODE, ~0x0001 &
> > +   sd_ctrl_read16(host, CTL_SDIF_MODE));
> > +   sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2,
> > +  ~(SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN |
> > +SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) &
> > +   sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2));
> > +
> 
> This looks like code duplication. Can't we simply call
> renesas_sdhi_reset_hs400_mode()?

Yes, thanks for noticing. I will make that so.

I think that the previous few lines, not added by this patch,
can also be consolidated into a renesas_sdhi_reset_scc() function
and re-used in renesas_sdhi_reset_scc().


Re: [PATCH v2 3/3] mmc: renesas_sdhi: add eMMC HS400 mode support

2018-02-07 Thread Wolfram Sang

> + /* Reset HS400 mode */
> + sd_ctrl_write16(host, CTL_SDIF_MODE, ~0x0001 &
> + sd_ctrl_read16(host, CTL_SDIF_MODE));
> + sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2,
> +~(SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN |
> +  SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) &
> + sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2));
> +

This looks like code duplication. Can't we simply call
renesas_sdhi_reset_hs400_mode()?



signature.asc
Description: PGP signature


[PATCH v2 3/3] mmc: renesas_sdhi: add eMMC HS400 mode support

2018-01-19 Thread Simon Horman
From: Masaharu Hayakawa 

This patch adds processing for selecting HS400 mode.

Signed-off-by: Masaharu Hayakawa 
Signed-off-by: Simon Horman 
---
v2 [Simon Horman]
* Updated to new version from BSP v3.6.0
* Dropped 4 and 8 tap differentiation as all SoCs currently supported
  by the driver in upstream use 4 taps for HS400.

v1 [Simon Horman]
* Combined patched by Ai Kyuse and Masaharu Hayakawa
* Rebase

v0 [Masaharu Hayakawa]
---
 drivers/mmc/host/renesas_sdhi_core.c | 125 ++-
 1 file changed, 110 insertions(+), 15 deletions(-)

diff --git a/drivers/mmc/host/renesas_sdhi_core.c 
b/drivers/mmc/host/renesas_sdhi_core.c
index 80943fa07db6..e3f00d051bc6 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -211,6 +211,7 @@ static int renesas_sdhi_start_signal_voltage_switch(struct 
mmc_host *mmc,
 #define SH_MOBILE_SDHI_SCC_CKSEL   0x006
 #define SH_MOBILE_SDHI_SCC_RVSCNTL 0x008
 #define SH_MOBILE_SDHI_SCC_RVSREQ  0x00A
+#define SH_MOBILE_SDHI_SCC_TMPPORT20x00E
 
 /* Definitions for values the SH_MOBILE_SDHI_SCC_DTCNTL register */
 #define SH_MOBILE_SDHI_SCC_DTCNTL_TAPENBIT(0)
@@ -223,6 +224,9 @@ static int renesas_sdhi_start_signal_voltage_switch(struct 
mmc_host *mmc,
 #define SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN   BIT(0)
 /* Definitions for values the SH_MOBILE_SDHI_SCC_RVSREQ register */
 #define SH_MOBILE_SDHI_SCC_RVSREQ_RVSERR   BIT(2)
+/* Definitions for values the SH_MOBILE_SDHI_SCC_TMPPORT2 register */
+#define SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL  BIT(4)
+#define SH_MOBILE_SDHI_SCC_TMPPORT2_HS400ENBIT(31)
 
 static inline u32 sd_scc_read32(struct tmio_mmc_host *host,
struct renesas_sdhi *priv, int addr)
@@ -243,33 +247,30 @@ static unsigned int renesas_sdhi_init_tuning(struct 
tmio_mmc_host *host)
 
priv = host_to_priv(host);
 
-   /* set sampling clock selection range */
-   sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL,
-  0x8 << SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_SHIFT);
-
/* Initialize SCC */
sd_ctrl_write32_as_16_and_16(host, CTL_STATUS, 0x0);
 
-   sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL,
-  SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN |
-  sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL));
-
sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN &
sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
 
+   /* set sampling clock selection range */
+   sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL,
+  SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN |
+  0x8 << SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_SHIFT);
+
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_CKSEL,
   SH_MOBILE_SDHI_SCC_CKSEL_DTSEL |
   sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_CKSEL));
 
-   sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
-   sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
-
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL,
   ~SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN &
   sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL));
 
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DT2FF, priv->scc_tappos);
 
+   sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
+   sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
+
/* Read TAPNUM */
return (sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL) >>
SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_SHIFT) &
@@ -285,13 +286,95 @@ static void renesas_sdhi_prepare_tuning(struct 
tmio_mmc_host *host,
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, tap);
 }
 
+static void renesas_sdhi_disable_scc(struct mmc_host *mmc)
+{
+   struct tmio_mmc_host *host = mmc_priv(mmc);
+   struct renesas_sdhi *priv = host_to_priv(host);
+
+   if (host->mmc->ios.timing == MMC_TIMING_UHS_SDR104 ||
+   host->mmc->ios.timing == MMC_TIMING_MMC_HS200 ||
+   host->mmc->ios.timing == MMC_TIMING_MMC_HS400)
+   return;
+
+   sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN &
+   sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
+
+   sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_CKSEL,
+  ~SH_MOBILE_SDHI_SCC_CKSEL_DTSEL &
+  sd_scc_read32(host, priv,
+SH_MOBILE_SDHI_SCC_CKSEL));
+
+   sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL,
+  ~SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN &
+  sd_scc_read32(host, priv,
+SH_MOBILE_SDHI_SCC_DTCNTL));
+
+   sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL,