Commit 056cda45 authored by Heikki Krogerus's avatar Heikki Krogerus Committed by Greg Kroah-Hartman

usb: typec: class: Don't use port parent for getting mux handles

commit 23481121 upstream.

It is not possible to use the parent of the port device when
requesting mux handles as the parent may be a multiport USB
Type-C or PD controller. The muxes must be assigned to the
ports, not the controllers.

This will also move the requesting of the muxes after the
port device is initialized.
Acked-by: default avatarHans de Goede <hdegoede@redhat.com>
Tested-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6875404a
...@@ -1500,7 +1500,7 @@ typec_port_register_altmode(struct typec_port *port, ...@@ -1500,7 +1500,7 @@ typec_port_register_altmode(struct typec_port *port,
sprintf(id, "id%04xm%02x", desc->svid, desc->mode); sprintf(id, "id%04xm%02x", desc->svid, desc->mode);
mux = typec_mux_get(port->dev.parent, id); mux = typec_mux_get(&port->dev, id);
if (IS_ERR(mux)) if (IS_ERR(mux))
return ERR_CAST(mux); return ERR_CAST(mux);
...@@ -1540,18 +1540,6 @@ struct typec_port *typec_register_port(struct device *parent, ...@@ -1540,18 +1540,6 @@ struct typec_port *typec_register_port(struct device *parent,
return ERR_PTR(id); return ERR_PTR(id);
} }
port->sw = typec_switch_get(cap->fwnode ? &port->dev : parent);
if (IS_ERR(port->sw)) {
ret = PTR_ERR(port->sw);
goto err_switch;
}
port->mux = typec_mux_get(parent, "typec-mux");
if (IS_ERR(port->mux)) {
ret = PTR_ERR(port->mux);
goto err_mux;
}
switch (cap->type) { switch (cap->type) {
case TYPEC_PORT_SRC: case TYPEC_PORT_SRC:
port->pwr_role = TYPEC_SOURCE; port->pwr_role = TYPEC_SOURCE;
...@@ -1592,13 +1580,26 @@ struct typec_port *typec_register_port(struct device *parent, ...@@ -1592,13 +1580,26 @@ struct typec_port *typec_register_port(struct device *parent,
port->port_type = cap->type; port->port_type = cap->type;
port->prefer_role = cap->prefer_role; port->prefer_role = cap->prefer_role;
device_initialize(&port->dev);
port->dev.class = typec_class; port->dev.class = typec_class;
port->dev.parent = parent; port->dev.parent = parent;
port->dev.fwnode = cap->fwnode; port->dev.fwnode = cap->fwnode;
port->dev.type = &typec_port_dev_type; port->dev.type = &typec_port_dev_type;
dev_set_name(&port->dev, "port%d", id); dev_set_name(&port->dev, "port%d", id);
ret = device_register(&port->dev); port->sw = typec_switch_get(&port->dev);
if (IS_ERR(port->sw)) {
put_device(&port->dev);
return ERR_CAST(port->sw);
}
port->mux = typec_mux_get(&port->dev, "typec-mux");
if (IS_ERR(port->mux)) {
put_device(&port->dev);
return ERR_CAST(port->mux);
}
ret = device_add(&port->dev);
if (ret) { if (ret) {
dev_err(parent, "failed to register port (%d)\n", ret); dev_err(parent, "failed to register port (%d)\n", ret);
put_device(&port->dev); put_device(&port->dev);
...@@ -1606,15 +1607,6 @@ struct typec_port *typec_register_port(struct device *parent, ...@@ -1606,15 +1607,6 @@ struct typec_port *typec_register_port(struct device *parent,
} }
return port; return port;
err_mux:
typec_switch_put(port->sw);
err_switch:
ida_simple_remove(&typec_index_ida, port->id);
kfree(port);
return ERR_PTR(ret);
} }
EXPORT_SYMBOL_GPL(typec_register_port); EXPORT_SYMBOL_GPL(typec_register_port);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment