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:
parent
6aa4fe3912
commit
4e0710a2d0
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user