All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH/RFT 0/3] mmc: renesas_sdhi: Add eMMC HS400 mode support
@ 2017-12-05 12:37 Simon Horman
  2017-12-05 12:37 ` [PATCH/RFT 1/3] mmc: tmio: " Simon Horman
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Simon Horman @ 2017-12-05 12:37 UTC (permalink / raw
  To: Wolfram Sang, Ulf Hansson
  Cc: Magnus Damm, linux-mmc, linux-renesas-soc, Simon Horman

Hi,

this short series represents work-in-progress to add eMMC HS400
support to the SDHI driver and enable the feature on the
R-Car Gen3 based Salvator-X* boards.

As it stands this series seems to need more work:
* H3 ES1.0/Salvator-X appears slightly slower with this work that without
* M3-W ES1.0/Salvator-X and H3 ES2.0/Salvator-XS does not initialise
  the eMMC with this work present

Test results are provided at the end of this email including tests run with
the BSP v4.5.9 (which seems to work well).

Work on this series had been hindered to some extend by instability of eMMC
without these patches in my environment as reported in "Possible regression
due to "arm64: renesas: salvator: set driver type for eMMC"".


The base used for testing these patches was:
* A merge of renesas-devel-20171205-v4.15-rc2 and mmc/next; and
* Reversion of d3decc2c34c8 ("arm64: dts: renesas: salvator: set driver type for eMMC")
* "[PATCH] mmc: core: properly init drv_type"

To aid testing this patchset is available in git as a topic branch

https://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git topic/sdhi-hs400

And the base is available as:

https://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git topic/sdhi-hs400.base


Ai Kyuse (2):
  mmc: tmio: Add eMMC HS400 mode support
  mmc: renesas_sdhi: Add eMMC HS400 mode support

Takeshi Kihara (1):
  arm64: dts: salvator-common: Enable HS400 of SDHI2

 arch/arm64/boot/dts/renesas/salvator-common.dtsi |   1 +
 drivers/mmc/host/renesas_sdhi_core.c             | 123 ++++++++++++++++++++---
 drivers/mmc/host/tmio_mmc.h                      |   5 +
 drivers/mmc/host/tmio_mmc_core.c                 |  29 +++++-
 4 files changed, 140 insertions(+), 18 deletions(-)

-- 
2.11.0


TEST DATA


H3 ES1.0 / Salvator-X
=====================

H3 ES1.0: BSP v3.5.9 (hs400 not enabled in BSP)
-----------------------------------------------

# dmesg | grep mmc
[    2.594980] sh_mobile_sdhi ee140000.sd: mmc0 base at 0xee140000 max
clock rate 200 MHz
[    2.721370] mmc0: new HS200 MMC card at address 0001
[    2.723478] mmcblk0: mmc0:0001 BGSD3R 29.1 GiB 
[    2.723627] mmcblk0boot0: mmc0:0001 BGSD3R partition 1 16.0 MiB
[    2.723757] mmcblk0boot1: mmc0:0001 BGSD3R partition 2 16.0 MiB
[    2.723880] mmcblk0rpmb: mmc0:0001 BGSD3R partition 3 4.00 MiB

# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=1024 iflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 13.2866 s, 80.8 MB/s

H3 ES1.0: BSP v3.5.9, hs400 enabled
-----------------------------------

# dmesg | grep mmc
[    2.601743] sh_mobile_sdhi ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    2.721647] mmc0: new HS400 MMC card at address 0001
[    2.726294] mmcblk0: mmc0:0001 BGSD3R 29.1 GiB 
[    2.730460] mmcblk0boot0: mmc0:0001 BGSD3R partition 1 16.0 MiB
[    2.734598] mmcblk0boot1: mmc0:0001 BGSD3R partition 2 16.0 MiB
[    2.738731] mmcblk0rpmb: mmc0:0001 BGSD3R partition 3 4.00 MiB
...

# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=2048 iflag=direct
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 15.7728 s, 136 MB/s

H3 ES1.0: Before (345fad481b8 topic/sdhi-hs400.base)
----------------------------------------------------

# dmesg | grep mmc
[    2.561404] renesas_sdhi_internal_dmac ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    2.681408] mmc0: new HS200 MMC card at address 0001
[    2.688103] mmcblk0: mmc0:0001 BGSD3R 29.1 GiB 
[    2.693249] mmcblk0boot0: mmc0:0001 BGSD3R partition 1 16.0 MiB
[    2.719066] mmcblk0boot1: mmc0:0001 BGSD3R partition 2 16.0 MiB
[    2.719587] mmcblk0rpmb: mmc0:0001 BGSD3R partition 3 4.00 MiB, chardev (243:0)
...

# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=512 iflag=direct
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 10.3295 s, 52.0 MB/s

H3 ES1.0: After (010c62827298 topic/sdhi-hs400)
-----------------------------------------------

root@Debian:~# dmesg | grep mmc
[    2.437400] renesas_sdhi_internal_dmac ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    2.530669] mmc0: new HS400 MMC card at address 0001
[    2.531998] mmcblk0: mmc0:0001 BGSD3R 29.1 GiB 
[    2.532529] mmcblk0boot0: mmc0:0001 BGSD3R partition 1 16.0 MiB
[    2.532941] mmcblk0boot1: mmc0:0001 BGSD3R partition 2 16.0 MiB
[    2.533460] mmcblk0rpmb: mmc0:0001 BGSD3R partition 3 4.00 MiB, chardev (243:0)
...

root@Debian:~# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=64 iflag=direct
64+0 records in
64+0 records out
67108864 bytes (67 MB) copied, 1.34285 s, 50.0 MB/s

M3-W ES1.0 / Salvator-X
=======================

M3-W ES1.0: BSP v3.5.9 (hs400 enabled in BSP)
---------------------------------------------

# dmesg | grep mmc
[    2.335990] sh_mobile_sdhi ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    2.533513] mmc0: new HS400 MMC card at address 0001
[    2.547956] mmcblk0: mmc0:0001 eMMC   28.8 GiB 
[    2.559903] mmcblk0boot0: mmc0:0001 eMMC   partition 1 4.00 MiB
[    2.575909] mmcblk0boot1: mmc0:0001 eMMC   partition 2 4.00 MiB
[    2.599020] mmcblk0rpmb: mmc0:0001 eMMC   partition 3 4.00 MiB
[    2.619400]  mmcblk0: p1
...

# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=512 iflag=direct
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 10.1324 s, 53.0 MB/s

M3-W ES1.0: BSP v3.5.9, hs400 disabled
--------------------------------------

# dmesg | grep mmc
[    2.354686] sh_mobile_sdhi ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    3.064544] mmc0: new HS200 MMC card at address 0001
[    3.070070] mmcblk0: mmc0:0001 eMMC   28.8 GiB 
[    3.074814] mmcblk0boot0: mmc0:0001 eMMC   partition 1 4.00 MiB
[    3.100849] mmcblk0boot1: mmc0:0001 eMMC   partition 2 4.00 MiB
[    3.107005] mmcblk0rpmb: mmc0:0001 eMMC   partition 3 4.00 MiB
[    3.122783]  mmcblk0: p1

# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=512 iflag=direct
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 10.2417 s, 52.4 MB/s

M3-W ES1.0: Before (345fad481b8 topic/sdhi-hs400.base)
------------------------------------------------------

# dmesg | grep mmc
[    1.878735] renesas_sdhi_internal_dmac ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    2.029867] mmc0: new HS200 MMC card at address 0001
[    2.031282] mmcblk0: mmc0:0001 eMMC   28.8 GiB 
[    2.031773] mmcblk0boot0: mmc0:0001 eMMC   partition 1 4.00 MiB
[    2.032197] mmcblk0boot1: mmc0:0001 eMMC   partition 2 4.00 MiB
[    2.032941] mmcblk0rpmb: mmc0:0001 eMMC   partition 3 4.00 MiB, chardev (243:0)
[    2.039922]  mmcblk0: p1
...

# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=512 iflag=direct
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 11.2138 s, 47.9 MB/s

H3-W ES1.0: After (010c62827298 topic/sdhi-hs400)
-------------------------------------------------

# dmesg | grep mmc
[    1.884618] renesas_sdhi_internal_dmac ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    2.044911] mmc0: new HS400 MMC card at address 0001
[    2.046374] mmcblk0: mmc0:0001 eMMC   28.8 GiB 
[    2.046875] mmcblk0boot0: mmc0:0001 eMMC   partition 1 4.00 MiB
[    2.047386] mmcblk0boot1: mmc0:0001 eMMC   partition 2 4.00 MiB
[    2.048163] mmcblk0rpmb: mmc0:0001 eMMC   partition 3 4.00 MiB, chardev (243:0)
[    2.249641] print_req_error: I/O error, dev mmcblk0, sector 0
[    2.251433] Buffer I/O error on dev mmcblk0, logical block 0, async page read
[    2.328775] print_req_error: I/O error, dev mmcblk0, sector 0
[    2.336424] Buffer I/O error on dev mmcblk0, logical block 0, async page read
[    2.343742]  mmcblk0: unable to read partition table
...
[   11.533287] mmc0: tuning execution failed: -5
[   11.672124] mmc0: tuning execution failed: -5
[   11.678307] mmc0: tried to reset card, got error -5
[   11.693848] print_req_error: I/O error, dev mmcblk0, sector 0
[   11.710474] print_req_error: I/O error, dev mmcblk0, sector 1
[   11.722104] print_req_error: I/O error, dev mmcblk0, sector 2
[   11.738357] print_req_error: I/O error, dev mmcblk0, sector 4
[   11.746710] print_req_error: I/O error, dev mmcblk0, sector 5
[   11.754399] print_req_error: I/O error, dev mmcblk0, sector 6
[   11.763664] print_req_error: I/O error, dev mmcblk0, sector 7
[   11.774534] print_req_error: I/O error, dev mmcblk0, sector 0
[   11.782452] print_req_error: I/O error, dev mmcblk0, sector 1
[   11.790411] print_req_error: I/O error, dev mmcblk0, sector 2
[   11.800623] Buffer I/O error on dev mmcblk0, logical block 0, async page read
[   11.862566] mmc0: cache flush error -74
[   11.972587] mmc0: tuning execution failed: -5
[   11.978324] mmc0: tried to reset card, got error -5
[   11.999404] Buffer I/O error on dev mmcblk0boot1, logical block 1008, async page read
[   12.010950] mmc0: cache flush error -74
[   12.133609] mmc0: tuning execution failed: -5
[   12.140934] mmc0: tried to reset card, got error -5
[   12.155970] Buffer I/O error on dev mmcblk0boot0, logical block 1008, async page read

# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=64 iflag=direct
[   59.251014] print_req_error: 37 callbacks suppressed
[   59.251030] print_req_error: I/O error, dev mmcblk0, sector 0
[   59.262269] print_req_error: I/O error, dev mmcblk0, sector 1
[   59.269016] print_req_error: I/O error, dev mmcblk0, sector 2
[   59.275174] print_req_error: I/O error, dev mmcblk0, sector 3
[   59.281250] print_req_error: I/O error, dev mmcblk0, sector 4
[   59.287328] print_req_error: I/O error, dev mmcblk0, sector 5
[   59.293387] print_req_error: I/O error, dev mmcblk0, sector 6
[   59.299496] print_req_error: I/O error, dev mmcblk0, sector 7
[   59.305737] print_req_error: I/O error, dev mmcblk0, sector 8
[   59.311738] print_req_error: I/O error, dev mmcblk0, sector 9
dd: error reading '/dev/mmcblk0': Input/output error
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.391551 s, 0.0 kB/s

H3 ES2.0 / Salvator-XS
======================

H3 ES2.0: BSP v3.5.9 (hs400 enabled in BSP)
-------------------------------------------

# dmesg | grep mmc
[    2.731653] sh_mobile_sdhi ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    3.417988] mmc0: new HS400 MMC card at address 0001
[    3.418291] mmcblk0: mmc0:0001 BGSD3R 29.1 GiB 
[    3.418397] mmcblk0boot0: mmc0:0001 BGSD3R partition 1 16.0 MiB
[    3.418499] mmcblk0boot1: mmc0:0001 BGSD3R partition 2 16.0 MiB
[    3.418595] mmcblk0rpmb: mmc0:0001 BGSD3R partition 3 4.00 MiB
...

# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=2048 iflag=direct 
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 9.09945 s, 236 MB/s

H3 ES2.0: BSP v3.5.9, hs400 disabled
------------------------------------

# dmesg | grep mmc
[    2.744042] sh_mobile_sdhi ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    2.861917] mmc0: new HS200 MMC card at address 0001
[    2.868087] mmcblk0: mmc0:0001 BGSD3R 29.1 GiB 
[    2.868202] mmcblk0boot0: mmc0:0001 BGSD3R partition 1 16.0 MiB
[    2.872312] mmcblk0boot1: mmc0:0001 BGSD3R partition 2 16.0 MiB
[    2.876423] mmcblk0rpmb: mmc0:0001 BGSD3R partition 3 4.00 MiB
...

# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=2048 iflag=direct
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 14.1931 s, 151 MB/s

H3 ES2.0: Before (345fad481b8 topic/sdhi-hs400.base)
----------------------------------------------------

# dmesg | grep mmc
[    2.518906] renesas_sdhi_internal_dmac ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    2.608745] mmc0: new HS200 MMC card at address 0001
[    2.609641] mmcblk0: mmc0:0001 BGSD3R 29.1 GiB 
[    2.609984] mmcblk0boot0: mmc0:0001 BGSD3R partition 1 16.0 MiB
[    2.610330] mmcblk0boot1: mmc0:0001 BGSD3R partition 2 16.0 MiB
[    2.610719] mmcblk0rpmb: mmc0:0001 BGSD3R partition 3 4.00 MiB, chardev (243:0)
...

# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=512 iflag=direct
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 8.32918 s, 64.5 MB/s

H3 ES2.0: After (010c62827298 topic/sdhi-hs400)
-----------------------------------------------

root@Debian:~# dmesg | grep mmc
[    2.518244] renesas_sdhi_internal_dmac ee140000.sd: mmc0 base at 0xee140000 max clock rate 200 MHz
[    2.700219] mmc0: new HS400 MMC card at address 0001
[    2.701193] mmcblk0: mmc0:0001 BGSD3R 29.1 GiB 
[    2.701548] mmcblk0boot0: mmc0:0001 BGSD3R partition 1 16.0 MiB
[    2.701880] mmcblk0boot1: mmc0:0001 BGSD3R partition 2 16.0 MiB
[    2.702274] mmcblk0rpmb: mmc0:0001 BGSD3R partition 3 4.00 MiB, chardev (243:0)
[    2.726711] mmc0: mmc_select_hs400 failed, error -84
[    2.901629] mmc0: mmc_select_hs400 failed, error -84
[    2.930620] mmc0: mmc_select_hs400 failed, error -84
[    2.937035] mmcblk0: error -84 requesting status
...
[    3.111482] mmc0: tuning execution failed: -5
[    3.116838] mmc0: tried to reset card, got error -5
[    3.122749] mmcblk0: recovery failed!
[    3.127499] print_req_error: I/O error, dev mmcblk0, sector 0
[    3.134288] Buffer I/O error on dev mmcblk0, logical block 0, async page read
[    3.143073]  mmcblk0: unable to read partition table
[    3.178781] renesas_sdhi_internal_dmac ee160000.sd: mmc2 base at 0xee160000 max clock rate 200 MHz
...

root@Debian:~# dd if=/dev/mmcblk0 of=/dev/null bs=1M count=64 iflag=direct
64+0 records in
64+0 records out
67108864 bytes (67 MB) copied, 1.66178 s, 40.4 MB/s

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

* [PATCH/RFT 1/3] mmc: tmio: Add eMMC HS400 mode support
  2017-12-05 12:37 [PATCH/RFT 0/3] mmc: renesas_sdhi: Add eMMC HS400 mode support Simon Horman
@ 2017-12-05 12:37 ` Simon Horman
  2017-12-05 12:37 ` [PATCH/RFT 2/3] mmc: renesas_sdhi: " Simon Horman
  2017-12-05 12:37 ` [PATCH/RFT 3/3] arm64: dts: salvator-common: Enable HS400 of SDHI2 Simon Horman
  2 siblings, 0 replies; 4+ messages in thread
From: Simon Horman @ 2017-12-05 12:37 UTC (permalink / raw
  To: Wolfram Sang, Ulf Hansson
  Cc: Magnus Damm, linux-mmc, linux-renesas-soc, Ai Kyuse,
	Masaharu Hayakawa, Simon Horman

From: Ai Kyuse <ai.kyuse.uw@renesas.com>

Add eMMC HS400 support to the core TMIO code.

Regarding tuning: Tune in HS200 mode before changing to HS400 mode.  When
retuning, return to HS200 mode and tune.  HS400 and HS200/SDR104 have
different CPG settings, HS400 sets to 400MHz to distinguish the CPG
settings.

Signed-off-by: Ai Kyuse <ai.kyuse.uw@renesas.com>
Signed-off-by: Masaharu Hayakawa <masaharu.hayakawa.ry@renesas.com>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
---
v1 [Simon Horman]
- Combined patches by Ai Kyuse and Masaharu Hayakawa.
- Rebase
- Minor clean-up

v0 [Ai Kyuse]
---
 drivers/mmc/host/tmio_mmc.h      |  5 +++++
 drivers/mmc/host/tmio_mmc_core.c | 29 +++++++++++++++++++++++++++--
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/host/tmio_mmc.h b/drivers/mmc/host/tmio_mmc.h
index 3e6ff8921440..60f5935db368 100644
--- a/drivers/mmc/host/tmio_mmc.h
+++ b/drivers/mmc/host/tmio_mmc.h
@@ -46,6 +46,7 @@
 #define CTL_DMA_ENABLE 0xd8
 #define CTL_RESET_SD 0xe0
 #define CTL_VERSION 0xe2
+#define CTL_SDIF_MODE 0xe6
 #define CTL_SDIO_REGS 0x100
 #define CTL_CLK_AND_WAIT_CTL 0x138
 #define CTL_RESET_SDIO 0x1e0
@@ -203,6 +204,10 @@ struct tmio_mmc_host {
 	/* Tuning values: 1 for success, 0 for failure */
 	DECLARE_BITMAP(taps, BITS_PER_BYTE * sizeof(long));
 	unsigned int tap_num;
+	unsigned long tap_set;
+	void (*prepare_hs400_tuning)(struct mmc_host *mmc, struct mmc_ios *ios);
+	void (*reset_hs400_mode)(struct mmc_host *mmc);
+	void (*disable_scc)(struct mmc_host *mmc);
 
 	const struct tmio_mmc_dma_ops *dma_ops;
 };
diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c
index d6ca57be16c2..a65c10302904 100644
--- a/drivers/mmc/host/tmio_mmc_core.c
+++ b/drivers/mmc/host/tmio_mmc_core.c
@@ -199,6 +199,13 @@ static void tmio_mmc_set_clock(struct tmio_mmc_host *host,
 		tmio_mmc_clk_stop(host);
 		return;
 	}
+	/*
+	 * Both HS400 and HS200/SD104 set 200MHz, but HS400 sets 400MHz
+	 * to distinguish the CPG settings.
+	 */
+	if (host->mmc->ios.timing == MMC_TIMING_MMC_HS400 &&
+			new_clock == 200000000)
+		new_clock = 400000000;
 
 	if (host->clk_update)
 		clock = host->clk_update(host, new_clock) / 512;
@@ -209,8 +216,13 @@ static void tmio_mmc_set_clock(struct tmio_mmc_host *host,
 		clock <<= 1;
 
 	/* 1/1 clock is option */
-	if ((host->pdata->flags & TMIO_MMC_CLK_ACTUAL) && ((clk >> 22) & 0x1))
-		clk |= 0xff;
+	if ((host->pdata->flags & TMIO_MMC_CLK_ACTUAL) &&
+	    ((clk >> 22) & 0x1)) {
+		if (!(host->mmc->ios.timing == MMC_TIMING_MMC_HS400))
+			clk |= 0xff;
+		else
+			clk &= ~0xff;
+	}
 
 	if (host->set_clk_div)
 		host->set_clk_div(host->pdev, (clk >> 22) & 1);
@@ -1015,6 +1027,15 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 	struct device *dev = &host->pdev->dev;
 	unsigned long flags;
 
+
+	if (ios->timing != MMC_TIMING_UHS_SDR104 &&
+	    ios->timing != MMC_TIMING_MMC_HS200 &&
+	    ios->timing != MMC_TIMING_MMC_HS400 && host->disable_scc)
+		host->disable_scc(mmc);
+
+	if (ios->timing != MMC_TIMING_MMC_HS400 && host->reset_hs400_mode)
+		host->reset_hs400_mode(mmc);
+
 	mutex_lock(&host->ios_lock);
 
 	spin_lock_irqsave(&host->lock, flags);
@@ -1065,6 +1086,10 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 			"%s.%d: IOS interrupted: clk %u, mode %u",
 			current->comm, task_pid_nr(current),
 			ios->clock, ios->power_mode);
+
+	if (ios->timing == MMC_TIMING_MMC_HS400 && host->prepare_hs400_tuning)
+		host->prepare_hs400_tuning(mmc, ios);
+
 	host->mrq = NULL;
 
 	host->clk_cache = ios->clock;
-- 
2.11.0

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

* [PATCH/RFT 2/3] mmc: renesas_sdhi: Add eMMC HS400 mode support
  2017-12-05 12:37 [PATCH/RFT 0/3] mmc: renesas_sdhi: Add eMMC HS400 mode support Simon Horman
  2017-12-05 12:37 ` [PATCH/RFT 1/3] mmc: tmio: " Simon Horman
@ 2017-12-05 12:37 ` Simon Horman
  2017-12-05 12:37 ` [PATCH/RFT 3/3] arm64: dts: salvator-common: Enable HS400 of SDHI2 Simon Horman
  2 siblings, 0 replies; 4+ messages in thread
From: Simon Horman @ 2017-12-05 12:37 UTC (permalink / raw
  To: Wolfram Sang, Ulf Hansson
  Cc: Magnus Damm, linux-mmc, linux-renesas-soc, Ai Kyuse,
	Masaharu Hayakawa, Simon Horman

From: Ai Kyuse <ai.kyuse.uw@renesas.com>

Add eMMC HS400 support to SDHI driver.

In this mode of operation tuning uses 4 taps rather than 8 on
hardware currently supported in mainline.

Signed-off-by: Ai Kyuse <ai.kyuse.uw@renesas.com>
Signed-off-by: Masaharu Hayakawa <masaharu.hayakawa.ry@renesas.com>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
---
v1 [Simon Horman]
- Combined patched by Ai Kyuse and Masaharu Hayakawa
- Rebase

v0 [Ai Kyuse]
---
 drivers/mmc/host/renesas_sdhi_core.c | 123 ++++++++++++++++++++++++++++++-----
 1 file changed, 107 insertions(+), 16 deletions(-)

diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index fcf7235d5742..73b963e506ab 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -223,6 +223,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_TMPPORT2	0x00E
 
 /* Definitions for values the SH_MOBILE_SDHI_SCC_DTCNTL register */
 #define SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN		BIT(0)
@@ -235,6 +236,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_HS400EN	BIT(31)
+#define SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL	BIT(4)
 
 static inline u32 sd_scc_read32(struct tmio_mmc_host *host,
 				struct renesas_sdhi *priv, int addr)
@@ -249,39 +253,57 @@ static inline void sd_scc_write32(struct tmio_mmc_host *host,
 	writel(val, priv->scc_ctl + (addr << host->bus_shift));
 }
 
+
+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);
+
+	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, CLK_CTL_SCLKEN |
+	sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
+}
+
 static unsigned int renesas_sdhi_init_tuning(struct tmio_mmc_host *host)
 {
 	struct renesas_sdhi *priv;
 
 	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, host->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) &
@@ -297,13 +319,69 @@ 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_prepare_hs400_tuning(struct mmc_host *mmc,
+					struct mmc_ios *ios)
+{
+	struct tmio_mmc_host *host = mmc_priv(mmc);
+	struct renesas_sdhi *priv = host_to_priv(host);
+
+	sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN &
+			sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
+
+	/* Set 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));
+
+
+	/* HS400 mode sets sampling clock selection range to 4 */
+	sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL,
+		       SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN |
+		       0x4 << SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_SHIFT);
+
+	sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET,
+		       host->tap_set / 2);
+
+	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));
+}
+
+static void renesas_sdhi_reset_hs400_mode(struct mmc_host *mmc)
+{
+	struct tmio_mmc_host *host = mmc_priv(mmc);
+	struct renesas_sdhi *priv = host_to_priv(host);
+
+	if (!priv->scc_ctl)
+		return;
+
+	sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN &
+			sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
+
+	/* 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));
+
+	sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
+			sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
+}
+
 #define SH_MOBILE_SDHI_MAX_TAP 3
 
 static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host)
 {
 	struct renesas_sdhi *priv = host_to_priv(host);
 	unsigned long tap_cnt;  /* counter of tuning success */
-	unsigned long tap_set;  /* tap position */
 	unsigned long tap_start;/* start position of tuning success */
 	unsigned long tap_end;  /* end position of tuning success */
 	unsigned long ntap;     /* temporary counter of tuning success */
@@ -341,12 +419,12 @@ static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host)
 	}
 
 	if (tap_cnt >= SH_MOBILE_SDHI_MAX_TAP)
-		tap_set = (tap_start + tap_end) / 2 % host->tap_num;
+		host->tap_set = (tap_start + tap_end) / 2 % host->tap_num;
 	else
 		return -EIO;
 
 	/* Set SCC */
-	sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, tap_set);
+	sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, host->tap_set);
 
 	/* Enable auto re-tuning */
 	sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL,
@@ -387,6 +465,14 @@ static void renesas_sdhi_hw_reset(struct tmio_mmc_host *host)
 		       ~SH_MOBILE_SDHI_SCC_CKSEL_DTSEL &
 		       sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_CKSEL));
 
+	/* 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));
+
 	sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
 			sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
 
@@ -597,7 +683,8 @@ int renesas_sdhi_probe(struct platform_device *pdev,
 	/* Enable tuning iff we have an SCC and a supported mode */
 	if (of_data && of_data->scc_offset &&
 	    (host->mmc->caps & MMC_CAP_UHS_SDR104 ||
-	     host->mmc->caps2 & MMC_CAP2_HS200_1_8V_SDR)) {
+	     host->mmc->caps2 & (MMC_CAP2_HS200_1_8V_SDR |
+				 MMC_CAP2_HS400_1_8V))) {
 		const struct renesas_sdhi_scc *taps = of_data->taps;
 		bool hit = false;
 
@@ -619,8 +706,12 @@ int renesas_sdhi_probe(struct platform_device *pdev,
 		host->init_tuning = renesas_sdhi_init_tuning;
 		host->prepare_tuning = renesas_sdhi_prepare_tuning;
 		host->select_tuning = renesas_sdhi_select_tuning;
-		host->check_scc_error = renesas_sdhi_check_scc_error;
+		if (!(host->mmc->caps2 & MMC_CAP2_HS400_1_8V))
+			host->check_scc_error = renesas_sdhi_check_scc_error;
 		host->hw_reset = renesas_sdhi_hw_reset;
+		host->disable_scc = renesas_sdhi_disable_scc;
+		host->prepare_hs400_tuning = renesas_sdhi_prepare_hs400_tuning;
+		host->reset_hs400_mode = renesas_sdhi_reset_hs400_mode;
 	}
 
 	i = 0;
-- 
2.11.0

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

* [PATCH/RFT 3/3] arm64: dts: salvator-common: Enable HS400 of SDHI2
  2017-12-05 12:37 [PATCH/RFT 0/3] mmc: renesas_sdhi: Add eMMC HS400 mode support Simon Horman
  2017-12-05 12:37 ` [PATCH/RFT 1/3] mmc: tmio: " Simon Horman
  2017-12-05 12:37 ` [PATCH/RFT 2/3] mmc: renesas_sdhi: " Simon Horman
@ 2017-12-05 12:37 ` Simon Horman
  2 siblings, 0 replies; 4+ messages in thread
From: Simon Horman @ 2017-12-05 12:37 UTC (permalink / raw
  To: Wolfram Sang, Ulf Hansson
  Cc: Magnus Damm, linux-mmc, linux-renesas-soc, Takeshi Kihara,
	Simon Horman

From: Takeshi Kihara <takeshi.kihara.df@renesas.com>

This patch adds the mmc-hs400-1_8v property to SDHI2 and enable eMMC
HS400.

Signed-off-by: Takeshi Kihara <takeshi.kihara.df@renesas.com>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
---
v1 [Simon Horman]
* Rebase

v0 [Takeshi Kihara]
---
 arch/arm64/boot/dts/renesas/salvator-common.dtsi | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/boot/dts/renesas/salvator-common.dtsi b/arch/arm64/boot/dts/renesas/salvator-common.dtsi
index 3f9170b30b5b..66eaa23500a9 100644
--- a/arch/arm64/boot/dts/renesas/salvator-common.dtsi
+++ b/arch/arm64/boot/dts/renesas/salvator-common.dtsi
@@ -624,6 +624,7 @@
 	vqmmc-supply = <&reg_1p8v>;
 	bus-width = <8>;
 	mmc-hs200-1_8v;
+	mmc-hs400-1_8v;
 	non-removable;
 	status = "okay";
 };
-- 
2.11.0

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

end of thread, other threads:[~2017-12-05 12:38 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-12-05 12:37 [PATCH/RFT 0/3] mmc: renesas_sdhi: Add eMMC HS400 mode support Simon Horman
2017-12-05 12:37 ` [PATCH/RFT 1/3] mmc: tmio: " Simon Horman
2017-12-05 12:37 ` [PATCH/RFT 2/3] mmc: renesas_sdhi: " Simon Horman
2017-12-05 12:37 ` [PATCH/RFT 3/3] arm64: dts: salvator-common: Enable HS400 of SDHI2 Simon Horman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.