On 24-03-22 15:30:54, Dmitry Baryshkov wrote: > On Fri, 22 Mar 2024 at 15:22, Abel Vesa <abel.vesa@xxxxxxxxxx> wrote: > > > > Instead of relying on different compatibles for eDP and DP, lookup > > the panel node in devicetree to figure out the connector type and > > then pass on that information to the PHY. External DP is not described > > Nit: External DP doesn't have a panel described in DT... > Will fix. > > in DT, therefore, assume it's eDP if panel node is present. > > > > Signed-off-by: Abel Vesa <abel.vesa@xxxxxxxxxx> > > --- > > drivers/gpu/drm/msm/dp/dp_display.c | 43 +++++++++++++++++++++++++++++++++---- > > 1 file changed, 39 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c > > index c4cb82af5c2f..c9763f77c832 100644 > > --- a/drivers/gpu/drm/msm/dp/dp_display.c > > +++ b/drivers/gpu/drm/msm/dp/dp_display.c > > @@ -726,6 +726,14 @@ static int dp_init_sub_modules(struct dp_display_private *dp) > > if (IS_ERR(phy)) > > return PTR_ERR(phy); > > > > + rc = phy_set_mode_ext(phy, PHY_MODE_DP, > > + dp->dp_display.is_edp ? PHY_SUBMODE_EDP : PHY_SUBMODE_DP); > > + if (rc) { > > + DRM_ERROR("failed to set phy submode, rc = %d\n", rc); > > + dp->catalog = NULL; > > + goto error; > > + } > > + > > dp->catalog = dp_catalog_get(dev); > > if (IS_ERR(dp->catalog)) { > > rc = PTR_ERR(dp->catalog); > > @@ -734,9 +742,7 @@ static int dp_init_sub_modules(struct dp_display_private *dp) > > goto error; > > } > > > > - dp->aux = dp_aux_get(dev, dp->catalog, > > - phy, > > - dp->dp_display.is_edp); > > + dp->aux = dp_aux_get(dev, dp->catalog, phy, dp->dp_display.is_edp); > > Unrelated > Yep, will drop the change. > > if (IS_ERR(dp->aux)) { > > rc = PTR_ERR(dp->aux); > > DRM_ERROR("failed to initialize aux, rc = %d\n", rc); > > @@ -1241,6 +1247,35 @@ static int dp_auxbus_done_probe(struct drm_dp_aux *aux) > > return dp_display_probe_tail(aux->dev); > > } > > > > +static int dp_display_get_connector_type(struct platform_device *pdev, > > + const struct msm_dp_desc *desc) > > +{ > > + struct device *dev = &pdev->dev; > > + struct device_node *aux_bus; > > + struct device_node *panel; > > + int ret = DRM_MODE_CONNECTOR_DisplayPort; > > + > > + /* legacy platforms specify connector type in match data */ > > + if (desc->connector_type == DRM_MODE_CONNECTOR_eDP || > > + desc->connector_type == DRM_MODE_CONNECTOR_DisplayPort) > > misaligned > Sure, will fix. > > + return desc->connector_type; > > Can we drop this part completely? > You mean the whole if clause? How should we handle the legacy approach then? > > + > > + aux_bus = of_get_child_by_name(dev->of_node, "aux-bus"); > > + if (!aux_bus) > > + goto out; > > + > > + panel = of_get_child_by_name(aux_bus, "panel"); > > + if (!panel) > > + goto out; > > + > > + ret = DRM_MODE_CONNECTOR_eDP; > > + > > +out: > > + of_node_put(panel); > > + of_node_put(aux_bus); > > + return ret; > > +} > > + > > static int dp_display_probe(struct platform_device *pdev) > > { > > int rc = 0; > > @@ -1263,7 +1298,7 @@ static int dp_display_probe(struct platform_device *pdev) > > dp->dp_display.pdev = pdev; > > dp->name = "drm_dp"; > > dp->id = desc->id; > > - dp->dp_display.connector_type = desc->connector_type; > > + dp->dp_display.connector_type = dp_display_get_connector_type(pdev, desc); > > dp->wide_bus_supported = desc->wide_bus_supported; > > dp->dp_display.is_edp = > > (dp->dp_display.connector_type == DRM_MODE_CONNECTOR_eDP); > > > > -- > > 2.34.1 > > > > > -- > With best wishes > Dmitry