Quoting Hans de Goede (2021-08-17 14:52:01) > diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c > index aa669b9cf70e..c1d8c23baa39 100644 > --- a/drivers/usb/typec/altmodes/displayport.c > +++ b/drivers/usb/typec/altmodes/displayport.c > @@ -125,6 +129,7 @@ static int dp_altmode_configure(struct dp_altmode *dp, u8 con) > static int dp_altmode_status_update(struct dp_altmode *dp) > { > bool configured = !!DP_CONF_GET_PIN_ASSIGN(dp->data.conf); > + bool hpd = !!(dp->data.status & DP_STATUS_HPD_STATE); > u8 con = DP_STATUS_CONNECTION(dp->data.status); > int ret = 0; > > @@ -137,6 +142,11 @@ static int dp_altmode_status_update(struct dp_altmode *dp) > ret = dp_altmode_configure(dp, con); > if (!ret) > dp->state = DP_STATE_CONFIGURE; > + } else { > + if (dp->hpd != hpd) { > + drm_connector_oob_hotplug_event(dp->connector_fwnode); > + dp->hpd = hpd; > + } > } > > return ret; > @@ -512,6 +522,7 @@ static const struct attribute_group dp_altmode_group = { > int dp_altmode_probe(struct typec_altmode *alt) > { > const struct typec_altmode *port = typec_altmode_get_partner(alt); > + struct fwnode_handle *fwnode; > struct dp_altmode *dp; > int ret; > > @@ -540,6 +551,11 @@ int dp_altmode_probe(struct typec_altmode *alt) > alt->desc = "DisplayPort"; > alt->ops = &dp_altmode_ops; > > + fwnode = dev_fwnode(alt->dev.parent->parent); /* typec_port fwnode */ > + dp->connector_fwnode = fwnode_find_reference(fwnode, "displayport", 0); I'm trying to figure out how to translate this over to DT bindings. Is there a binding document for this fwnode reference? If not, can you please update Documentation/devicetree/bindings/connector/usb-connector.yaml with this property? I think this means that the type-c node would have a 'displayport = <&some_phandle>' property in it that points to the display port hardware device that's pumping out the DisplayPort data? > + if (IS_ERR(dp->connector_fwnode)) > + dp->connector_fwnode = NULL; > + > typec_altmode_set_drvdata(alt, dp); > > dp->state = DP_STATE_ENTER; > @@ -555,6 +571,13 @@ void dp_altmode_remove(struct typec_altmode *alt) > > sysfs_remove_group(&alt->dev.kobj, &dp_altmode_group); > cancel_work_sync(&dp->work); > + > + if (dp->connector_fwnode) { > + if (dp->hpd) > + drm_connector_oob_hotplug_event(dp->connector_fwnode); I was hoping that we could make a type-c connector into a drm_bridge. I'm thinking that it would be a DP-to-panel bridge. Then a panel could be created as well on the end of the type-c connector and the bridge would report hpd whenever the type-c logic figures out the cable has been connected and hpd is asserted. The actual DisplayPort hardware that's encoding data would then find the bridge through the graph binding connected to the output node. I'm not sure how MST is handled though. In that scenario maybe there's more than one panel? If you're interested the dts file that I'm trying to make this work for is sc7180-trogdor.dtsi and I need to hook up mdss_dp's output port to the two type-c connectors, usb_c0 and usb_c1, somehow. The two ports are actually muxed by the EC (parent node) so only one type-c port can be connected to the DP hardware at a time. > + > + fwnode_handle_put(dp->connector_fwnode); > + }