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);
        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_node *node = pdev->dev.of_node;
+       struct device_node *aux_bus = of_get_child_by_name(node, "aux-bus");
+       struct device_node *panel = of_get_child_by_name(aux_bus, "panel");
+       int connector_type;
+
+       if (panel)
+               connector_type = DRM_MODE_CONNECTOR_eDP;
+       else
+               connector_type = DRM_MODE_SUBCONNECTOR_DisplayPort;
+
+       of_node_put(panel);
+       of_node_put(aux_bus);
+
+       return connector_type;
+}
+
 static int dp_display_probe(struct platform_device *pdev)
 {
        int rc = 0;
        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);