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

Kamal Dasu posted 1 patch 1 month, 3 weeks ago
drivers/mmc/core/mmc.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
[PATCH v2] mmc: core: fix host controller programming for fixed driver type
Posted by Kamal Dasu 1 month, 3 weeks ago
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.

Fixes: 6186d06c519e ("mmc: parse new binding for eMMC fixed driver type")
Signed-off-by: Kamal Dasu <kamal.dasu@broadcom.com>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
---
 drivers/mmc/core/mmc.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 8846550a8892..05444ecf3909 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1371,7 +1371,9 @@ static void mmc_select_driver_type(struct mmc_card *card)
 
 	card->drive_strength = drive_strength;
 
-	if (drv_type)
+	if (fixed_drv_type >= 0 && drive_strength)
+		mmc_set_driver_type(card->host, drive_strength);
+	else if (drv_type)
 		mmc_set_driver_type(card->host, drv_type);
 }
 
-- 
2.34.1
Re: [PATCH v2] mmc: core: fix host controller programming for fixed driver type
Posted by Ulf Hansson 1 month ago
On Thu, 23 Apr 2026 at 21:21, Kamal Dasu <kamal.dasu@broadcom.com> wrote:
>
> 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.
>
> Fixes: 6186d06c519e ("mmc: parse new binding for eMMC fixed driver type")
> Signed-off-by: Kamal Dasu <kamal.dasu@broadcom.com>
> Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>

Applied for fixes and by adding stable tag, thanks!

Kind regards
Uffe


> ---
>  drivers/mmc/core/mmc.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index 8846550a8892..05444ecf3909 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -1371,7 +1371,9 @@ static void mmc_select_driver_type(struct mmc_card *card)
>
>         card->drive_strength = drive_strength;
>
> -       if (drv_type)
> +       if (fixed_drv_type >= 0 && drive_strength)
> +               mmc_set_driver_type(card->host, drive_strength);
> +       else if (drv_type)
>                 mmc_set_driver_type(card->host, drv_type);
>  }
>
> --
> 2.34.1
>