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