drm: rockchip: analogix_dp: split the lcdc select setting into device data
authorYakir Yang <ykk@rock-chips.com>
Thu, 7 Apr 2016 10:05:00 +0000 (18:05 +0800)
committerGerrit Code Review <gerrit@rock-chips.com>
Fri, 8 Apr 2016 03:10:41 +0000 (11:10 +0800)
eDP controller need to declare which vop provide the video source,
and it's defined in GRF registers.

But the specific GRF register address is different between RK3288
and RK3399, so we need to create a device data to declare the GRF
messages for each CPU chips.

Change-Id: I695d1c729f5605d9e913c82453d311ed97c79a94
Signed-off-by: Yakir Yang <ykk@rock-chips.com>
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c

index 6f895db4075ec9d996e227efed591182722f8b72..c04c986e620d10bedcd6f08b3a902b34e2b36526 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <linux/component.h>
 #include <linux/mfd/syscon.h>
+#include <linux/of_device.h>
 #include <linux/of_graph.h>
 #include <linux/regmap.h>
 #include <linux/reset.h>
 
 #define to_dp(nm)      container_of(nm, struct rockchip_dp_device, nm)
 
-/* dp grf register offset */
-#define GRF_SOC_CON6                            0x025c
-#define GRF_EDP_LCD_SEL_MASK                    BIT(5)
-#define GRF_EDP_SEL_VOP_LIT                     BIT(5)
-#define GRF_EDP_SEL_VOP_BIG                     0
+struct analogix_dp_data {
+       u32     lcdsel_grf_reg;
+       u32     lcdsel_big;
+       u32     lcdsel_lit;
+       u32     lcdsel_mask;
+};
 
 struct rockchip_dp_device {
        struct drm_device        *drm_dev;
@@ -51,6 +53,7 @@ struct rockchip_dp_device {
        struct regmap            *grf;
        struct reset_control     *rst;
 
+       const struct analogix_dp_data *data;
        struct analogix_dp_plat_data plat_data;
 };
 
@@ -134,13 +137,13 @@ static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder)
                return;
 
        if (ret)
-               val = GRF_EDP_SEL_VOP_LIT | (GRF_EDP_LCD_SEL_MASK << 16);
+               val = dp->data->lcdsel_lit | dp->data->lcdsel_mask;
        else
-               val = GRF_EDP_SEL_VOP_BIG | (GRF_EDP_LCD_SEL_MASK << 16);
+               val = dp->data->lcdsel_big | dp->data->lcdsel_mask;
 
        dev_dbg(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG");
 
-       ret = regmap_write(dp->grf, GRF_SOC_CON6, val);
+       ret = regmap_write(dp->grf, dp->data->lcdsel_grf_reg, val);
        if (ret != 0) {
                dev_err(dp->dev, "Could not write to GRF: %d\n", ret);
                return;
@@ -234,6 +237,7 @@ static int rockchip_dp_bind(struct device *dev, struct device *master,
                            void *data)
 {
        struct rockchip_dp_device *dp = dev_get_drvdata(dev);
+       const struct analogix_dp_data *dp_data;
        struct drm_device *drm_dev = data;
        int ret;
 
@@ -244,10 +248,15 @@ static int rockchip_dp_bind(struct device *dev, struct device *master,
         */
        dev_set_drvdata(dev, NULL);
 
+       dp_data = of_device_get_match_data(dev);
+       if (!dp_data)
+               return -ENODEV;
+
        ret = rockchip_dp_init(dp);
        if (ret < 0)
                return ret;
 
+       dp->data = dp_data;
        dp->drm_dev = drm_dev;
 
        ret = rockchip_dp_drm_create_encoder(dp);
@@ -353,9 +362,23 @@ static const struct dev_pm_ops rockchip_dp_pm_ops = {
        SET_SYSTEM_SLEEP_PM_OPS(rockchip_dp_suspend, rockchip_dp_resume)
 };
 
+static const struct analogix_dp_data rk3399_edp = {
+       .lcdsel_grf_reg = 0x6250,
+       .lcdsel_big = 0,
+       .lcdsel_lit = BIT(5),
+       .lcdsel_mask = BIT(21),
+};
+
+static const struct analogix_dp_data rk3288_dp = {
+       .lcdsel_grf_reg = 0x025c,
+       .lcdsel_big = 0,
+       .lcdsel_lit = BIT(5),
+       .lcdsel_mask = BIT(21),
+};
+
 static const struct of_device_id rockchip_dp_dt_ids[] = {
-       {.compatible = "rockchip,rk3288-dp",},
-       {.compatible = "rockchip,rk3399-edp",},
+       {.compatible = "rockchip,rk3288-dp", .data = &rk3288_dp },
+       {.compatible = "rockchip,rk3399-edp", .data = &rk3399_edp },
        {}
 };
 MODULE_DEVICE_TABLE(of, rockchip_dp_dt_ids);