dm: core: Export uclass_find_device_by_phandle()

This function may be useful to code outside of the code driver-model
implementation. Export it and add a test.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2018-11-18 08:14:30 -07:00
parent 499fde5c23
commit d0b4f68d19
3 changed files with 39 additions and 4 deletions

View file

@ -354,10 +354,8 @@ done:
}
#if CONFIG_IS_ENABLED(OF_CONTROL)
static int uclass_find_device_by_phandle(enum uclass_id id,
struct udevice *parent,
const char *name,
struct udevice **devp)
int uclass_find_device_by_phandle(enum uclass_id id, struct udevice *parent,
const char *name, struct udevice **devp)
{
struct udevice *dev;
struct uclass *uc;

View file

@ -142,6 +142,23 @@ int uclass_find_device_by_of_offset(enum uclass_id id, int node,
int uclass_find_device_by_ofnode(enum uclass_id id, ofnode node,
struct udevice **devp);
/**
* uclass_find_device_by_phandle() - Find a uclass device by phandle
*
* This searches the devices in the uclass for one with the given phandle.
*
* The device is NOT probed, it is merely returned.
*
* @id: ID to look up
* @parent: Parent device containing the phandle pointer
* @name: Name of property in the parent device node
* @devp: Returns pointer to device (there is only one for each node)
* @return 0 if OK, -ENOENT if there is no @name present in the node, other
* -ve on error
*/
int uclass_find_device_by_phandle(enum uclass_id id, struct udevice *parent,
const char *name, struct udevice **devp);
/**
* uclass_bind_device() - Associate device with a uclass
*

View file

@ -611,3 +611,23 @@ static int dm_test_fdt_disable_enable_by_path(struct unit_test_state *uts)
}
DM_TEST(dm_test_fdt_disable_enable_by_path, DM_TESTF_SCAN_PDATA |
DM_TESTF_SCAN_FDT);
/* Test a few uclass phandle functions */
static int dm_test_fdt_phandle(struct unit_test_state *uts)
{
struct udevice *back, *dev, *dev2;
ut_assertok(uclass_find_first_device(UCLASS_PANEL_BACKLIGHT, &back));
ut_asserteq(-ENOENT, uclass_find_device_by_phandle(UCLASS_REGULATOR,
back, "missing", &dev));
ut_assertok(uclass_find_device_by_phandle(UCLASS_REGULATOR, back,
"power-supply", &dev));
ut_asserteq(0, device_active(dev));
ut_asserteq_str("ldo1", dev->name);
ut_assertok(uclass_get_device_by_phandle(UCLASS_REGULATOR, back,
"power-supply", &dev2));
ut_asserteq_ptr(dev, dev2);
return 0;
}
DM_TEST(dm_test_fdt_phandle, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);