Re: [PATCH v2 3/5] usb: typec: hd3ss3220: Use OF graph API to get the connector fwnode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 11, 2020 at 09:02:25AM +0100, Biju Das wrote:
> Some platforms have only super speed data bus connected to this device
> and high speed data bus directly connected to the SoC. In such platforms
> modelling connector as a child of this device is making it non compliant
> with usb connector bindings. By modelling connector node as standalone
> device node along with this device and the SoC data bus will make it
> compliant with usb connector bindings.
> Update the driver to handle this model by using OF graph API to get the
> connector fwnode and usb role switch class API to get role switch handle.
> 
> Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>
> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx>

Reviewed-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx>

> ---
> v1->v2: Fixed the commit message (https://patchwork.kernel.org/patch/11700777/)
> Ref:https://patchwork.kernel.org/patch/11669423/
> ---
>  drivers/usb/typec/hd3ss3220.c | 18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/usb/typec/hd3ss3220.c b/drivers/usb/typec/hd3ss3220.c
> index 323dfa8160ab..f633ec15b1a1 100644
> --- a/drivers/usb/typec/hd3ss3220.c
> +++ b/drivers/usb/typec/hd3ss3220.c
> @@ -155,7 +155,7 @@ static int hd3ss3220_probe(struct i2c_client *client,
>  {
>  	struct typec_capability typec_cap = { };
>  	struct hd3ss3220 *hd3ss3220;
> -	struct fwnode_handle *connector;
> +	struct fwnode_handle *connector, *ep;
>  	int ret;
>  	unsigned int data;
>  
> @@ -173,11 +173,21 @@ static int hd3ss3220_probe(struct i2c_client *client,
>  
>  	hd3ss3220_set_source_pref(hd3ss3220,
>  				  HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_DEFAULT);
> +	/* For backward compatibility check the connector child node first */
>  	connector = device_get_named_child_node(hd3ss3220->dev, "connector");
> -	if (!connector)
> -		return -ENODEV;
> +	if (connector) {
> +		hd3ss3220->role_sw = fwnode_usb_role_switch_get(connector);
> +	} else {
> +		ep = fwnode_graph_get_next_endpoint(dev_fwnode(hd3ss3220->dev), NULL);
> +		if (!ep)
> +			return -ENODEV;
> +		connector = fwnode_graph_get_remote_port_parent(ep);
> +		fwnode_handle_put(ep);
> +		if (!connector)
> +			return -ENODEV;
> +		hd3ss3220->role_sw = usb_role_switch_get(hd3ss3220->dev);
> +	}
>  
> -	hd3ss3220->role_sw = fwnode_usb_role_switch_get(connector);
>  	if (IS_ERR(hd3ss3220->role_sw)) {
>  		ret = PTR_ERR(hd3ss3220->role_sw);
>  		goto err_put_fwnode;
> -- 
> 2.17.1

thanks,

-- 
heikki



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux