bootstd: Move label parsing into its own function

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@chromium.org>
This commit is contained in:
Simon Glass 2023-01-17 10:48:00 -07:00 committed by Tom Rini
parent a58e7bbeb6
commit 74ebfb60f6

View file

@ -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) {