diff mbox

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

Message ID 1425399883-14053-3-git-send-email-p.marczak@samsung.com
State Changes Requested
Delegated to: Simon Glass
Headers show

Commit Message

Przemyslaw Marczak March 3, 2015, 4:24 p.m. UTC
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(+)

Comments

Simon Glass March 6, 2015, 2:11 p.m. UTC | #1
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
Przemyslaw Marczak March 25, 2015, 4:08 p.m. UTC | #2
Hello Simon,

On 03/06/2015 03:11 PM, Simon Glass wrote:
> 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
>

This function is discarded in the V3.

Best regards,
diff mbox

Patch

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,
+					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