drm/msm/dsi: Don't get DSI index from DT
[cascardo/linux.git] / drivers / gpu / drm / msm / dsi / phy / dsi_phy.c
index e2f42d8..f39386e 100644 (file)
@@ -271,6 +271,30 @@ static const struct of_device_id dsi_phy_dt_match[] = {
        {}
 };
 
+/*
+ * Currently, we only support one SoC for each PHY type. When we have multiple
+ * SoCs for the same PHY, we can try to make the index searching a bit more
+ * clever.
+ */
+static int dsi_phy_get_id(struct msm_dsi_phy *phy)
+{
+       struct platform_device *pdev = phy->pdev;
+       const struct msm_dsi_phy_cfg *cfg = phy->cfg;
+       struct resource *res;
+       int i;
+
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dsi_phy");
+       if (!res)
+               return -EINVAL;
+
+       for (i = 0; i < cfg->num_dsi_phy; i++) {
+               if (cfg->io_start[i] == res->start)
+                       return i;
+       }
+
+       return -EINVAL;
+}
+
 static int dsi_phy_driver_probe(struct platform_device *pdev)
 {
        struct msm_dsi_phy *phy;
@@ -289,10 +313,10 @@ static int dsi_phy_driver_probe(struct platform_device *pdev)
        phy->cfg = match->data;
        phy->pdev = pdev;
 
-       ret = of_property_read_u32(dev->of_node,
-                               "qcom,dsi-phy-index", &phy->id);
-       if (ret) {
-               dev_err(dev, "%s: PHY index not specified, %d\n",
+       phy->id = dsi_phy_get_id(phy);
+       if (phy->id < 0) {
+               ret = phy->id;
+               dev_err(dev, "%s: couldn't identify PHY index, %d\n",
                        __func__, ret);
                goto fail;
        }