aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Gerlach2021-04-23 11:27:37 -0500
committerLokesh Vutla2021-05-12 16:27:57 +0530
commitf4686c3d5b96dfdc5d6687845f1c7505fa26bca8 (patch)
tree9a576170730e6519932db15d5ddc9657d7246c87
parentd2edabfa8de56460bfe1641f019d793c6d685a14 (diff)
arm: mach-k3: am642: Use mmc start and stop callbacks
To avoid any glitches on MMC clock line, make use of pm per and post callbacks when loading sysfw. Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
-rw-r--r--arch/arm/mach-k3/am642_init.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/arch/arm/mach-k3/am642_init.c b/arch/arm/mach-k3/am642_init.c
index b2c3774854e..d09fc59146a 100644
--- a/arch/arm/mach-k3/am642_init.c
+++ b/arch/arm/mach-k3/am642_init.c
@@ -19,6 +19,7 @@
#include <dm.h>
#include <dm/uclass-internal.h>
#include <dm/pinctrl.h>
+#include <mmc.h>
#if defined(CONFIG_SPL_BUILD)
@@ -51,6 +52,36 @@ static void store_boot_info_from_rom(void)
sizeof(struct rom_extended_boot_data));
}
+#if defined(CONFIG_K3_LOAD_SYSFW) && CONFIG_IS_ENABLED(DM_MMC)
+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);
+ }
+}
+#else
+void k3_mmc_stop_clock(void) {}
+void k3_mmc_restart_clock(void) {}
+#endif
+
void board_init_f(ulong dummy)
{
#if defined(CONFIG_K3_LOAD_SYSFW)
@@ -94,7 +125,8 @@ void board_init_f(ulong dummy)
* system firmware and if so, will only perform needed config
* and not attempt to load firmware again.
*/
- k3_sysfw_loader(is_rom_loaded_sysfw(&bootdata), NULL, NULL);
+ k3_sysfw_loader(is_rom_loaded_sysfw(&bootdata), k3_mmc_stop_clock,
+ k3_mmc_restart_clock);
#endif
/* Output System Firmware version info */