mirror of
https://github.com/home-assistant/operating-system.git
synced 2025-07-27 06:56:29 +00:00
Fall back to max eMMC clock to fix Kingston eMMC compat with ODROID-N2 (#3665)
This commit is contained in:
parent
f612d42fb3
commit
0dc9c65d3c
@ -0,0 +1,81 @@
|
|||||||
|
From 024796cbf752d2e210341ae8609792803641eb92 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Jan=20=C4=8Cerm=C3=A1k?= <sairon@sairon.cz>
|
||||||
|
Date: Thu, 7 Nov 2024 12:39:02 +0100
|
||||||
|
Subject: [PATCH] HACK: mmc: meson-gx: limit f_max to 24 MHz on the first try
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
To initialize some eMMCs cards properly, ODROID N2 needed to have
|
||||||
|
maximum clock rate limited to 24 MHz. This was working good until ODROID
|
||||||
|
released eMMC modules with Kingson chips which do not initialize at the
|
||||||
|
limited frequency at all - instead it seems it's best for the if
|
||||||
|
no limit is set (which would result in using 52 MHz anyway).
|
||||||
|
|
||||||
|
Instead of hard-limiting the frequency, add a boolean flag that caps the
|
||||||
|
frequency to the proven 24 MHz, and if mmc_select_mode_and_width fails,
|
||||||
|
remove this cap and use f_max set to 100 MHz, as limited in upstream
|
||||||
|
U-Boot.
|
||||||
|
|
||||||
|
Signed-off-by: Jan Čermák <sairon@sairon.cz>
|
||||||
|
---
|
||||||
|
drivers/mmc/meson_gx_mmc.c | 2 ++
|
||||||
|
drivers/mmc/mmc.c | 11 +++++++++++
|
||||||
|
include/mmc.h | 2 ++
|
||||||
|
3 files changed, 15 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/meson_gx_mmc.c b/drivers/mmc/meson_gx_mmc.c
|
||||||
|
index fcf4f03d1e..715dce3522 100644
|
||||||
|
--- a/drivers/mmc/meson_gx_mmc.c
|
||||||
|
+++ b/drivers/mmc/meson_gx_mmc.c
|
||||||
|
@@ -283,6 +283,8 @@ static int meson_mmc_probe(struct udevice *dev)
|
||||||
|
cfg->b_max = 511; /* max 512 - 1 blocks */
|
||||||
|
cfg->name = dev->name;
|
||||||
|
|
||||||
|
+ mmc->meson_gx_f_max_hack = true;
|
||||||
|
+
|
||||||
|
mmc->priv = pdata;
|
||||||
|
upriv->mmc = mmc;
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
|
||||||
|
index d96db7a0f8..c8dc676612 100644
|
||||||
|
--- a/drivers/mmc/mmc.c
|
||||||
|
+++ b/drivers/mmc/mmc.c
|
||||||
|
@@ -1652,6 +1652,10 @@ int mmc_set_clock(struct mmc *mmc, uint clock, bool disable)
|
||||||
|
clock = mmc->cfg->f_min;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Apply 24 MHz limit that fixes issues with some cards on meson. */
|
||||||
|
+ if (mmc->meson_gx_f_max_hack && clock > 24000000)
|
||||||
|
+ clock = 24000000;
|
||||||
|
+
|
||||||
|
mmc->clock = clock;
|
||||||
|
mmc->clk_disable = disable;
|
||||||
|
|
||||||
|
@@ -2647,6 +2651,13 @@ static int mmc_startup(struct mmc *mmc)
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
err = mmc_select_mode_and_width(mmc, mmc->card_caps);
|
||||||
|
+ if (err && mmc->meson_gx_f_max_hack) {
|
||||||
|
+ /* Some eMMCs (namely Kingston) do not initialize at limited frequency. */
|
||||||
|
+ printf("Card failed to initialize at %d Hz, disabling meson_gx hack.\n",
|
||||||
|
+ mmc->clock);
|
||||||
|
+ mmc->meson_gx_f_max_hack = false;
|
||||||
|
+ err = mmc_select_mode_and_width(mmc, mmc->card_caps);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (err)
|
||||||
|
diff --git a/include/mmc.h b/include/mmc.h
|
||||||
|
index 1022db3ffa..0ea48c6fd9 100644
|
||||||
|
--- a/include/mmc.h
|
||||||
|
+++ b/include/mmc.h
|
||||||
|
@@ -739,6 +739,8 @@ struct mmc {
|
||||||
|
u8 hs400_tuning;
|
||||||
|
|
||||||
|
enum bus_mode user_speed_mode; /* input speed mode from user */
|
||||||
|
+
|
||||||
|
+ bool meson_gx_f_max_hack;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(DM_MMC)
|
@ -1,26 +0,0 @@
|
|||||||
From 11f015e13ef0442b6d2bb734954291abde415f73 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
|
||||||
Date: Mon, 2 Sep 2019 15:42:04 +0200
|
|
||||||
Subject: [PATCH] HACK: mmc: meson-gx: limit to 24MHz
|
|
||||||
|
|
||||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
||||||
---
|
|
||||||
drivers/mmc/meson_gx_mmc.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/mmc/meson_gx_mmc.c b/drivers/mmc/meson_gx_mmc.c
|
|
||||||
index fcf4f03d1e..6ded4b619b 100644
|
|
||||||
--- a/drivers/mmc/meson_gx_mmc.c
|
|
||||||
+++ b/drivers/mmc/meson_gx_mmc.c
|
|
||||||
@@ -279,7 +279,7 @@ static int meson_mmc_probe(struct udevice *dev)
|
|
||||||
cfg->host_caps = MMC_MODE_8BIT | MMC_MODE_4BIT |
|
|
||||||
MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
|
||||||
cfg->f_min = DIV_ROUND_UP(SD_EMMC_CLKSRC_24M, CLK_MAX_DIV);
|
|
||||||
- cfg->f_max = 100000000; /* 100 MHz */
|
|
||||||
+ cfg->f_max = SD_EMMC_CLKSRC_24M;
|
|
||||||
cfg->b_max = 511; /* max 512 - 1 blocks */
|
|
||||||
cfg->name = dev->name;
|
|
||||||
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user