@@ -6515,6 +6515,7 @@ static enum hrtimer_restart send_discover_timer_handler(struct hrtimer *timer)
struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
{
struct tcpm_port *port;
+ struct fwnode_handle *fwnode;
int err;
if (!dev || !tcpc ||
@@ -6582,6 +6583,14 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
goto out_destroy_wq;
}
+ if (!port->role_sw) {
+ fwnode = device_get_named_child_node(port->dev, "connector");
+ if (fwnode) {
+ port->role_sw = fwnode_usb_role_switch_get(fwnode);
+ fwnode_handle_put(fwnode);
+ }
+ }
+
err = devm_tcpm_psy_register(port);
if (err)
goto out_role_sw_put;
Right now in TCPM when we want to send a role-switch message the remote-endpoint must appear inside of the TCPM bound node, not in the connector associated with TCPM. &typec { status = "okay"; port { typec_role_switch: endpoint { remote-endpoint = <&dwc3_role_switch>; }; }; connector { compatible = "usb-c-connector"; power-role = "source"; data-role = "dual"; self-powered; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; typec_mux: endpoint { remote-endpoint = <&phy_typec_mux>; }; }; }; }; }; This change makes it possible to declare the remote-endpoint inside of the connector of the TCPM e.g. &typec { status = "okay"; connector { compatible = "usb-c-connector"; power-role = "source"; data-role = "dual"; self-powered; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; typec_role_switch: endpoint { remote-endpoint = <&dwc3_role_switch>; }; }; port@1 { reg = <1>; typec_mux: endpoint { remote-endpoint = <&phy_typec_mux>; }; }; }; }; }; Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> --- drivers/usb/typec/tcpm/tcpm.c | 9 +++++++++ 1 file changed, 9 insertions(+)