-
-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fall back to max eMMC clock to fix Kingston eMMC compat with ODROID-N2
Replace the original patch that limits the frequency to 24 MHz with a more sophisticated version that first tries to initialize the eMMC at this limited frequency, and if it fails, then tries disabling the limit to use one defined in the upstream driver. While still hacky, this seems to finally fix the Kingston eMMC issues, and with the current implementation, the initialization should appear the same as on older HAOS versions, as 24 MHz is used first. Better solution that addresses the root cause on some eMMCs (128 GB Microns?) would be still nice though... refs #3250, refs #3227
- Loading branch information
Showing
2 changed files
with
81 additions
and
26 deletions.
There are no files selected for viewing
81 changes: 81 additions & 0 deletions
81
.../hardkernel/patches/uboot/0001-HACK-mmc-meson-gx-limit-f_max-to-24-MHz-on-the-first.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
From 024796cbf752d2e210341ae8609792803641eb92 Mon Sep 17 00:00:00 2001 | ||
From: =?UTF-8?q?Jan=20=C4=8Cerm=C3=A1k?= <[email protected]> | ||
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 <[email protected]> | ||
--- | ||
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) |
26 changes: 0 additions & 26 deletions
26
...droot-external/board/hardkernel/patches/uboot/0001-HACK-mmc-meson-gx-limit-to-24MHz.patch
This file was deleted.
Oops, something went wrong.