summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2023-01-17 10:47:25 -0700
committerTom Rini <trini@konsulko.com>2023-01-23 18:11:39 -0500
commit3a2cb96e5dde427ccb670640a6a5fa1d61519a9b (patch)
tree41a4e1217e74afd3b3392ae0b3b88e7eaca6ee21
parentd0075059e4d942ac0dc7397fb7fa6646a211c917 (diff)
dm: mmc: Use bootdev_setup_sibling_blk()
At present MMC uses the bootdev_setup_for_dev() function to set up the bootdev. This is because MMC only has one block-device child, so does not need to worry about naming of the bootdev. However this inconsistency with other bootdevs that use block devices is a bit annoying. The only real reason for it is to have a name like 'mmc0.bootdev' instead of 'mmc0.blk.bootdev'. Update bootdev_setup_sibling_blk() to drop '.blk' from the name where it appears, thus removing the only reason to use the bootdev_setup_for_dev(). Switch MMC over to the subling function. Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r--boot/bootdev-uclass.c42
-rw-r--r--drivers/mmc/mmc-uclass.c2
-rw-r--r--include/bootdev.h5
3 files changed, 35 insertions, 14 deletions
diff --git a/boot/bootdev-uclass.c b/boot/bootdev-uclass.c
index cffa01824c..97f75cba49 100644
--- a/boot/bootdev-uclass.c
+++ b/boot/bootdev-uclass.c
@@ -234,13 +234,27 @@ int bootdev_setup_for_dev(struct udevice *parent, const char *drv_name)
return 0;
}
+static int bootdev_get_suffix_start(struct udevice *dev, const char *suffix)
+{
+ int len, slen;
+
+ len = strlen(dev->name);
+ slen = strlen(suffix);
+ if (len > slen && !strcmp(suffix, dev->name + len - slen))
+ return len - slen;
+
+ return len;
+}
+
int bootdev_setup_sibling_blk(struct udevice *blk, const char *drv_name)
{
struct udevice *parent, *dev;
char dev_name[50];
- int ret;
+ int ret, len;
- snprintf(dev_name, sizeof(dev_name), "%s.%s", blk->name, "bootdev");
+ len = bootdev_get_suffix_start(blk, ".blk");
+ snprintf(dev_name, sizeof(dev_name), "%.*s.%s", len, blk->name,
+ "bootdev");
parent = dev_get_parent(blk);
ret = device_find_child_by_name(parent, dev_name, &dev);
@@ -271,20 +285,22 @@ int bootdev_get_sibling_blk(struct udevice *dev, struct udevice **blkp)
struct udevice *parent = dev_get_parent(dev);
struct udevice *blk;
int ret, len;
- char *p;
if (device_get_uclass_id(dev) != UCLASS_BOOTDEV)
return -EINVAL;
/* This should always work if bootdev_setup_sibling_blk() was used */
- p = strstr(dev->name, ".bootdev");
- if (!p)
- return log_msg_ret("str", -EINVAL);
-
- len = p - dev->name;
+ len = bootdev_get_suffix_start(dev, ".bootdev");
ret = device_find_child_by_namelen(parent, dev->name, len, &blk);
- if (ret)
- return log_msg_ret("find", ret);
+ if (ret) {
+ char dev_name[50];
+
+ snprintf(dev_name, sizeof(dev_name), "%.*s.blk", len,
+ dev->name);
+ ret = device_find_child_by_name(parent, dev_name, &blk);
+ if (ret)
+ return log_msg_ret("find", ret);
+ }
*blkp = blk;
return 0;
@@ -295,13 +311,15 @@ static int bootdev_get_from_blk(struct udevice *blk, struct udevice **bootdevp)
struct udevice *parent = dev_get_parent(blk);
struct udevice *bootdev;
char dev_name[50];
- int ret;
+ int ret, len;
if (device_get_uclass_id(blk) != UCLASS_BLK)
return -EINVAL;
/* This should always work if bootdev_setup_sibling_blk() was used */
- snprintf(dev_name, sizeof(dev_name), "%s.%s", blk->name, "bootdev");
+ len = bootdev_get_suffix_start(blk, ".blk");
+ snprintf(dev_name, sizeof(dev_name), "%.*s.%s", len, blk->name,
+ "bootdev");
ret = device_find_child_by_name(parent, dev_name, &bootdev);
if (ret)
return log_msg_ret("find", ret);
diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
index 759a6b728c..01d9b0201f 100644
--- a/drivers/mmc/mmc-uclass.c
+++ b/drivers/mmc/mmc-uclass.c
@@ -421,7 +421,7 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
mmc->cfg = cfg;
mmc->priv = dev;
- ret = bootdev_setup_for_dev(dev, "mmc_bootdev");
+ ret = bootdev_setup_sibling_blk(bdev, "mmc_bootdev");
if (ret)
return log_msg_ret("bootdev", ret);
diff --git a/include/bootdev.h b/include/bootdev.h
index 9fc219839f..d0ca51c6d5 100644
--- a/include/bootdev.h
+++ b/include/bootdev.h
@@ -204,7 +204,10 @@ int bootdev_setup_iter_order(struct bootflow_iter *iter, struct udevice **devp);
#if CONFIG_IS_ENABLED(BOOTSTD)
/**
- * bootdev_setup_for_dev() - Bind a new bootdev device
+ * bootdev_setup_for_dev() - Bind a new bootdev device (deprecated)
+ *
+ * Please use bootdev_setup_sibling_blk() instead since it supports multiple
+ * (child) block devices for each media device.
*
* Creates a bootdev device as a child of @parent. This should be called from
* the driver's bind() method or its uclass' post_bind() method.