All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e
@ 2020-02-26  8:14 ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 01/11] mmc: Add a saved_clock member Faiz Abbas
                     ` (11 more replies)
  0 siblings, 12 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

The following patches add support for eMMC boot in TI's Am65x and J721e
devices.

v3:
1. Added a patch to fix a clash between two dummy clocks of the same
name in k3-j721e-r5-common-proc-board.dtb
2. Converted the init() API patch to two patches adding deferred_probe()
APIs to the mmc core and sdhci layers respectively.
3. Fixed up config_pm_pre_callback() call order in patch 9. 

v2:
1. Reordered the patches according to Lokesh's preference
2. Fixed patch 2 breaking platforms where DM_MMC is not enabled.

Faiz Abbas (11):
  mmc: Add a saved_clock member
  mmc: Add a deferred_probe() API
  sdhci: Add sdhci_deferred_probe() API
  mmc: Merge SD_LEGACY and MMC_LEGACY bus modes
  mmc: am654_sdhci: Update output tap delay writes
  mmc: am654_sdhci: Implement workaround for card detect
  spl: mmc: Fix spl_mmc_get_uboot_raw_sector() implementation
  arm: K3: sysfw-loader: Add a config_pm_pre_callback()
  arm: dts: k3-j721e-r5-common-proc-board: Use unique names for dummy
    clocks
  configs: am65x_evm: Add CONFIG_SUPPORT_EMMC_BOOT
  configs: j721e_evm: Add Support for eMMC boot

 arch/arm/dts/k3-am65-main.dtsi                |  12 +-
 arch/arm/dts/k3-am654-base-board-u-boot.dtsi  |  11 +-
 arch/arm/dts/k3-j721e-main.dtsi               |  15 +-
 .../arm/dts/k3-j721e-r5-common-proc-board.dts |   4 +-
 arch/arm/mach-imx/imx8/image.c                |   3 +-
 arch/arm/mach-k3/am6_init.c                   |  33 +++-
 arch/arm/mach-k3/include/mach/sysfw-loader.h  |   2 +-
 arch/arm/mach-k3/j721e_init.c                 |  33 +++-
 arch/arm/mach-k3/sysfw-loader.c               |   6 +-
 common/spl/spl_mmc.c                          |  11 +-
 configs/am65x_evm_a53_defconfig               |   1 +
 configs/am65x_evm_r5_defconfig                |   1 +
 configs/j721e_evm_a72_defconfig               |   3 +
 configs/j721e_evm_r5_defconfig                |   3 +
 drivers/mmc/am654_sdhci.c                     | 173 +++++++++++++-----
 drivers/mmc/fsl_esdhc_imx.c                   |   1 -
 drivers/mmc/mmc-uclass.c                      |  15 ++
 drivers/mmc/mmc.c                             |  20 +-
 drivers/mmc/omap_hsmmc.c                      |   1 -
 drivers/mmc/sdhci.c                           |  15 ++
 drivers/mmc/zynq_sdhci.c                      |   1 -
 include/configs/am65x_evm.h                   |   2 -
 include/mmc.h                                 |  12 +-
 include/sdhci.h                               |   1 +
 24 files changed, 298 insertions(+), 81 deletions(-)

-- 
2.19.2

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

* [PATCH v3 01/11] mmc: Add a saved_clock member
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 02/11] mmc: Add a deferred_probe() API Faiz Abbas
                     ` (10 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

Add a saved_clock member to struct mmc to store the previous clock speed
in the clock needs to be stopped for some time.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 include/mmc.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/mmc.h b/include/mmc.h
index 71e2e1735a..d0fa7689c9 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -603,6 +603,7 @@ struct mmc {
 	bool clk_disable; /* true if the clock can be turned off */
 	uint bus_width;
 	uint clock;
+	uint saved_clock;
 	enum mmc_voltage signal_voltage;
 	uint card_caps;
 	uint host_caps;
-- 
2.19.2

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

* [PATCH v3 02/11] mmc: Add a deferred_probe() API
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 01/11] mmc: Add a saved_clock member Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 03/11] sdhci: Add sdhci_deferred_probe() API Faiz Abbas
                     ` (9 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

Add a deferred_probe() API for platforms that want to do some
configurations just before starting to enumerate the device.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
---
 drivers/mmc/mmc-uclass.c | 15 +++++++++++++++
 drivers/mmc/mmc.c        |  4 +++-
 include/mmc.h            | 10 ++++++++++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
index 0b90a97650..c75892a72c 100644
--- a/drivers/mmc/mmc-uclass.c
+++ b/drivers/mmc/mmc-uclass.c
@@ -138,6 +138,21 @@ int mmc_host_power_cycle(struct mmc *mmc)
 	return dm_mmc_host_power_cycle(mmc->dev);
 }
 
+int dm_mmc_deferred_probe(struct udevice *dev)
+{
+	struct dm_mmc_ops *ops = mmc_get_ops(dev);
+
+	if (ops->deferred_probe)
+		return ops->deferred_probe(dev);
+
+	return 0;
+}
+
+int mmc_deferred_probe(struct mmc *mmc)
+{
+	return dm_mmc_deferred_probe(mmc->dev);
+}
+
 int mmc_of_parse(struct udevice *dev, struct mmc_config *cfg)
 {
 	int val;
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index b50fcbf6cf..a347308976 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -2845,7 +2845,9 @@ int mmc_start_init(struct mmc *mmc)
 	 */
 	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(SD_LEGACY) |
 			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
-
+#if CONFIG_IS_ENABLED(DM_MMC)
+	mmc_deferred_probe(mmc);
+#endif
 #if !defined(CONFIG_MMC_BROKEN_CD)
 	no_card = mmc_getcd(mmc) == 0;
 #else
diff --git a/include/mmc.h b/include/mmc.h
index d0fa7689c9..f001776285 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -407,6 +407,14 @@ struct mmc;
 
 #if CONFIG_IS_ENABLED(DM_MMC)
 struct dm_mmc_ops {
+	/**
+	 * deferred_probe() - Some configurations that need to be deferred
+	 * to just before enumerating the device
+	 *
+	 * @dev:	Device to init
+	 * @return 0 if Ok, -ve if error
+	 */
+	int (*deferred_probe)(struct udevice *dev);
 	/**
 	 * send_cmd() - Send a command to the MMC device
 	 *
@@ -490,6 +498,7 @@ int dm_mmc_get_wp(struct udevice *dev);
 int dm_mmc_execute_tuning(struct udevice *dev, uint opcode);
 int dm_mmc_wait_dat0(struct udevice *dev, int state, int timeout_us);
 int dm_mmc_host_power_cycle(struct udevice *dev);
+int dm_mmc_deferred_probe(struct udevice *dev);
 
 /* Transition functions for compatibility */
 int mmc_set_ios(struct mmc *mmc);
@@ -499,6 +508,7 @@ int mmc_execute_tuning(struct mmc *mmc, uint opcode);
 int mmc_wait_dat0(struct mmc *mmc, int state, int timeout_us);
 int mmc_set_enhanced_strobe(struct mmc *mmc);
 int mmc_host_power_cycle(struct mmc *mmc);
+int mmc_deferred_probe(struct mmc *mmc);
 
 #else
 struct mmc_ops {
-- 
2.19.2

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

* [PATCH v3 03/11] sdhci: Add sdhci_deferred_probe() API
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 01/11] mmc: Add a saved_clock member Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 02/11] mmc: Add a deferred_probe() API Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 04/11] mmc: Merge SD_LEGACY and MMC_LEGACY bus modes Faiz Abbas
                     ` (8 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

Add the sdhci_deferred_probe() function to register as the
deferred_probe() callback to the mmc core. It will in turn call the
deferred_probe() callback of the platform drivers as declared in the
sdhci_ops.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
---
 drivers/mmc/sdhci.c | 15 +++++++++++++++
 include/sdhci.h     |  1 +
 2 files changed, 16 insertions(+)

diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c
index 9b7c5f8f68..520c9f9feb 100644
--- a/drivers/mmc/sdhci.c
+++ b/drivers/mmc/sdhci.c
@@ -658,6 +658,20 @@ int sdhci_probe(struct udevice *dev)
 	return sdhci_init(mmc);
 }
 
+static int sdhci_deferred_probe(struct udevice *dev)
+{
+	int err;
+	struct mmc *mmc = mmc_get_mmc_dev(dev);
+	struct sdhci_host *host = mmc->priv;
+
+	if (host->ops && host->ops->deferred_probe) {
+		err = host->ops->deferred_probe(host);
+		if (err)
+			return err;
+	}
+	return 0;
+}
+
 static int sdhci_get_cd(struct udevice *dev)
 {
 	struct mmc *mmc = mmc_get_mmc_dev(dev);
@@ -692,6 +706,7 @@ const struct dm_mmc_ops sdhci_ops = {
 	.send_cmd	= sdhci_send_command,
 	.set_ios	= sdhci_set_ios,
 	.get_cd		= sdhci_get_cd,
+	.deferred_probe	= sdhci_deferred_probe,
 #ifdef MMC_SUPPORTS_TUNING
 	.execute_tuning	= sdhci_execute_tuning,
 #endif
diff --git a/include/sdhci.h b/include/sdhci.h
index 7f8feefa45..aa4378fd57 100644
--- a/include/sdhci.h
+++ b/include/sdhci.h
@@ -268,6 +268,7 @@ struct sdhci_ops {
 	void	(*set_clock)(struct sdhci_host *host, u32 div);
 	int (*platform_execute_tuning)(struct mmc *host, u8 opcode);
 	void (*set_delay)(struct sdhci_host *host);
+	int	(*deferred_probe)(struct sdhci_host *host);
 };
 
 #if CONFIG_IS_ENABLED(MMC_SDHCI_ADMA)
-- 
2.19.2

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

* [PATCH v3 04/11] mmc: Merge SD_LEGACY and MMC_LEGACY bus modes
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
                     ` (2 preceding siblings ...)
  2020-02-26  8:14   ` [PATCH v3 03/11] sdhci: Add sdhci_deferred_probe() API Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 05/11] mmc: am654_sdhci: Update output tap delay writes Faiz Abbas
                     ` (7 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

MMC_LEGACY & SD_LEGACY are not differentiated timings in the spec and
don't have any meaningful differences. Therefore, get rid of all
references to SD_LEGACY and use MMC_LEGACY to mean both of them.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 drivers/mmc/fsl_esdhc_imx.c |  1 -
 drivers/mmc/mmc.c           | 16 +++++++---------
 drivers/mmc/omap_hsmmc.c    |  1 -
 drivers/mmc/zynq_sdhci.c    |  1 -
 include/mmc.h               |  1 -
 5 files changed, 7 insertions(+), 13 deletions(-)

diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
index 4900498e9b..6bca2a9c82 100644
--- a/drivers/mmc/fsl_esdhc_imx.c
+++ b/drivers/mmc/fsl_esdhc_imx.c
@@ -743,7 +743,6 @@ static int esdhc_set_timing(struct mmc *mmc)
 
 	switch (mmc->selected_mode) {
 	case MMC_LEGACY:
-	case SD_LEGACY:
 		esdhc_reset_tuning(mmc);
 		writel(mixctrl, &regs->mixctrl);
 		break;
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index a347308976..3e36566693 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -132,7 +132,6 @@ const char *mmc_mode_name(enum bus_mode mode)
 {
 	static const char *const names[] = {
 	      [MMC_LEGACY]	= "MMC legacy",
-	      [SD_LEGACY]	= "SD Legacy",
 	      [MMC_HS]		= "MMC High Speed (26MHz)",
 	      [SD_HS]		= "SD High Speed (50MHz)",
 	      [UHS_SDR12]	= "UHS SDR12 (25MHz)",
@@ -158,7 +157,6 @@ static uint mmc_mode2freq(struct mmc *mmc, enum bus_mode mode)
 {
 	static const int freqs[] = {
 	      [MMC_LEGACY]	= 25000000,
-	      [SD_LEGACY]	= 25000000,
 	      [MMC_HS]		= 26000000,
 	      [SD_HS]		= 50000000,
 	      [MMC_HS_52]	= 52000000,
@@ -1239,7 +1237,7 @@ static int sd_get_capabilities(struct mmc *mmc)
 	u32 sd3_bus_mode;
 #endif
 
-	mmc->card_caps = MMC_MODE_1BIT | MMC_CAP(SD_LEGACY);
+	mmc->card_caps = MMC_MODE_1BIT | MMC_CAP(MMC_LEGACY);
 
 	if (mmc_host_is_spi(mmc))
 		return 0;
@@ -1352,7 +1350,7 @@ static int sd_set_card_speed(struct mmc *mmc, enum bus_mode mode)
 		return 0;
 
 	switch (mode) {
-	case SD_LEGACY:
+	case MMC_LEGACY:
 		speed = UHS_SDR12_BUS_SPEED;
 		break;
 	case SD_HS:
@@ -1695,7 +1693,7 @@ static const struct mode_width_tuning sd_modes_by_pref[] = {
 	},
 #endif
 	{
-		.mode = SD_LEGACY,
+		.mode = MMC_LEGACY,
 		.widths = MMC_MODE_4BIT | MMC_MODE_1BIT,
 	}
 };
@@ -1725,7 +1723,7 @@ static int sd_select_mode_and_width(struct mmc *mmc, uint card_caps)
 
 	if (mmc_host_is_spi(mmc)) {
 		mmc_set_bus_width(mmc, 1);
-		mmc_select_mode(mmc, SD_LEGACY);
+		mmc_select_mode(mmc, MMC_LEGACY);
 		mmc_set_clock(mmc, mmc->tran_speed, MMC_CLK_ENABLE);
 		return 0;
 	}
@@ -1784,7 +1782,7 @@ static int sd_select_mode_and_width(struct mmc *mmc, uint card_caps)
 
 error:
 				/* revert to a safer bus speed */
-				mmc_select_mode(mmc, SD_LEGACY);
+				mmc_select_mode(mmc, MMC_LEGACY);
 				mmc_set_clock(mmc, mmc->tran_speed,
 						MMC_CLK_ENABLE);
 			}
@@ -2561,7 +2559,7 @@ static int mmc_startup(struct mmc *mmc)
 
 #if CONFIG_IS_ENABLED(MMC_TINY)
 	mmc_set_clock(mmc, mmc->legacy_speed, false);
-	mmc_select_mode(mmc, IS_SD(mmc) ? SD_LEGACY : MMC_LEGACY);
+	mmc_select_mode(mmc, MMC_LEGACY);
 	mmc_set_bus_width(mmc, 1);
 #else
 	if (IS_SD(mmc)) {
@@ -2843,7 +2841,7 @@ int mmc_start_init(struct mmc *mmc)
 	 * all hosts are capable of 1 bit bus-width and able to use the legacy
 	 * timings.
 	 */
-	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(SD_LEGACY) |
+	mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(MMC_LEGACY) |
 			 MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
 #if CONFIG_IS_ENABLED(DM_MMC)
 	mmc_deferred_probe(mmc);
diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c
index 5334723a9f..4d0dc33936 100644
--- a/drivers/mmc/omap_hsmmc.c
+++ b/drivers/mmc/omap_hsmmc.c
@@ -392,7 +392,6 @@ static void omap_hsmmc_set_timing(struct mmc *mmc)
 		break;
 	case MMC_LEGACY:
 	case MMC_HS:
-	case SD_LEGACY:
 	case UHS_SDR12:
 		val |= AC12_UHSMC_SDR12;
 		break;
diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
index 24fabeee95..da3ff53da1 100644
--- a/drivers/mmc/zynq_sdhci.c
+++ b/drivers/mmc/zynq_sdhci.c
@@ -37,7 +37,6 @@ struct arasan_sdhci_priv {
 
 static const u8 mode2timing[] = {
 	[MMC_LEGACY] = UHS_SDR12_BUS_SPEED,
-	[SD_LEGACY] = UHS_SDR12_BUS_SPEED,
 	[MMC_HS] = HIGH_SPEED_BUS_SPEED,
 	[SD_HS] = HIGH_SPEED_BUS_SPEED,
 	[MMC_HS_52] = HIGH_SPEED_BUS_SPEED,
diff --git a/include/mmc.h b/include/mmc.h
index f001776285..da2d6ea9e0 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -543,7 +543,6 @@ struct sd_ssr {
 
 enum bus_mode {
 	MMC_LEGACY,
-	SD_LEGACY,
 	MMC_HS,
 	SD_HS,
 	MMC_HS_52,
-- 
2.19.2

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

* [PATCH v3 05/11] mmc: am654_sdhci: Update output tap delay writes
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
                     ` (3 preceding siblings ...)
  2020-02-26  8:14   ` [PATCH v3 04/11] mmc: Merge SD_LEGACY and MMC_LEGACY bus modes Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 06/11] mmc: am654_sdhci: Implement workaround for card detect Faiz Abbas
                     ` (6 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

With the latest RIOT, there is a different otap delay value for each
speed mode. Add a new binding with every supported speed mode. Also
disable a given speed mode in the host caps if its corresponding
otap-del-sel is not present.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 arch/arm/dts/k3-am65-main.dtsi               | 12 +++-
 arch/arm/dts/k3-am654-base-board-u-boot.dtsi | 11 ++-
 arch/arm/dts/k3-j721e-main.dtsi              | 15 ++++-
 drivers/mmc/am654_sdhci.c                    | 70 +++++++++++++++++---
 4 files changed, 95 insertions(+), 13 deletions(-)

diff --git a/arch/arm/dts/k3-am65-main.dtsi b/arch/arm/dts/k3-am65-main.dtsi
index ab40dafceb..028f57379b 100644
--- a/arch/arm/dts/k3-am65-main.dtsi
+++ b/arch/arm/dts/k3-am65-main.dtsi
@@ -98,7 +98,17 @@
 		interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
 		mmc-ddr-1_8v;
 		mmc-hs200-1_8v;
-		ti,otap-del-sel = <0x2>;
+		ti,otap-del-sel-legacy = <0x0>;
+		ti,otap-del-sel-mmc-hs = <0x0>;
+		ti,otap-del-sel-sd-hs = <0x0>;
+		ti,otap-del-sel-sdr12 = <0x0>;
+		ti,otap-del-sel-sdr25 = <0x0>;
+		ti,otap-del-sel-sdr50 = <0x8>;
+		ti,otap-del-sel-sdr104 = <0x5>;
+		ti,otap-del-sel-ddr50 = <0x5>;
+		ti,otap-del-sel-ddr52 = <0x5>;
+		ti,otap-del-sel-hs200 = <0x5>;
+		ti,otap-del-sel-hs400 = <0x0>;
 		ti,trm-icp = <0x8>;
 		dma-coherent;
 	};
diff --git a/arch/arm/dts/k3-am654-base-board-u-boot.dtsi b/arch/arm/dts/k3-am654-base-board-u-boot.dtsi
index a349edcfa5..54ecb3d444 100644
--- a/arch/arm/dts/k3-am654-base-board-u-boot.dtsi
+++ b/arch/arm/dts/k3-am654-base-board-u-boot.dtsi
@@ -29,7 +29,16 @@
 		clock-names = "clk_ahb", "clk_xin";
 		power-domains = <&k3_pds 48 TI_SCI_PD_EXCLUSIVE>;
 		max-frequency = <25000000>;
-		ti,otap-del-sel = <0x2>;
+		ti,otap-del-sel-legacy = <0x0>;
+		ti,otap-del-sel-mmc-hs = <0x0>;
+		ti,otap-del-sel-sd-hs = <0x0>;
+		ti,otap-del-sel-sdr12 = <0x0>;
+		ti,otap-del-sel-sdr25 = <0x0>;
+		ti,otap-del-sel-sdr50 = <0x8>;
+		ti,otap-del-sel-sdr104 = <0x7>;
+		ti,otap-del-sel-ddr50 = <0x4>;
+		ti,otap-del-sel-ddr52 = <0x4>;
+		ti,otap-del-sel-hs200 = <0x7>;
 		ti,trm-icp = <0x8>;
 	};
 
diff --git a/arch/arm/dts/k3-j721e-main.dtsi b/arch/arm/dts/k3-j721e-main.dtsi
index 45ac98c47e..1433932e7f 100644
--- a/arch/arm/dts/k3-j721e-main.dtsi
+++ b/arch/arm/dts/k3-j721e-main.dtsi
@@ -232,9 +232,14 @@
 		assigned-clocks = <&k3_clks 91 1>;
 		assigned-clock-parents = <&k3_clks 91 2>;
 		bus-width = <8>;
-		ti,otap-del-sel = <0x2>;
 		ti,trm-icp = <0x8>;
 		dma-coherent;
+		mmc-ddr-1_8v;
+		ti,otap-del-sel-legacy = <0x0>;
+		ti,otap-del-sel-mmc-hs = <0x0>;
+		ti,otap-del-sel-ddr52 = <0x5>;
+		ti,otap-del-sel-hs200 = <0x6>;
+		ti,otap-del-sel-hs400 = <0x0>;
 	};
 
 	main_sdhci1: sdhci at 4fb0000 {
@@ -246,7 +251,13 @@
 		clocks = <&k3_clks 92 0>, <&k3_clks 92 5>;
 		assigned-clocks = <&k3_clks 92 0>;
 		assigned-clock-parents = <&k3_clks 92 1>;
-		ti,otap-del-sel = <0x2>;
+		ti,otap-del-sel-legacy = <0x0>;
+		ti,otap-del-sel-sd-hs = <0xf>;
+		ti,otap-del-sel-sdr12 = <0xf>;
+		ti,otap-del-sel-sdr25 = <0xf>;
+		ti,otap-del-sel-sdr50 = <0xc>;
+		ti,otap-del-sel-sdr104 = <0x5>;
+		ti,otap-del-sel-ddr50 = <0xc>;
 		ti,trm-icp = <0x8>;
 		dma-coherent;
 	};
diff --git a/drivers/mmc/am654_sdhci.c b/drivers/mmc/am654_sdhci.c
index aad9d8b85b..92e7100f56 100644
--- a/drivers/mmc/am654_sdhci.c
+++ b/drivers/mmc/am654_sdhci.c
@@ -74,7 +74,7 @@ struct am654_sdhci_plat {
 	struct mmc mmc;
 	struct regmap *base;
 	bool non_removable;
-	u32 otap_del_sel;
+	u32 otap_del_sel[11];
 	u32 trm_icp;
 	u32 drv_strength;
 	u32 strb_sel;
@@ -86,6 +86,25 @@ struct am654_sdhci_plat {
 	bool dll_on;
 };
 
+struct timing_data {
+	const char *binding;
+	u32 capability;
+};
+
+static const struct timing_data td[] = {
+	[MMC_LEGACY] = {"ti,otap-del-sel-legacy", 0},
+	[MMC_HS] = {"ti,otap-del-sel-mmc-hs", MMC_CAP(MMC_HS)},
+	[SD_HS]  = {"ti,otap-del-sel-sd-hs", MMC_CAP(SD_HS)},
+	[UHS_SDR12] = {"ti,otap-del-sel-sdr12", MMC_CAP(UHS_SDR12)},
+	[UHS_SDR25] = {"ti,otap-del-sel-sdr25", MMC_CAP(UHS_SDR25)},
+	[UHS_SDR50] = {"ti,otap-del-sel-sdr50", MMC_CAP(UHS_SDR50)},
+	[UHS_SDR104] = {"ti,otap-del-sel-sdr104", MMC_CAP(UHS_SDR104)},
+	[UHS_DDR50] = {"ti,otap-del-sel-ddr50", MMC_CAP(UHS_DDR50)},
+	[MMC_DDR_52] = {"ti,otap-del-sel-ddr52", MMC_CAP(MMC_DDR_52)},
+	[MMC_HS_200] = {"ti,otap-del-sel-hs200", MMC_CAP(MMC_HS_200)},
+	[MMC_HS_400] = {"ti,otap-del-sel-hs400", MMC_CAP(MMC_HS_400)},
+};
+
 struct am654_driver_data {
 	const struct sdhci_ops *ops;
 	u32 flags;
@@ -112,6 +131,7 @@ static int am654_sdhci_set_ios_post(struct sdhci_host *host)
 	struct am654_sdhci_plat *plat = dev_get_platdata(dev);
 	unsigned int speed = host->mmc->clock;
 	int sel50, sel100, freqsel;
+	u32 otap_del_sel;
 	u32 mask, val;
 	int ret;
 
@@ -132,9 +152,10 @@ static int am654_sdhci_set_ios_post(struct sdhci_host *host)
 
 	/* switch phy back on */
 	if (speed > AM654_SDHCI_MIN_FREQ) {
+		otap_del_sel = plat->otap_del_sel[host->mmc->selected_mode];
 		mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
 		val = (1 << OTAPDLYENA_SHIFT) |
-		      (plat->otap_del_sel << OTAPDLYSEL_SHIFT);
+		      (otap_del_sel << OTAPDLYSEL_SHIFT);
 
 		/* Write to STRBSEL for HS400 speed mode */
 		if (host->mmc->selected_mode == MMC_HS_400) {
@@ -216,11 +237,11 @@ static int j721e_4bit_sdhci_set_ios_post(struct sdhci_host *host)
 {
 	struct udevice *dev = host->mmc->dev;
 	struct am654_sdhci_plat *plat = dev_get_platdata(dev);
-	u32 mask, val;
+	u32 otap_del_sel, mask, val;
 
+	otap_del_sel = plat->otap_del_sel[host->mmc->selected_mode];
 	mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
-	val = (1 << OTAPDLYENA_SHIFT) |
-	      (plat->otap_del_sel << OTAPDLYSEL_SHIFT);
+	val = (1 << OTAPDLYENA_SHIFT) | (otap_del_sel << OTAPDLYSEL_SHIFT);
 	regmap_update_bits(plat->base, PHY_CTRL4, mask, val);
 
 	return 0;
@@ -281,6 +302,37 @@ int am654_sdhci_init(struct am654_sdhci_plat *plat)
 	return 0;
 }
 
+static int sdhci_am654_get_otap_delay(struct udevice *dev,
+				      struct mmc_config *cfg)
+{
+	struct am654_sdhci_plat *plat = dev_get_platdata(dev);
+	int ret;
+	int i;
+
+	/* ti,otap-del-sel-legacy is mandatory */
+	ret = dev_read_u32(dev, "ti,otap-del-sel-legacy",
+			   &plat->otap_del_sel[0]);
+	if (ret)
+		return ret;
+	/*
+	 * Remove the corresponding capability if an otap-del-sel
+	 * value is not found
+	 */
+	for (i = MMC_HS; i <= MMC_HS_400; i++) {
+		ret = dev_read_u32(dev, td[i].binding, &plat->otap_del_sel[i]);
+		if (ret) {
+			dev_dbg(dev, "Couldn't find %s\n", td[i].binding);
+			/*
+			 * Remove the corresponding capability
+			 * if an otap-del-sel value is not found
+			 */
+			cfg->host_caps &= ~td[i].capability;
+		}
+	}
+
+	return 0;
+}
+
 static int am654_sdhci_probe(struct udevice *dev)
 {
 	struct am654_driver_data *drv_data =
@@ -313,6 +365,10 @@ static int am654_sdhci_probe(struct udevice *dev)
 	if (ret)
 		return ret;
 
+	ret = sdhci_am654_get_otap_delay(dev, cfg);
+	if (ret)
+		return ret;
+
 	host->ops = drv_data->ops;
 	host->mmc->priv = host;
 	upriv->mmc = host->mmc;
@@ -336,10 +392,6 @@ static int am654_sdhci_ofdata_to_platdata(struct udevice *dev)
 	host->ioaddr = (void *)dev_read_addr(dev);
 	plat->non_removable = dev_read_bool(dev, "non-removable");
 
-	ret = dev_read_u32(dev, "ti,otap-del-sel", &plat->otap_del_sel);
-	if (ret)
-		return ret;
-
 	if (plat->flags & DLL_PRESENT) {
 		ret = dev_read_u32(dev, "ti,trm-icp", &plat->trm_icp);
 		if (ret)
-- 
2.19.2

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

* [PATCH v3 06/11] mmc: am654_sdhci: Implement workaround for card detect
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
                     ` (4 preceding siblings ...)
  2020-02-26  8:14   ` [PATCH v3 05/11] mmc: am654_sdhci: Update output tap delay writes Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 07/11] spl: mmc: Fix spl_mmc_get_uboot_raw_sector() implementation Faiz Abbas
                     ` (5 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

The 4 bit MMC controllers have an internal debounce for the SDCD line
with a debounce delay of 1 second. Therefore, after clocks to the IP are
enabled, software has to wait for this time before it can power on the
controller.

Add a deferred_probe() callback which polls on sdcd for a maximum of 2 seconds
before switching on power to the controller or (in the case of no card)
returning a ENOMEDIUM. This pushes the 1 second wait time to when the
card is actually needed rather than at every probe() making sure that
users who don't insert an SD card in the slot don't have to wait such a
long time.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 drivers/mmc/am654_sdhci.c | 109 ++++++++++++++++++++++++--------------
 1 file changed, 68 insertions(+), 41 deletions(-)

diff --git a/drivers/mmc/am654_sdhci.c b/drivers/mmc/am654_sdhci.c
index 92e7100f56..ca76e1f559 100644
--- a/drivers/mmc/am654_sdhci.c
+++ b/drivers/mmc/am654_sdhci.c
@@ -218,44 +218,6 @@ static int am654_sdhci_set_ios_post(struct sdhci_host *host)
 	return 0;
 }
 
-const struct sdhci_ops am654_sdhci_ops = {
-	.set_ios_post		= &am654_sdhci_set_ios_post,
-	.set_control_reg	= &am654_sdhci_set_control_reg,
-};
-
-const struct am654_driver_data am654_drv_data = {
-	.ops = &am654_sdhci_ops,
-	.flags = IOMUX_PRESENT | FREQSEL_2_BIT | DLL_PRESENT | STRBSEL_4_BIT,
-};
-
-const struct am654_driver_data j721e_8bit_drv_data = {
-	.ops = &am654_sdhci_ops,
-	.flags = DLL_PRESENT,
-};
-
-static int j721e_4bit_sdhci_set_ios_post(struct sdhci_host *host)
-{
-	struct udevice *dev = host->mmc->dev;
-	struct am654_sdhci_plat *plat = dev_get_platdata(dev);
-	u32 otap_del_sel, mask, val;
-
-	otap_del_sel = plat->otap_del_sel[host->mmc->selected_mode];
-	mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
-	val = (1 << OTAPDLYENA_SHIFT) | (otap_del_sel << OTAPDLYSEL_SHIFT);
-	regmap_update_bits(plat->base, PHY_CTRL4, mask, val);
-
-	return 0;
-}
-
-const struct sdhci_ops j721e_4bit_sdhci_ops = {
-	.set_ios_post		= &j721e_4bit_sdhci_set_ios_post,
-};
-
-const struct am654_driver_data j721e_4bit_drv_data = {
-	.ops = &j721e_4bit_sdhci_ops,
-	.flags = IOMUX_PRESENT,
-};
-
 int am654_sdhci_init(struct am654_sdhci_plat *plat)
 {
 	u32 ctl_cfg_2 = 0;
@@ -302,6 +264,73 @@ int am654_sdhci_init(struct am654_sdhci_plat *plat)
 	return 0;
 }
 
+#define MAX_SDCD_DEBOUNCE_TIME 2000
+static int am654_sdhci_deferred_probe(struct sdhci_host *host)
+{
+	struct udevice *dev = host->mmc->dev;
+	struct am654_sdhci_plat *plat = dev_get_platdata(dev);
+	unsigned long start;
+	int val;
+
+	/*
+	 * The controller takes about 1 second to debounce the card detect line
+	 * and doesn't let us power on until that time is up. Instead of waiting
+	 * for 1 second at every stage, poll on the CARD_PRESENT bit upto a
+	 * maximum of 2 seconds to be safe..
+	 */
+	start = get_timer(0);
+	do {
+		if (get_timer(start) > MAX_SDCD_DEBOUNCE_TIME)
+			return -ENOMEDIUM;
+
+		val = mmc_getcd(host->mmc);
+	} while (!val);
+
+	am654_sdhci_init(plat);
+
+	return sdhci_probe(dev);
+}
+
+const struct sdhci_ops am654_sdhci_ops = {
+	.deferred_probe		= am654_sdhci_deferred_probe,
+	.set_ios_post		= &am654_sdhci_set_ios_post,
+	.set_control_reg	= &am654_sdhci_set_control_reg,
+};
+
+const struct am654_driver_data am654_drv_data = {
+	.ops = &am654_sdhci_ops,
+	.flags = IOMUX_PRESENT | FREQSEL_2_BIT | DLL_PRESENT | STRBSEL_4_BIT,
+};
+
+const struct am654_driver_data j721e_8bit_drv_data = {
+	.ops = &am654_sdhci_ops,
+	.flags = DLL_PRESENT,
+};
+
+static int j721e_4bit_sdhci_set_ios_post(struct sdhci_host *host)
+{
+	struct udevice *dev = host->mmc->dev;
+	struct am654_sdhci_plat *plat = dev_get_platdata(dev);
+	u32 otap_del_sel, mask, val;
+
+	otap_del_sel = plat->otap_del_sel[host->mmc->selected_mode];
+	mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
+	val = (1 << OTAPDLYENA_SHIFT) | (otap_del_sel << OTAPDLYSEL_SHIFT);
+	regmap_update_bits(plat->base, PHY_CTRL4, mask, val);
+
+	return 0;
+}
+
+const struct sdhci_ops j721e_4bit_sdhci_ops = {
+	.deferred_probe		= am654_sdhci_deferred_probe,
+	.set_ios_post		= &j721e_4bit_sdhci_set_ios_post,
+};
+
+const struct am654_driver_data j721e_4bit_drv_data = {
+	.ops = &j721e_4bit_sdhci_ops,
+	.flags = IOMUX_PRESENT,
+};
+
 static int sdhci_am654_get_otap_delay(struct udevice *dev,
 				      struct mmc_config *cfg)
 {
@@ -375,9 +404,7 @@ static int am654_sdhci_probe(struct udevice *dev)
 
 	regmap_init_mem_index(dev_ofnode(dev), &plat->base, 1);
 
-	am654_sdhci_init(plat);
-
-	return sdhci_probe(dev);
+	return 0;
 }
 
 static int am654_sdhci_ofdata_to_platdata(struct udevice *dev)
-- 
2.19.2

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

* [PATCH v3 07/11] spl: mmc: Fix spl_mmc_get_uboot_raw_sector() implementation
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
                     ` (5 preceding siblings ...)
  2020-02-26  8:14   ` [PATCH v3 06/11] mmc: am654_sdhci: Implement workaround for card detect Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 08/11] arm: K3: sysfw-loader: Add a config_pm_pre_callback() Faiz Abbas
                     ` (4 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

The call to spl_mmc_get_uboot_raw_sector() completely ignores and
overwrites the raw_sect value passed from the caller of spl_mmc_load().

Fix this by passing raw_sect to the function and returning the same
value in the default case.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 arch/arm/mach-imx/imx8/image.c |  3 ++-
 common/spl/spl_mmc.c           | 11 ++++-------
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/arch/arm/mach-imx/imx8/image.c b/arch/arm/mach-imx/imx8/image.c
index c956a8092d..e6b299691d 100644
--- a/arch/arm/mach-imx/imx8/image.c
+++ b/arch/arm/mach-imx/imx8/image.c
@@ -197,7 +197,8 @@ unsigned long spl_spi_get_uboot_offs(struct spi_flash *flash)
 #endif
 
 #ifdef CONFIG_SPL_MMC_SUPPORT
-unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc)
+unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc,
+					   unsigned long raw_sect)
 {
 	int end;
 
diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
index 3e6a17c110..a2ea363e96 100644
--- a/common/spl/spl_mmc.c
+++ b/common/spl/spl_mmc.c
@@ -317,13 +317,10 @@ int spl_boot_partition(const u32 boot_device)
 }
 #endif
 
-unsigned long __weak spl_mmc_get_uboot_raw_sector(struct mmc *mmc)
+unsigned long __weak spl_mmc_get_uboot_raw_sector(struct mmc *mmc,
+						  unsigned long raw_sect)
 {
-#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
-	return CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR;
-#else
-	return 0;
-#endif
+	return raw_sect;
 }
 
 int spl_mmc_load(struct spl_image_info *spl_image,
@@ -392,7 +389,7 @@ int spl_mmc_load(struct spl_image_info *spl_image,
 				return err;
 		}
 
-		raw_sect = spl_mmc_get_uboot_raw_sector(mmc);
+		raw_sect = spl_mmc_get_uboot_raw_sector(mmc, raw_sect);
 
 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
 		err = mmc_load_image_raw_partition(spl_image, mmc, raw_part,
-- 
2.19.2

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

* [PATCH v3 08/11] arm: K3: sysfw-loader: Add a config_pm_pre_callback()
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
                     ` (6 preceding siblings ...)
  2020-02-26  8:14   ` [PATCH v3 07/11] spl: mmc: Fix spl_mmc_get_uboot_raw_sector() implementation Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 09/11] arm: dts: k3-j721e-r5-common-proc-board: Use unique names for dummy clocks Faiz Abbas
                     ` (3 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

System firmware does not guarantee that clocks going out of the device
will be stable during power management configuration. There are some
DCRC errors when SPL tries to get the next stage during eMMC boot after
sysfw pm configuration.

Therefore add a config_pm_pre_callback() to switch off the eMMC clock
before power management and restart it after it is done.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 arch/arm/mach-k3/am6_init.c                  | 33 +++++++++++++++++++-
 arch/arm/mach-k3/include/mach/sysfw-loader.h |  2 +-
 arch/arm/mach-k3/j721e_init.c                | 33 +++++++++++++++++++-
 arch/arm/mach-k3/sysfw-loader.c              |  6 +++-
 4 files changed, 70 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-k3/am6_init.c b/arch/arm/mach-k3/am6_init.c
index 63cd7e0458..d0b10e58ad 100644
--- a/arch/arm/mach-k3/am6_init.c
+++ b/arch/arm/mach-k3/am6_init.c
@@ -17,6 +17,7 @@
 #include <dm/uclass-internal.h>
 #include <dm/pinctrl.h>
 #include <linux/soc/ti/ti_sci_protocol.h>
+#include <mmc.h>
 
 #ifdef CONFIG_SPL_BUILD
 #ifdef CONFIG_K3_LOAD_SYSFW
@@ -86,6 +87,33 @@ static void store_boot_index_from_rom(void)
 	bootindex = *(u32 *)(CONFIG_SYS_K3_BOOT_PARAM_TABLE_INDEX);
 }
 
+#if defined(CONFIG_K3_LOAD_SYSFW)
+void k3_mmc_stop_clock(void)
+{
+	if (spl_boot_device() == BOOT_DEVICE_MMC1) {
+		struct mmc *mmc = find_mmc_device(0);
+
+		if (!mmc)
+			return;
+
+		mmc->saved_clock = mmc->clock;
+		mmc_set_clock(mmc, 0, true);
+	}
+}
+
+void k3_mmc_restart_clock(void)
+{
+	if (spl_boot_device() == BOOT_DEVICE_MMC1) {
+		struct mmc *mmc = find_mmc_device(0);
+
+		if (!mmc)
+			return;
+
+		mmc_set_clock(mmc, mmc->saved_clock, false);
+	}
+}
+#endif
+
 void board_init_f(ulong dummy)
 {
 #if defined(CONFIG_K3_LOAD_SYSFW) || defined(CONFIG_K3_AM654_DDRSS)
@@ -138,7 +166,10 @@ void board_init_f(ulong dummy)
 	 * callback hook, effectively switching on (or over) the console
 	 * output.
 	 */
-	k3_sysfw_loader(preloader_console_init);
+	k3_sysfw_loader(k3_mmc_stop_clock, k3_mmc_restart_clock);
+
+	/* Prepare console output */
+	preloader_console_init();
 
 	/* Disable ROM configured firewalls right after loading sysfw */
 #ifdef CONFIG_TI_SECURE_DEVICE
diff --git a/arch/arm/mach-k3/include/mach/sysfw-loader.h b/arch/arm/mach-k3/include/mach/sysfw-loader.h
index 36eb265348..6f5612b4fd 100644
--- a/arch/arm/mach-k3/include/mach/sysfw-loader.h
+++ b/arch/arm/mach-k3/include/mach/sysfw-loader.h
@@ -7,6 +7,6 @@
 #ifndef _SYSFW_LOADER_H_
 #define _SYSFW_LOADER_H_
 
-void k3_sysfw_loader(void (*config_pm_done_callback)(void));
+void k3_sysfw_loader(void (*config_pm_pre_callback)(void), void (*config_pm_done_callback)(void));
 
 #endif
diff --git a/arch/arm/mach-k3/j721e_init.c b/arch/arm/mach-k3/j721e_init.c
index f7f7398081..0994522f6c 100644
--- a/arch/arm/mach-k3/j721e_init.c
+++ b/arch/arm/mach-k3/j721e_init.c
@@ -18,6 +18,7 @@
 #include <dm.h>
 #include <dm/uclass-internal.h>
 #include <dm/pinctrl.h>
+#include <mmc.h>
 
 #ifdef CONFIG_SPL_BUILD
 #ifdef CONFIG_K3_LOAD_SYSFW
@@ -100,6 +101,33 @@ static void ctrl_mmr_unlock(void)
 	mmr_unlock(CTRL_MMR0_BASE, 7);
 }
 
+#if defined(CONFIG_K3_LOAD_SYSFW)
+void k3_mmc_stop_clock(void)
+{
+	if (spl_boot_device() == BOOT_DEVICE_MMC1) {
+		struct mmc *mmc = find_mmc_device(0);
+
+		if (!mmc)
+			return;
+
+		mmc->saved_clock = mmc->clock;
+		mmc_set_clock(mmc, 0, true);
+	}
+}
+
+void k3_mmc_restart_clock(void)
+{
+	if (spl_boot_device() == BOOT_DEVICE_MMC1) {
+		struct mmc *mmc = find_mmc_device(0);
+
+		if (!mmc)
+			return;
+
+		mmc_set_clock(mmc, mmc->saved_clock, false);
+	}
+}
+#endif
+
 /*
  * This uninitialized global variable would normal end up in the .bss section,
  * but the .bss is cleared between writing and reading this variable, so move
@@ -154,7 +182,10 @@ void board_init_f(ulong dummy)
 	 * callback hook, effectively switching on (or over) the console
 	 * output.
 	 */
-	k3_sysfw_loader(preloader_console_init);
+	k3_sysfw_loader(k3_mmc_stop_clock, k3_mmc_restart_clock);
+
+	/* Prepare console output */
+	preloader_console_init();
 
 	/* Disable ROM configured firewalls right after loading sysfw */
 #ifdef CONFIG_TI_SECURE_DEVICE
diff --git a/arch/arm/mach-k3/sysfw-loader.c b/arch/arm/mach-k3/sysfw-loader.c
index 94dbeb9437..db02607b17 100644
--- a/arch/arm/mach-k3/sysfw-loader.c
+++ b/arch/arm/mach-k3/sysfw-loader.c
@@ -197,7 +197,8 @@ exit:
 }
 #endif
 
-void k3_sysfw_loader(void (*config_pm_done_callback)(void))
+void k3_sysfw_loader(void (*config_pm_pre_callback) (void),
+		     void (*config_pm_done_callback)(void))
 {
 	struct spl_image_info spl_image = { 0 };
 	struct spl_boot_device bootdev = { 0 };
@@ -291,6 +292,9 @@ void k3_sysfw_loader(void (*config_pm_done_callback)(void))
 	/* Get handle for accessing SYSFW services */
 	ti_sci = get_ti_sci_handle();
 
+	if (config_pm_pre_callback)
+		config_pm_pre_callback();
+
 	/* Parse and apply the different SYSFW configuration fragments */
 	k3_sysfw_configure_using_fit(sysfw_load_address, ti_sci);
 
-- 
2.19.2

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

* [PATCH v3 09/11] arm: dts: k3-j721e-r5-common-proc-board: Use unique names for dummy clocks
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
                     ` (7 preceding siblings ...)
  2020-02-26  8:14   ` [PATCH v3 08/11] arm: K3: sysfw-loader: Add a config_pm_pre_callback() Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 10/11] configs: am65x_evm: Add CONFIG_SUPPORT_EMMC_BOOT Faiz Abbas
                     ` (2 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

Update the dummy clock names to use unique identifiers. Otherwise the
previous node just gets overwitten by the next one with the same name.
This fixes eMMC boot not working on J721e-evm.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
---
 arch/arm/dts/k3-j721e-r5-common-proc-board.dts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/dts/k3-j721e-r5-common-proc-board.dts b/arch/arm/dts/k3-j721e-r5-common-proc-board.dts
index eb577cdbc6..5973e211c3 100644
--- a/arch/arm/dts/k3-j721e-r5-common-proc-board.dts
+++ b/arch/arm/dts/k3-j721e-r5-common-proc-board.dts
@@ -34,14 +34,14 @@
 		u-boot,dm-spl;
 	};
 
-	clk_200mhz: dummy_clock {
+	clk_200mhz: dummy_clock_200mhz {
 		compatible = "fixed-clock";
 		#clock-cells = <0>;
 		clock-frequency = <200000000>;
 		u-boot,dm-spl;
 	};
 
-	clk_19_2mhz: dummy_clock {
+	clk_19_2mhz: dummy_clock_19_2mhz {
 		compatible = "fixed-clock";
 		#clock-cells = <0>;
 		clock-frequency = <19200000>;
-- 
2.19.2

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

* [PATCH v3 10/11] configs: am65x_evm: Add CONFIG_SUPPORT_EMMC_BOOT
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
                     ` (8 preceding siblings ...)
  2020-02-26  8:14   ` [PATCH v3 09/11] arm: dts: k3-j721e-r5-common-proc-board: Use unique names for dummy clocks Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26  8:14   ` [PATCH v3 11/11] configs: j721e_evm: Add Support for eMMC boot Faiz Abbas
  2020-02-26 11:01   ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Jaehoon Chung
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

With CONFIG_SUPPORT_EMMC_BOOT moved to Kconfig, move it to defconfig
files.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 configs/am65x_evm_a53_defconfig | 1 +
 configs/am65x_evm_r5_defconfig  | 1 +
 include/configs/am65x_evm.h     | 2 --
 3 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/configs/am65x_evm_a53_defconfig b/configs/am65x_evm_a53_defconfig
index 079cd912ba..099a9b46cc 100644
--- a/configs/am65x_evm_a53_defconfig
+++ b/configs/am65x_evm_a53_defconfig
@@ -74,6 +74,7 @@ CONFIG_DM_KEYBOARD=y
 CONFIG_DM_MAILBOX=y
 CONFIG_K3_SEC_PROXY=y
 CONFIG_DM_MMC=y
+CONFIG_SUPPORT_EMMC_BOOT=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_ADMA=y
 CONFIG_SPL_MMC_SDHCI_ADMA=y
diff --git a/configs/am65x_evm_r5_defconfig b/configs/am65x_evm_r5_defconfig
index 69055d5536..b475aceefe 100644
--- a/configs/am65x_evm_r5_defconfig
+++ b/configs/am65x_evm_r5_defconfig
@@ -73,6 +73,7 @@ CONFIG_K3_SEC_PROXY=y
 CONFIG_MISC=y
 CONFIG_K3_AVS0=y
 CONFIG_DM_MMC=y
+CONFIG_SUPPORT_EMMC_BOOT=y
 CONFIG_MMC_SDHCI=y
 CONFIG_SPL_MMC_SDHCI_ADMA=y
 CONFIG_MMC_SDHCI_AM654=y
diff --git a/include/configs/am65x_evm.h b/include/configs/am65x_evm.h
index 7d7f86a059..23ee2254ed 100644
--- a/include/configs/am65x_evm.h
+++ b/include/configs/am65x_evm.h
@@ -127,8 +127,6 @@
 #define CONFIG_SYS_MMC_ENV_PART	1
 #endif
 
-#define CONFIG_SUPPORT_EMMC_BOOT
-
 /* Now for the remaining common defines */
 #include <configs/ti_armv7_common.h>
 
-- 
2.19.2

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

* [PATCH v3 11/11] configs: j721e_evm: Add Support for eMMC boot
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
                     ` (9 preceding siblings ...)
  2020-02-26  8:14   ` [PATCH v3 10/11] configs: am65x_evm: Add CONFIG_SUPPORT_EMMC_BOOT Faiz Abbas
@ 2020-02-26  8:14   ` Faiz Abbas
  2020-02-26 11:01   ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Jaehoon Chung
  11 siblings, 0 replies; 16+ messages in thread
From: Faiz Abbas @ 2020-02-26  8:14 UTC (permalink / raw)
  To: u-boot

Enable configs to support eMMC boot.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 configs/j721e_evm_a72_defconfig | 3 +++
 configs/j721e_evm_r5_defconfig  | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/configs/j721e_evm_a72_defconfig b/configs/j721e_evm_a72_defconfig
index f53f1ede7f..1b0b173203 100644
--- a/configs/j721e_evm_a72_defconfig
+++ b/configs/j721e_evm_a72_defconfig
@@ -28,6 +28,8 @@ CONFIG_SPL_BOARD_INIT=y
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x1400
 CONFIG_SPL_ENV_SUPPORT=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
@@ -99,6 +101,7 @@ CONFIG_SYS_I2C_OMAP24XX=y
 CONFIG_DM_MAILBOX=y
 CONFIG_K3_SEC_PROXY=y
 CONFIG_DM_MMC=y
+CONFIG_SUPPORT_EMMC_BOOT=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_ADMA=y
 CONFIG_SPL_MMC_SDHCI_ADMA=y
diff --git a/configs/j721e_evm_r5_defconfig b/configs/j721e_evm_r5_defconfig
index b449d9b997..9f2be67f1b 100644
--- a/configs/j721e_evm_r5_defconfig
+++ b/configs/j721e_evm_r5_defconfig
@@ -26,6 +26,8 @@ CONFIG_USE_BOOTCOMMAND=y
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SPL_EARLY_BSS=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x400
 CONFIG_SPL_ENV_SUPPORT=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
@@ -77,6 +79,7 @@ CONFIG_MISC=y
 CONFIG_FS_LOADER=y
 CONFIG_K3_AVS0=y
 CONFIG_DM_MMC=y
+CONFIG_SUPPORT_EMMC_BOOT=y
 CONFIG_MMC_SDHCI=y
 CONFIG_SPL_MMC_SDHCI_ADMA=y
 CONFIG_MMC_SDHCI_AM654=y
-- 
2.19.2

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

* [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e
  2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
                     ` (10 preceding siblings ...)
  2020-02-26  8:14   ` [PATCH v3 11/11] configs: j721e_evm: Add Support for eMMC boot Faiz Abbas
@ 2020-02-26 11:01   ` Jaehoon Chung
  2020-03-04  6:34     ` Faiz Abbas
  11 siblings, 1 reply; 16+ messages in thread
From: Jaehoon Chung @ 2020-02-26 11:01 UTC (permalink / raw)
  To: u-boot

Hi Faiz,

On 2/26/20 5:14 PM, Faiz Abbas wrote:
> The following patches add support for eMMC boot in TI's Am65x and J721e
> devices.

About adding deferred_probe(), i want to know Peng's opinion.
But it's my preference. I will review about your series.
Thanks for accepting my suggestion.

Best Regards,
Jaehoon Chung

> 
> v3:
> 1. Added a patch to fix a clash between two dummy clocks of the same
> name in k3-j721e-r5-common-proc-board.dtb
> 2. Converted the init() API patch to two patches adding deferred_probe()
> APIs to the mmc core and sdhci layers respectively.
> 3. Fixed up config_pm_pre_callback() call order in patch 9. 
> 
> v2:
> 1. Reordered the patches according to Lokesh's preference
> 2. Fixed patch 2 breaking platforms where DM_MMC is not enabled.
> 
> Faiz Abbas (11):
>   mmc: Add a saved_clock member
>   mmc: Add a deferred_probe() API
>   sdhci: Add sdhci_deferred_probe() API
>   mmc: Merge SD_LEGACY and MMC_LEGACY bus modes
>   mmc: am654_sdhci: Update output tap delay writes
>   mmc: am654_sdhci: Implement workaround for card detect
>   spl: mmc: Fix spl_mmc_get_uboot_raw_sector() implementation
>   arm: K3: sysfw-loader: Add a config_pm_pre_callback()
>   arm: dts: k3-j721e-r5-common-proc-board: Use unique names for dummy
>     clocks
>   configs: am65x_evm: Add CONFIG_SUPPORT_EMMC_BOOT
>   configs: j721e_evm: Add Support for eMMC boot
> 
>  arch/arm/dts/k3-am65-main.dtsi                |  12 +-
>  arch/arm/dts/k3-am654-base-board-u-boot.dtsi  |  11 +-
>  arch/arm/dts/k3-j721e-main.dtsi               |  15 +-
>  .../arm/dts/k3-j721e-r5-common-proc-board.dts |   4 +-
>  arch/arm/mach-imx/imx8/image.c                |   3 +-
>  arch/arm/mach-k3/am6_init.c                   |  33 +++-
>  arch/arm/mach-k3/include/mach/sysfw-loader.h  |   2 +-
>  arch/arm/mach-k3/j721e_init.c                 |  33 +++-
>  arch/arm/mach-k3/sysfw-loader.c               |   6 +-
>  common/spl/spl_mmc.c                          |  11 +-
>  configs/am65x_evm_a53_defconfig               |   1 +
>  configs/am65x_evm_r5_defconfig                |   1 +
>  configs/j721e_evm_a72_defconfig               |   3 +
>  configs/j721e_evm_r5_defconfig                |   3 +
>  drivers/mmc/am654_sdhci.c                     | 173 +++++++++++++-----
>  drivers/mmc/fsl_esdhc_imx.c                   |   1 -
>  drivers/mmc/mmc-uclass.c                      |  15 ++
>  drivers/mmc/mmc.c                             |  20 +-
>  drivers/mmc/omap_hsmmc.c                      |   1 -
>  drivers/mmc/sdhci.c                           |  15 ++
>  drivers/mmc/zynq_sdhci.c                      |   1 -
>  include/configs/am65x_evm.h                   |   2 -
>  include/mmc.h                                 |  12 +-
>  include/sdhci.h                               |   1 +
>  24 files changed, 298 insertions(+), 81 deletions(-)
> 

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

* [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e
  2020-02-26 11:01   ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Jaehoon Chung
@ 2020-03-04  6:34     ` Faiz Abbas
  2020-03-05 11:00       ` Peng Fan
  0 siblings, 1 reply; 16+ messages in thread
From: Faiz Abbas @ 2020-03-04  6:34 UTC (permalink / raw)
  To: u-boot

Peng,

On 26/02/20 4:31 pm, Jaehoon Chung wrote:
> Hi Faiz,
> 
> On 2/26/20 5:14 PM, Faiz Abbas wrote:
>> The following patches add support for eMMC boot in TI's Am65x and J721e
>> devices.
> 
> About adding deferred_probe(), i want to know Peng's opinion.
> But it's my preference. I will review about your series.
> Thanks for accepting my suggestion.
> 

Any feedback? Can you pick these patches up for next?

Thanks,
Faiz

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

* [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e
  2020-03-04  6:34     ` Faiz Abbas
@ 2020-03-05 11:00       ` Peng Fan
  2020-03-05 12:02         ` Jaehoon Chung
  0 siblings, 1 reply; 16+ messages in thread
From: Peng Fan @ 2020-03-05 11:00 UTC (permalink / raw)
  To: u-boot

> Subject: Re: [PATCH v3 00/11] Add Support for eMMC boot in AM65x and
> J721e
> 
> Peng,
> 
> On 26/02/20 4:31 pm, Jaehoon Chung wrote:
> > Hi Faiz,
> >
> > On 2/26/20 5:14 PM, Faiz Abbas wrote:
> >> The following patches add support for eMMC boot in TI's Am65x and
> >> J721e devices.
> >
> > About adding deferred_probe(), i want to know Peng's opinion.
> > But it's my preference. I will review about your series.
> > Thanks for accepting my suggestion.
> >
> 
> Any feedback? Can you pick these patches up for next?

When first glance to deferred_probe, I thought it behaviors
as Linux defer probe :)

I am ok with this series. I need run a CI for this series, then
send pull request to Tom's next tree. Should be tomorrow,
if no concern or issues

Regards,
Peng.
> 
> Thanks,
> Faiz

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

* [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e
  2020-03-05 11:00       ` Peng Fan
@ 2020-03-05 12:02         ` Jaehoon Chung
  0 siblings, 0 replies; 16+ messages in thread
From: Jaehoon Chung @ 2020-03-05 12:02 UTC (permalink / raw)
  To: u-boot

On 3/5/20 8:00 PM, Peng Fan wrote:
>> Subject: Re: [PATCH v3 00/11] Add Support for eMMC boot in AM65x and
>> J721e
>>
>> Peng,
>>
>> On 26/02/20 4:31 pm, Jaehoon Chung wrote:
>>> Hi Faiz,
>>>
>>> On 2/26/20 5:14 PM, Faiz Abbas wrote:
>>>> The following patches add support for eMMC boot in TI's Am65x and
>>>> J721e devices.
>>>
>>> About adding deferred_probe(), i want to know Peng's opinion.
>>> But it's my preference. I will review about your series.
>>> Thanks for accepting my suggestion.
>>>
>>
>> Any feedback? Can you pick these patches up for next?
> 
> When first glance to deferred_probe, I thought it behaviors
> as Linux defer probe :)
> 
> I am ok with this series. I need run a CI for this series, then
> send pull request to Tom's next tree. Should be tomorrow,
> if no concern or issues

Sounds good. I'm not still checking fully. But looks good to me.

Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>

Best Regards,
Jaehoon Chung

> 
> Regards,
> Peng.
>>
>> Thanks,
>> Faiz

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

end of thread, other threads:[~2020-03-05 12:02 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CGME20200226081316epcas1p1c5f81c8bb16a1235d5298b321b77f0fd@epcas1p1.samsung.com>
2020-02-26  8:14 ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 01/11] mmc: Add a saved_clock member Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 02/11] mmc: Add a deferred_probe() API Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 03/11] sdhci: Add sdhci_deferred_probe() API Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 04/11] mmc: Merge SD_LEGACY and MMC_LEGACY bus modes Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 05/11] mmc: am654_sdhci: Update output tap delay writes Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 06/11] mmc: am654_sdhci: Implement workaround for card detect Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 07/11] spl: mmc: Fix spl_mmc_get_uboot_raw_sector() implementation Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 08/11] arm: K3: sysfw-loader: Add a config_pm_pre_callback() Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 09/11] arm: dts: k3-j721e-r5-common-proc-board: Use unique names for dummy clocks Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 10/11] configs: am65x_evm: Add CONFIG_SUPPORT_EMMC_BOOT Faiz Abbas
2020-02-26  8:14   ` [PATCH v3 11/11] configs: j721e_evm: Add Support for eMMC boot Faiz Abbas
2020-02-26 11:01   ` [PATCH v3 00/11] Add Support for eMMC boot in AM65x and J721e Jaehoon Chung
2020-03-04  6:34     ` Faiz Abbas
2020-03-05 11:00       ` Peng Fan
2020-03-05 12:02         ` Jaehoon Chung

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.