Re: [PATCH] mmc: core: fix host controller programming for fixed driver type

From: Shawn Lin

Date: Mon Apr 20 2026 - 22:17:52 EST


在 2026/04/18 星期六 5:02, Kamal Dasu 写道:
When using the fixed-emmc-driver-type device tree property, the MMC core
correctly selects the driver strength for the card but fails to program
the host controller accordingly. This causes a mismatch where the card
uses the specified driver type while the host controller defaults to
Type B (since ios->drv_type remains zero).

Split the driver type programming logic to handle both fixed and dynamic
driver type selection paths. For fixed driver types, program the host
controller with the selected drive_strength value. For dynamic selection,
use the existing drv_type as before.

This ensures both the eMMC device and host controller use matching driver
strengths, preventing potential signal integrity issues.


I agree the host and card drive strengths should match. However, it
highlights a deeper issue: the drv_type(A/B/C/D) is only implemented by
sdhci-based hosts. Many other controllers configure their drive strength
in their GPIO or IOMUX/Pinmux modules, which currently have no
association with ios->drv_type. Moreover, the strength levels defined by
the type A/B/C/D standard may not have a direct mapping to the drive strength settings of these modules.

Therefore, the fixed-emmc-driver-type property may have introduced a
"signal configuration gap" from the start: it can specify a type for the eMMC device side, but the corresponding drive strength configuration on
the host side may not take effect, or may not even exist. This is not
just a missing driver implementation, but a lack of coordination at the
framework level.

Nevertheless, within the existing framework, this patch is a reasonable
and positive improvement to me. With one suggestion below, feel free to add:

Reviewed-by: Shawn Lin <shawn.lin@xxxxxxxxxxxxxx>


Fixes: 6186d06c519e ("mmc: parse new binding for eMMC fixed driver type")
Signed-off-by: Kamal Dasu <kamal.dasu@xxxxxxxxxxxx>
---
drivers/mmc/core/mmc.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 8846550a8892..3507a8d8610a 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1371,8 +1371,12 @@ static void mmc_select_driver_type(struct mmc_card *card)
card->drive_strength = drive_strength;
- if (drv_type)
+ if (fixed_drv_type >= 0) {

How about check in a single line: if (fixed_drv_type >= 0 && drive_strength)

+ if (drive_strength)
+ mmc_set_driver_type(card->host, drive_strength);
+ } else if (drv_type) {
mmc_set_driver_type(card->host, drv_type);
+ }
}
static int mmc_select_hs400es(struct mmc_card *card)