summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rini <[email protected]>2026-01-22 08:36:35 -0600
committerTom Rini <[email protected]>2026-01-22 08:36:35 -0600
commit64662b99c0ebc56c2773ca32a20aa055d25719f7 (patch)
treef67f48b2eca26310844d2c4f024a447e142e4227
parentfd871fc6bb497c6ddd7b39622480b89add78f57b (diff)
parent124aeeff837d20374ec00e292c31444b67b7a971 (diff)
Merge tag 'mmc-for-2026.04-rc1-2' of https://source.denx.de/u-boot/custodians/u-boot-mmc
CI: https://source.denx.de/u-boot/custodians/u-boot-mmc/-/pipelines/29066 - mmc: Fix sdhci-cadence6 license - mmc: Fix sd_get_capabilities retry logic - mmc: use max-frequency from device tree - Clean up regulator and build fix
-rw-r--r--drivers/mmc/mmc-uclass.c8
-rw-r--r--drivers/mmc/mmc.c32
-rw-r--r--drivers/mmc/sdhci-cadence6.c2
-rw-r--r--drivers/power/regulator/regulator_common.c89
4 files changed, 69 insertions, 62 deletions
diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
index 2f4dc5bd887..698530088fe 100644
--- a/drivers/mmc/mmc-uclass.c
+++ b/drivers/mmc/mmc-uclass.c
@@ -243,8 +243,12 @@ int mmc_of_parse(struct udevice *dev, struct mmc_config *cfg)
return -EINVAL;
}
- /* f_max is obtained from the optional "max-frequency" property */
- dev_read_u32(dev, "max-frequency", &cfg->f_max);
+ /*
+ * Maximum frequency is obtained from the optional "max-frequency" DT property.
+ * Use dev_read_u32_default() to preserve the driver-set f_max value when
+ * "max-frequency" is not present, ensuring the controller's default is used.
+ */
+ cfg->f_max = dev_read_u32_default(dev, "max-frequency", cfg->f_max);
if (dev_read_bool(dev, "cap-sd-highspeed"))
cfg->host_caps |= MMC_CAP(SD_HS);
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 71664173016..7dadff27abe 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -1382,6 +1382,7 @@ static int sd_get_capabilities(struct mmc *mmc)
ALLOC_CACHE_ALIGN_BUFFER(__be32, switch_status, 16);
struct mmc_data data;
int timeout;
+ uint retries = 3;
mmc->card_caps = MMC_MODE_1BIT | MMC_CAP(MMC_LEGACY);
@@ -1389,25 +1390,26 @@ static int sd_get_capabilities(struct mmc *mmc)
return 0;
/* Read the SCR to find out if this card supports higher speeds */
- cmd.cmdidx = MMC_CMD_APP_CMD;
- cmd.resp_type = MMC_RSP_R1;
- cmd.cmdarg = mmc->rca << 16;
-
- err = mmc_send_cmd(mmc, &cmd, NULL);
+ do {
+ cmd.cmdidx = MMC_CMD_APP_CMD;
+ cmd.resp_type = MMC_RSP_R1;
+ cmd.cmdarg = mmc->rca << 16;
- if (err)
- return err;
+ err = mmc_send_cmd(mmc, &cmd, NULL);
+ if (err)
+ continue;
- cmd.cmdidx = SD_CMD_APP_SEND_SCR;
- cmd.resp_type = MMC_RSP_R1;
- cmd.cmdarg = 0;
+ cmd.cmdidx = SD_CMD_APP_SEND_SCR;
+ cmd.resp_type = MMC_RSP_R1;
+ cmd.cmdarg = 0;
- data.dest = (char *)scr;
- data.blocksize = 8;
- data.blocks = 1;
- data.flags = MMC_DATA_READ;
+ data.dest = (char *)scr;
+ data.blocksize = 8;
+ data.blocks = 1;
+ data.flags = MMC_DATA_READ;
- err = mmc_send_cmd_retry(mmc, &cmd, &data, 3);
+ err = mmc_send_cmd(mmc, &cmd, &data);
+ } while (err && retries--);
if (err)
return err;
diff --git a/drivers/mmc/sdhci-cadence6.c b/drivers/mmc/sdhci-cadence6.c
index 91a245aa490..ca1086e2359 100644
--- a/drivers/mmc/sdhci-cadence6.c
+++ b/drivers/mmc/sdhci-cadence6.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0-or-platform_driver
+// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2023 Starfive.
* Author: Kuan Lim Lee <[email protected]>
diff --git a/drivers/power/regulator/regulator_common.c b/drivers/power/regulator/regulator_common.c
index 685d8735fa5..85af8d599ad 100644
--- a/drivers/power/regulator/regulator_common.c
+++ b/drivers/power/regulator/regulator_common.c
@@ -27,12 +27,14 @@ int regulator_common_of_to_plat(struct udevice *dev,
/* Get optional enable GPIO desc */
gpio = &plat->gpio;
- ret = gpio_request_by_name(dev, enable_gpio_name, 0, gpio, flags);
- if (ret) {
- debug("Regulator '%s' optional enable GPIO - not found! Error: %d\n",
- dev->name, ret);
- if (ret != -ENOENT)
- return ret;
+ if (CONFIG_IS_ENABLED(DM_GPIO)) {
+ ret = gpio_request_by_name(dev, enable_gpio_name, 0, gpio, flags);
+ if (ret) {
+ debug("Regulator '%s' optional enable GPIO - not found! Error: %d\n",
+ dev->name, ret);
+ if (ret != -ENOENT)
+ return ret;
+ }
}
/* Get optional ramp up delay */
@@ -51,10 +53,10 @@ int regulator_common_get_enable(const struct udevice *dev,
struct regulator_common_plat *plat)
{
/* Enable GPIO is optional */
- if (!plat->gpio.dev)
- return true;
+ if (CONFIG_IS_ENABLED(DM_GPIO) && dm_gpio_is_valid(&plat->gpio))
+ return dm_gpio_get_value(&plat->gpio);
- return dm_gpio_get_value(&plat->gpio);
+ return true;
}
int regulator_common_set_enable(const struct udevice *dev,
@@ -65,48 +67,47 @@ int regulator_common_set_enable(const struct udevice *dev,
debug("%s: dev='%s', enable=%d, delay=%d, has_gpio=%d\n", __func__,
dev->name, enable, plat->startup_delay_us,
dm_gpio_is_valid(&plat->gpio));
+
/* Enable GPIO is optional */
- if (!dm_gpio_is_valid(&plat->gpio)) {
- if (!enable)
- return -ENOSYS;
- return 0;
- }
+ if (CONFIG_IS_ENABLED(DM_GPIO) && dm_gpio_is_valid(&plat->gpio)) {
+ /* If previously enabled, increase count */
+ if (enable && plat->enable_count > 0) {
+ plat->enable_count++;
+ return -EALREADY;
+ }
- /* If previously enabled, increase count */
- if (enable && plat->enable_count > 0) {
- plat->enable_count++;
- return -EALREADY;
- }
+ if (!enable) {
+ if (plat->enable_count > 1) {
+ /* If enabled multiple times, decrease count */
+ plat->enable_count--;
+ return -EBUSY;
+ } else if (!plat->enable_count) {
+ /* If already disabled, do nothing */
+ return -EALREADY;
+ }
+ }
- if (!enable) {
- if (plat->enable_count > 1) {
- /* If enabled multiple times, decrease count */
- plat->enable_count--;
- return -EBUSY;
- } else if (!plat->enable_count) {
- /* If already disabled, do nothing */
- return -EALREADY;
+ ret = dm_gpio_set_value(&plat->gpio, enable);
+ if (ret) {
+ pr_err("Can't set regulator : %s gpio to: %d\n", dev->name,
+ enable);
+ return ret;
}
- }
- ret = dm_gpio_set_value(&plat->gpio, enable);
- if (ret) {
- pr_err("Can't set regulator : %s gpio to: %d\n", dev->name,
- enable);
- return ret;
- }
+ if (enable && plat->startup_delay_us)
+ udelay(plat->startup_delay_us);
- if (enable && plat->startup_delay_us)
- udelay(plat->startup_delay_us);
- debug("%s: done\n", __func__);
+ if (!enable && plat->off_on_delay_us)
+ udelay(plat->off_on_delay_us);
- if (!enable && plat->off_on_delay_us)
- udelay(plat->off_on_delay_us);
+ if (enable)
+ plat->enable_count++;
+ else
+ plat->enable_count--;
- if (enable)
- plat->enable_count++;
- else
- plat->enable_count--;
+ } else {
+ ret = enable ? 0 : -ENOSYS;
+ }
- return 0;
+ return ret;
}