[PATCH 51/71] bootstd: Move label parsing into its own function

Simon Glass sjg at chromium.org
Wed Dec 7 09:51:17 CET 2022


This is complicated enough to merit its own function, particularly as we
are about to add to it. Create a new label_to_uclass() function to decode
a label.

Also update the code to ignore an empty label or one consisting of just a
number.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 boot/bootdev-uclass.c | 48 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 36 insertions(+), 12 deletions(-)

diff --git a/boot/bootdev-uclass.c b/boot/bootdev-uclass.c
index 3dcf317c150..f43307d006d 100644
--- a/boot/bootdev-uclass.c
+++ b/boot/bootdev-uclass.c
@@ -354,6 +354,37 @@ int bootdev_unbind_dev(struct udevice *parent)
 	return 0;
 }
 
+/**
+ * label_to_uclass() - Convert a label to a uclass and sequence number
+ *
+ * @label: Label to look up (e.g. "mmc1" or "mmc0")
+ * @seqp: Returns the sequence number, or -1 if none
+ * Returns: sequence number on success, else -ve error code
+ */
+static int label_to_uclass(const char *label, int *seqp)
+{
+	enum uclass_id id;
+	const char *end;
+	int seq, len;
+
+	seq = trailing_strtoln_end(label, NULL, &end);
+	len = end - label;
+	if (!len)
+		return -EINVAL;
+	id = uclass_get_by_namelen(label, len);
+	log_debug("find %s: seq=%d, id=%d/%s\n", label, seq, id,
+		  uclass_get_name(id));
+	if (id == UCLASS_INVALID) {
+		log_warning("Unknown uclass '%s' in label\n", label);
+		return -EINVAL;
+	}
+	if (id == UCLASS_USB)
+		id = UCLASS_MASS_STORAGE;
+	*seqp = seq;
+
+	return id;
+}
+
 /**
  * bootdev_find_by_label() - Convert a label string to a bootdev device
  *
@@ -372,19 +403,12 @@ int bootdev_find_by_label(const char *label, struct udevice **devp)
 	struct udevice *media;
 	struct uclass *uc;
 	enum uclass_id id;
-	const char *end;
-	int seq;
+	int seq, ret;
 
-	seq = trailing_strtoln_end(label, NULL, &end);
-	id = uclass_get_by_namelen(label, end - label);
-	log_debug("find %s: seq=%d, id=%d/%s\n", label, seq, id,
-		  uclass_get_name(id));
-	if (id == UCLASS_INVALID) {
-		log_warning("Unknown uclass '%s' in label\n", label);
-		return -EINVAL;
-	}
-	if (id == UCLASS_USB)
-		id = UCLASS_MASS_STORAGE;
+	ret = label_to_uclass(label, &seq);
+	if (ret < 0)
+		return log_msg_ret("uc", ret);
+	id = ret;
 
 	/* Iterate through devices in the media uclass (e.g. UCLASS_MMC) */
 	uclass_id_foreach_dev(id, media, uc) {
-- 
2.39.0.rc0.267.gcb52ba06e7-goog



More information about the U-Boot mailing list