mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-25 13:43:55 +08:00
usb: typec: hd3ss3220: Use OF graph API to get the connector fwnode
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@bp.renesas.com> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Link: https://lore.kernel.org/r/20200920134905.4370-5-biju.das.jz@bp.renesas.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
1c6e8ee63a
commit
a6806e32e7
@ -155,7 +155,7 @@ static int hd3ss3220_probe(struct i2c_client *client,
|
|||||||
{
|
{
|
||||||
struct typec_capability typec_cap = { };
|
struct typec_capability typec_cap = { };
|
||||||
struct hd3ss3220 *hd3ss3220;
|
struct hd3ss3220 *hd3ss3220;
|
||||||
struct fwnode_handle *connector;
|
struct fwnode_handle *connector, *ep;
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int data;
|
unsigned int data;
|
||||||
|
|
||||||
@ -173,11 +173,21 @@ static int hd3ss3220_probe(struct i2c_client *client,
|
|||||||
|
|
||||||
hd3ss3220_set_source_pref(hd3ss3220,
|
hd3ss3220_set_source_pref(hd3ss3220,
|
||||||
HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_DEFAULT);
|
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");
|
connector = device_get_named_child_node(hd3ss3220->dev, "connector");
|
||||||
if (!connector)
|
if (connector) {
|
||||||
return -ENODEV;
|
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)) {
|
if (IS_ERR(hd3ss3220->role_sw)) {
|
||||||
ret = PTR_ERR(hd3ss3220->role_sw);
|
ret = PTR_ERR(hd3ss3220->role_sw);
|
||||||
goto err_put_fwnode;
|
goto err_put_fwnode;
|
||||||
|
Loading…
Reference in New Issue
Block a user