There are two main modifications: one is expanding struct
rockchip_dp_chip_data to an array, and the other is adding
&rockchip_dp_chip_data.reg to separate different edp devices.

Signed-off-by: Damon Ding <damon.d...@rock-chips.com>

---

Changes in v6:
- Add the description of &rockchip_dp_chip_data.reg
- Use drm_...() uniformly rather than mixing drm_...() and dev_..()
---
 .../gpu/drm/rockchip/analogix_dp-rockchip.c   | 42 +++++++++++++++----
 1 file changed, 35 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c 
b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
index 648ea608cdf3..a63c2c867059 100644
--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
@@ -52,10 +52,12 @@ struct rockchip_grf_reg_field {
  * struct rockchip_dp_chip_data - splite the grf setting of kind of chips
  * @lcdc_sel: grf register field of lcdc_sel
  * @chip_type: specific chip type
+ * @reg: register base address
  */
 struct rockchip_dp_chip_data {
        const struct rockchip_grf_reg_field lcdc_sel;
        u32     chip_type;
+       u32     reg;
 };
 
 struct rockchip_dp_device {
@@ -397,6 +399,8 @@ static int rockchip_dp_probe(struct platform_device *pdev)
        const struct rockchip_dp_chip_data *dp_data;
        struct drm_panel *panel = NULL;
        struct rockchip_dp_device *dp;
+       struct resource *res;
+       int i;
        int ret;
 
        dp_data = of_device_get_match_data(dev);
@@ -411,9 +415,25 @@ static int rockchip_dp_probe(struct platform_device *pdev)
        if (!dp)
                return -ENOMEM;
 
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+       i = 0;
+       while (dp_data[i].reg) {
+               if (dp_data[i].reg == res->start) {
+                       dp->data = &dp_data[i];
+                       break;
+               }
+
+               i++;
+       }
+
+       if (!dp->data) {
+               drm_err(dp, "no chip-data for %s node\n", dev->of_node->name);
+               return -ENODEV;
+       }
+
        dp->dev = dev;
        dp->adp = ERR_PTR(-ENODEV);
-       dp->data = dp_data;
        dp->plat_data.panel = panel;
        dp->plat_data.dev_type = dp->data->chip_type;
        dp->plat_data.power_on = rockchip_dp_poweron;
@@ -465,14 +485,22 @@ static int rockchip_dp_resume(struct device *dev)
 static DEFINE_RUNTIME_DEV_PM_OPS(rockchip_dp_pm_ops, rockchip_dp_suspend,
                rockchip_dp_resume, NULL);
 
-static const struct rockchip_dp_chip_data rk3399_edp = {
-       .lcdc_sel = GRF_REG_FIELD(0x6250, 5, 5),
-       .chip_type = RK3399_EDP,
+static const struct rockchip_dp_chip_data rk3399_edp[] = {
+       {
+               .lcdc_sel = GRF_REG_FIELD(0x6250, 5, 5),
+               .chip_type = RK3399_EDP,
+               .reg = 0xff970000,
+       },
+       { /* sentinel */ }
 };
 
-static const struct rockchip_dp_chip_data rk3288_dp = {
-       .lcdc_sel = GRF_REG_FIELD(0x025c, 5, 5),
-       .chip_type = RK3288_DP,
+static const struct rockchip_dp_chip_data rk3288_dp[] = {
+       {
+               .lcdc_sel = GRF_REG_FIELD(0x025c, 5, 5),
+               .chip_type = RK3288_DP,
+               .reg = 0xff970000,
+       },
+       { /* sentinel */ }
 };
 
 static const struct of_device_id rockchip_dp_dt_ids[] = {
-- 
2.34.1

Reply via email to