[U-Boot] [PATCH v2 02/12] dm: device: add function device_get_first_child_by_uclass_id()

Simon Glass
2015-03-06T14:11:02Z

Hi Przemyslaw,

On 3 March 2015 at 09:24, Przemyslaw Marczak <p.marczak@samsung.com> wrote:
>
> To implement functionality for devices connected by some external
> interface, sometimes there is need to implement more then one,
> and different uclass type drivers.
>
> But only one i2c/spi dm chip can exists, per each bus i2c address
> or spi select. Then, it seems to be useful, to get the child device
> by uclass type, for the parent with known chip address.
>
> So, this change will be useful for the pmic case:
> |- i2c bus
> '- pmic i2c chip (parent)
> '- uclass regulator (child 1)
> '- uclass charger (child 2)
>
> This will allow to get the regulator or charger device if knows only parent
> i2c/spi address.
>
> Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com>
> ---
> Changes V2:
> - new commit
> ---
> drivers/core/device.c | 15 +++++++++++++++
> include/dm/device.h | 16 ++++++++++++++++
> 2 files changed, 31 insertions(+)
>
> diff --git a/drivers/core/device.c b/drivers/core/device.c
> index 73c3e07..76b22cf 100644
> --- a/drivers/core/device.c
> +++ b/drivers/core/device.c
> @@ -397,6 +397,21 @@ int device_find_child_by_of_offset(struct udevice *parent, int of_offset,
> return -ENODEV;
> }
>
> +int device_get_first_child_by_uclass_id(struct udevice *parent, int uclass_id,

Can you please use the enum here instead of int?

>
> + struct udevice **devp)
> +{
> + struct udevice *dev;
> +
> + *devp = NULL;
> +
> + list_for_each_entry(dev, &parent->child_head, sibling_node) {
> + if (dev->driver->id == uclass_id)
> + return device_get_device_tail(dev, 0, devp);
> + }
> +
> + return -ENODEV;
> +}
> +
> int device_get_child_by_of_offset(struct udevice *parent, int seq,
> struct udevice **devp)
> {
> diff --git a/include/dm/device.h b/include/dm/device.h
> index 7a48eb8..9f0d6ce 100644
> --- a/include/dm/device.h
> +++ b/include/dm/device.h
> @@ -335,6 +335,22 @@ int device_get_child_by_of_offset(struct udevice *parent, int seq,
> struct udevice **devp);
>
> /**
> + * device_get_first_child_by_uclass_id() - Get the first child device based
> + * on UCLASS_ID
> + *
> + * Locates a child device by its uclass id.
> + *
> + * The device is probed to activate it ready for use.
> + *
> + * @parent: Parent device
> + * @uclass_id: child uclass id
> + * @devp: Returns pointer to device if found, otherwise this is set to NULL
> + * @return 0 if OK, -ve on error
> + */
> +int device_get_first_child_by_uclass_id(struct udevice *parent, int uclass_id,
> + struct udevice **devp);
> +
> +/**
> * device_find_first_child() - Find the first child of a device
> *
> * @parent: Parent device to search
> --
> 1.9.1
>

Regards,
Simon