diff mbox series

[U-Boot,v2,1/2] core: add uclass_get_device_by_phandle_id() api

Message ID 1518144984-22127-1-git-send-email-kever.yang@rock-chips.com
State Accepted
Commit d255fade66414271950ab605098439591a67f1ed
Delegated to: Simon Glass
Headers show
Series [U-Boot,v2,1/2] core: add uclass_get_device_by_phandle_id() api | expand

Commit Message

Kever Yang Feb. 9, 2018, 2:56 a.m. UTC
Add api for who can not get phandle from a device property.

Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
---

Changes in v2:
- use uint instead of int for phandle
- address comment from Philipp

 drivers/core/uclass.c | 26 ++++++++++++++++++++++++++
 include/dm/uclass.h   | 16 ++++++++++++++++
 2 files changed, 42 insertions(+)

Comments

Philipp Tomsich Feb. 9, 2018, 10:15 a.m. UTC | #1
> Add api for who can not get phandle from a device property.
> 
> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
> ---
> 
> Changes in v2:
> - use uint instead of int for phandle
> - address comment from Philipp
> 
>  drivers/core/uclass.c | 26 ++++++++++++++++++++++++++
>  include/dm/uclass.h   | 16 ++++++++++++++++
>  2 files changed, 42 insertions(+)
> 

Reviewed-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Simon Glass Feb. 12, 2018, 2:35 p.m. UTC | #2
Hi Kever,

On 8 February 2018 at 19:56, Kever Yang <kever.yang@rock-chips.com> wrote:
> Add api for who can not get phandle from a device property.

Can you please add a motivation to the commit message? It is not
obvious to me when this function would be used.
>
> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
> ---
>
> Changes in v2:
> - use uint instead of int for phandle
> - address comment from Philipp
>
>  drivers/core/uclass.c | 26 ++++++++++++++++++++++++++
>  include/dm/uclass.h   | 16 ++++++++++++++++
>  2 files changed, 42 insertions(+)
>

Regards,
Simon
Kever Yang Feb. 24, 2018, 2:08 a.m. UTC | #3
Hi Simon,


On 02/12/2018 10:35 PM, Simon Glass wrote:
> Hi Kever,
>
> On 8 February 2018 at 19:56, Kever Yang <kever.yang@rock-chips.com> wrote:
>> Add api for who can not get phandle from a device property.
> Can you please add a motivation to the commit message? It is not
> obvious to me when this function would be used.
Here is the example why I need this, see the dts node here:
lvds@ff2e0000 {
    ...
    rockchip,grf = <&grf>;
    port {
        port@0 {
            endpoint@0 {
                remote-endpoint = <&vopl_out_lvds>;
            }
        }
    }
}

We can only get 'grf' udevice by uclass_get_device_by_phandle(),
but we not able to get udevice 'vopl_out_lvds', other driver like
rockchip pinctrl
also need to get udevice by a phandle which is not one of direct property of
another device node.

Thanks,
- Kever
>> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
>> ---
>>
>> Changes in v2:
>> - use uint instead of int for phandle
>> - address comment from Philipp
>>
>>  drivers/core/uclass.c | 26 ++++++++++++++++++++++++++
>>  include/dm/uclass.h   | 16 ++++++++++++++++
>>  2 files changed, 42 insertions(+)
>>
> Regards,
> Simon
>
Simon Glass Feb. 25, 2018, 3:54 p.m. UTC | #4
Hi Kever,

On 23 February 2018 at 19:08, Kever Yang <kever.yang@rock-chips.com> wrote:
> Hi Simon,
>
>
> On 02/12/2018 10:35 PM, Simon Glass wrote:
>> Hi Kever,
>>
>> On 8 February 2018 at 19:56, Kever Yang <kever.yang@rock-chips.com> wrote:
>>> Add api for who can not get phandle from a device property.
>> Can you please add a motivation to the commit message? It is not
>> obvious to me when this function would be used.
> Here is the example why I need this, see the dts node here:
> lvds@ff2e0000 {
>     ...
>     rockchip,grf = <&grf>;
>     port {
>         port@0 {
>             endpoint@0 {
>                 remote-endpoint = <&vopl_out_lvds>;
>             }
>         }
>     }
> }
>
> We can only get 'grf' udevice by uclass_get_device_by_phandle(),
> but we not able to get udevice 'vopl_out_lvds', other driver like
> rockchip pinctrl
> also need to get udevice by a phandle which is not one of direct property of
> another device node.

OK I see. This sort of info is useful in the commit message. It helps
to know two things about a patch:

- why it is needed
- what it does

In this case see rk_display_init() for how it handles the
'remote-endpoint' property. I think it would be better to have
something like:

ofnode ofnode_lookup_phandle(ofnode node, const char *prop_name);

This should meet your needs without needing to decoding the phandle
property in the caller.

Regards,
Simon
Kever Yang Feb. 26, 2018, 3:07 a.m. UTC | #5
Hi Simon,


On 02/25/2018 11:54 PM, Simon Glass wrote:
> Hi Kever,
>
> On 23 February 2018 at 19:08, Kever Yang <kever.yang@rock-chips.com> wrote:
>> Hi Simon,
>>
>>
>> On 02/12/2018 10:35 PM, Simon Glass wrote:
>>> Hi Kever,
>>>
>>> On 8 February 2018 at 19:56, Kever Yang <kever.yang@rock-chips.com> wrote:
>>>> Add api for who can not get phandle from a device property.
>>> Can you please add a motivation to the commit message? It is not
>>> obvious to me when this function would be used.
>> Here is the example why I need this, see the dts node here:
>> lvds@ff2e0000 {
>>     ...
>>     rockchip,grf = <&grf>;
>>     port {
>>         port@0 {
>>             endpoint@0 {
>>                 remote-endpoint = <&vopl_out_lvds>;
>>             }
>>         }
>>     }
>> }
>>
>> We can only get 'grf' udevice by uclass_get_device_by_phandle(),
>> but we not able to get udevice 'vopl_out_lvds', other driver like
>> rockchip pinctrl
>> also need to get udevice by a phandle which is not one of direct property of
>> another device node.
> OK I see. This sort of info is useful in the commit message. It helps
> to know two things about a patch:
>
> - why it is needed
> - what it does
>
> In this case see rk_display_init() for how it handles the
> 'remote-endpoint' property. I think it would be better to have
> something like:
>
> ofnode ofnode_lookup_phandle(ofnode node, const char *prop_name);
Yes, this is enough for "remote-endpoint" case, but not for pinctrl case:
1199         pinctrl: pinctrl {
2095                 pwm0
{                                                         
2096                         pwm0_pin: pwm0-pin
{                                   
2097                                 rockchip,pins
=                                
2098                                         <0 RK_PB7 RK_FUNC_1
&pcfg_pull_none>;  
2099                        
};                                                     
2100                 };    

    I think ofnode_lookup_phandle() still not able to find node for
'pcfg_pull_none'.

Thanks,
- Kever
>
> This should meet your needs without needing to decoding the phandle
> property in the caller.
>
> Regards,
> Simon
>
Philipp Tomsich Feb. 26, 2018, 9:51 a.m. UTC | #6
Kever,

> On 26 Feb 2018, at 04:07, Kever Yang <kever.yang@rock-chips.com> wrote:
> 
> Hi Simon,
> 
> 
> On 02/25/2018 11:54 PM, Simon Glass wrote:
>> Hi Kever,
>> 
>> On 23 February 2018 at 19:08, Kever Yang <kever.yang@rock-chips.com> wrote:
>>> Hi Simon,
>>> 
>>> 
>>> On 02/12/2018 10:35 PM, Simon Glass wrote:
>>>> Hi Kever,
>>>> 
>>>> On 8 February 2018 at 19:56, Kever Yang <kever.yang@rock-chips.com> wrote:
>>>>> Add api for who can not get phandle from a device property.
>>>> Can you please add a motivation to the commit message? It is not
>>>> obvious to me when this function would be used.
>>> Here is the example why I need this, see the dts node here:
>>> lvds@ff2e0000 {
>>>    ...
>>>    rockchip,grf = <&grf>;
>>>    port {
>>>        port@0 {
>>>            endpoint@0 {
>>>                remote-endpoint = <&vopl_out_lvds>;
>>>            }
>>>        }
>>>    }
>>> }
>>> 
>>> We can only get 'grf' udevice by uclass_get_device_by_phandle(),
>>> but we not able to get udevice 'vopl_out_lvds', other driver like
>>> rockchip pinctrl
>>> also need to get udevice by a phandle which is not one of direct property of
>>> another device node.
>> OK I see. This sort of info is useful in the commit message. It helps
>> to know two things about a patch:
>> 
>> - why it is needed
>> - what it does
>> 
>> In this case see rk_display_init() for how it handles the
>> 'remote-endpoint' property. I think it would be better to have
>> something like:
>> 
>> ofnode ofnode_lookup_phandle(ofnode node, const char *prop_name);
> Yes, this is enough for "remote-endpoint" case, but not for pinctrl case:
> 1199         pinctrl: pinctrl {
> 2095                 pwm0
> {                                                         
> 2096                         pwm0_pin: pwm0-pin
> {                                   
> 2097                                 rockchip,pins
> =                                
> 2098                                         <0 RK_PB7 RK_FUNC_1
> &pcfg_pull_none>;  
> 2099                        
> };                                                     
> 2100                 };    
> 
>    I think ofnode_lookup_phandle() still not able to find node for
> 'pcfg_pull_none’.

I had to convert rk_vop to livetree last week to fix a regression on HDMI for our
RK3399-Q7.  In doing so, I created some code to “walk the tree to find a parent
with a given uclass) … this had me introduce an new ofnode_get_parent() function.

Anatolij merged this on the weekend and it’s on Tom’s master already.

Best,
Philipp.

> 
> Thanks,
> - Kever
>> 
>> This should meet your needs without needing to decoding the phandle
>> property in the caller.
>> 
>> Regards,
>> Simon
Simon Glass April 1, 2018, 2:28 p.m. UTC | #7
Applied to u-boot-dm, thanks!
diff mbox series

Patch

diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c
index f5e4067..274b833 100644
--- a/drivers/core/uclass.c
+++ b/drivers/core/uclass.c
@@ -443,6 +443,32 @@  int uclass_get_device_by_ofnode(enum uclass_id id, ofnode node,
 }
 
 #if CONFIG_IS_ENABLED(OF_CONTROL)
+int uclass_get_device_by_phandle_id(enum uclass_id id, uint phandle_id,
+				    struct udevice **devp)
+{
+	struct udevice *dev;
+	struct uclass *uc;
+	int ret;
+
+	*devp = NULL;
+	ret = uclass_get(id, &uc);
+	if (ret)
+		return ret;
+
+	list_for_each_entry(dev, &uc->dev_head, uclass_node) {
+		uint phandle;
+
+		phandle = dev_read_phandle(dev);
+
+		if (phandle == phandle_id) {
+			*devp = dev;
+			return uclass_get_device_tail(dev, ret, devp);
+		}
+	}
+
+	return -ENODEV;
+}
+
 int uclass_get_device_by_phandle(enum uclass_id id, struct udevice *parent,
 				 const char *name, struct udevice **devp)
 {
diff --git a/include/dm/uclass.h b/include/dm/uclass.h
index 1818849..63cb6e9 100644
--- a/include/dm/uclass.h
+++ b/include/dm/uclass.h
@@ -203,6 +203,22 @@  int uclass_get_device_by_ofnode(enum uclass_id id, ofnode node,
 				struct udevice **devp);
 
 /**
+ * uclass_get_device_by_phandle_id() - Get a uclass device by phandle id
+ *
+ * This searches the devices in the uclass for one with the given phandle id.
+ *
+ * The device is probed to activate it ready for use.
+ *
+ * @id: uclass ID to look up
+ * @phandle_id: the phandle id to look up
+ * @devp: Returns pointer to device (there is only one for each node)
+ * @return 0 if OK, -ENODEV if there is no device match the phandle, other
+ *	-ve on error
+ */
+int uclass_get_device_by_phandle_id(enum uclass_id id, uint phandle_id,
+				    struct udevice **devp);
+
+/**
  * uclass_get_device_by_phandle() - Get a uclass device by phandle
  *
  * This searches the devices in the uclass for one with the given phandle.