dm: core: Allow finding a uclass device by partial name

In some cases two devices are related and the only way to tell is to
check that the names partially patch. Add a way to check this without
needing to create a new string for the comparison.

Fix the comment for device_find_child_by_namelen() while we are here.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2022-04-24 23:31:00 -06:00 committed by Tom Rini
parent 6aa4fe3912
commit 4e0710a2d0
4 changed files with 42 additions and 4 deletions

View File

@ -274,8 +274,8 @@ int uclass_find_next_device(struct udevice **devp)
return 0;
}
int uclass_find_device_by_name(enum uclass_id id, const char *name,
struct udevice **devp)
int uclass_find_device_by_namelen(enum uclass_id id, const char *name, int len,
struct udevice **devp)
{
struct uclass *uc;
struct udevice *dev;
@ -289,7 +289,8 @@ int uclass_find_device_by_name(enum uclass_id id, const char *name,
return ret;
uclass_foreach_dev(dev, uc) {
if (!strcmp(dev->name, name)) {
if (!strncmp(dev->name, name, len) &&
strlen(dev->name) == len) {
*devp = dev;
return 0;
}
@ -298,6 +299,12 @@ int uclass_find_device_by_name(enum uclass_id id, const char *name,
return -ENODEV;
}
int uclass_find_device_by_name(enum uclass_id id, const char *name,
struct udevice **devp)
{
return uclass_find_device_by_namelen(id, name, strlen(name), devp);
}
int uclass_find_next_free_seq(struct uclass *uc)
{
struct udevice *dev;

View File

@ -799,7 +799,7 @@ int device_find_first_child_by_uclass(const struct udevice *parent,
struct udevice **devp);
/**
* device_find_child_by_name() - Find a child by device name
* device_find_child_by_namelen() - Find a child by device name
*
* @parent: Parent device to search
* @name: Name to look for

View File

@ -154,6 +154,22 @@ int uclass_find_first_device(enum uclass_id id, struct udevice **devp);
*/
int uclass_find_next_device(struct udevice **devp);
/**
* uclass_find_device_by_namelen() - Find uclass device based on ID and name
*
* This searches for a device with the exactly given name.
*
* The device is NOT probed, it is merely returned.
*
* @id: ID to look up
* @name: name of a device to find
* @len: Length of @name (the uclass driver name must have the same length)
* @devp: Returns pointer to device (the first one with the name)
* Return: 0 if OK, -ve on error
*/
int uclass_find_device_by_namelen(enum uclass_id id, const char *name, int len,
struct udevice **devp);
/**
* uclass_find_device_by_name() - Find uclass device based on ID and name
*

View File

@ -1260,3 +1260,18 @@ static int dm_test_get_stats(struct unit_test_state *uts)
return 0;
}
DM_TEST(dm_test_get_stats, UT_TESTF_SCAN_FDT);
/* Test uclass_find_device_by_name() */
static int dm_test_uclass_find_device(struct unit_test_state *uts)
{
struct udevice *dev;
ut_assertok(uclass_find_device_by_name(UCLASS_I2C, "i2c@0", &dev));
ut_asserteq(-ENODEV,
uclass_find_device_by_name(UCLASS_I2C, "i2c@0x", &dev));
ut_assertok(uclass_find_device_by_namelen(UCLASS_I2C, "i2c@0x", 5,
&dev));
return 0;
}
DM_TEST(dm_test_uclass_find_device, UT_TESTF_SCAN_FDT);