This makes it easier to compare Linux and barebox code.

Signed-off-by: Ahmad Fatoum <[email protected]>
---
 drivers/video/rockchip/rockchip_drm_vop2.c | 63 +++++++++++++++-------
 drivers/video/rockchip/rockchip_drm_vop2.h | 11 ++++
 drivers/video/rockchip/rockchip_vop2_reg.c |  3 ++
 3 files changed, 59 insertions(+), 18 deletions(-)

diff --git a/drivers/video/rockchip/rockchip_drm_vop2.c 
b/drivers/video/rockchip/rockchip_drm_vop2.c
index d81e0357528b..f42b0c48eede 100644
--- a/drivers/video/rockchip/rockchip_drm_vop2.c
+++ b/drivers/video/rockchip/rockchip_drm_vop2.c
@@ -185,6 +185,7 @@ struct vop2_video_port {
 };
 
 struct vop2 {
+       u32 version;
        struct device *dev;
        struct vop2_video_port vps[4];
 
@@ -348,7 +349,7 @@ static bool vop2_win_dither_up(u32 format)
 
 static bool vop2_output_rg_swap(struct vop2 *vop2, u32 bus_format)
 {
-       if (vop2->data->soc_id == 3588) {
+       if (vop2->version == VOP_VERSION_RK3588) {
                if (bus_format == MEDIA_BUS_FMT_YUV8_1X24 ||
                    bus_format == MEDIA_BUS_FMT_YUV10_1X30)
                        return true;
@@ -466,15 +467,26 @@ static void rk3588_vop2_power_domain_enable_all(struct 
vop2 *vop2)
 static void vop2_enable(struct vop2 *vop2)
 {
        int ret;
+       u32 version;
 
        ret = vop2_core_clks_prepare_enable(vop2);
        if (ret)
                return;
 
+       version = vop2_readl(vop2, RK3568_VERSION_INFO);
+       if (version != vop2->version) {
+               dev_err(vop2->dev, "Hardware version(0x%08x) mismatch\n", 
version);
+               return;
+       }
+
+       /*
+        * rk3566 share the same vop version with rk3568, so
+        * we need to use soc_id for identification here.
+        */
        if (vop2->data->soc_id == 3566)
                vop2_writel(vop2, RK3568_OTP_WIN_EN, 1);
 
-       if (vop2->data->soc_id == 3588)
+       if (vop2->version == VOP_VERSION_RK3588)
                rk3588_vop2_power_domain_enable_all(vop2);
 
        vop2_writel(vop2, RK3568_REG_CFG_DONE, 
RK3568_REG_CFG_DONE__GLB_CFG_DONE_EN);
@@ -962,9 +974,9 @@ static unsigned long vop2_set_intf_mux(struct 
vop2_video_port *vp, int ep_id, u3
 {
        struct vop2 *vop2 = vp->vop2;
 
-       if (vop2->data->soc_id == 3566 || vop2->data->soc_id == 3568)
+       if (vop2->version == VOP_VERSION_RK3568)
                return rk3568_set_intf_mux(vp, ep_id, polflags, clock);
-       else if (vop2->data->soc_id == 3588)
+       else if (vop2->version == VOP_VERSION_RK3588)
                return rk3588_set_intf_mux(vp, ep_id, polflags, clock);
        else
                return 0;
@@ -1877,6 +1889,31 @@ static int vop2_esmart_init(struct vop2_win *win)
        return ret;
 };
 
+/*
+ * On RK3566 these windows don't have an independent
+ * framebuffer. They can only share/mirror the framebuffer
+ * with smart0, esmart0 and cluster0 respectively.
+ * And RK3566 share the same vop version with Rk3568, so we
+ * need to use soc_id for identification here.
+ */
+static bool vop2_is_mirror_win(struct vop2_win *win)
+{
+       struct vop2 *vop2 = win->vop2;
+
+       if (vop2->data->soc_id == 3566) {
+               switch (win->data->phys_id) {
+               case ROCKCHIP_VOP2_SMART1:
+               case ROCKCHIP_VOP2_ESMART1:
+               case ROCKCHIP_VOP2_CLUSTER1:
+                       return true;
+               default:
+                       return false;
+               }
+       } else {
+               return false;
+       }
+}
+
 static int vop2_win_init(struct vop2 *vop2)
 {
        const struct vop2_data *vop2_data = vop2->data;
@@ -1886,26 +1923,15 @@ static int vop2_win_init(struct vop2 *vop2)
        for (i = 0; i < vop2_data->win_size; i++) {
                const struct vop2_win_data *win_data = &vop2_data->win[i];
 
-               if (vop2->data->soc_id == 3566) {
-                       /*
-                        * On RK3566 these windows don't have an independent
-                        * framebuffer. They share the framebuffer with smart0,
-                        * esmart0 and cluster0 respectively.
-                        */
-                       switch (win_data->phys_id) {
-                       case ROCKCHIP_VOP2_SMART1:
-                       case ROCKCHIP_VOP2_ESMART1:
-                       case ROCKCHIP_VOP2_CLUSTER1:
-                               continue;
-                       }
-               }
-
                win = &vop2->win[n];
                win->data = win_data;
                win->type = win_data->type;
                win->offset = win_data->base;
                win->vop2 = vop2;
 
+               if (vop2_is_mirror_win(win))
+                   continue;
+
                ret = vop2_esmart_init(win);
                if (ret)
                        return ret;
@@ -1943,6 +1969,7 @@ int vop2_bind(struct device *dev)
 
        vop2->dev = dev;
        vop2->data = vop2_data;
+       vop2->version = vop2_data->version;
 
        res = dev_get_resource_by_name(dev, IORESOURCE_MEM, "vop");
        if (IS_ERR(res))
diff --git a/drivers/video/rockchip/rockchip_drm_vop2.h 
b/drivers/video/rockchip/rockchip_drm_vop2.h
index 877530ddbccd..edae3d74e3dd 100644
--- a/drivers/video/rockchip/rockchip_drm_vop2.h
+++ b/drivers/video/rockchip/rockchip_drm_vop2.h
@@ -10,6 +10,16 @@
 #include <linux/regmap.h>
 #include "rockchip_drm_vop.h"
 
+
+#define VOP2_VERSION(major, minor, build)      ((major) << 24 | (minor) << 16 
| (build))
+
+/* The VOP version of new SoC is bigger than the old */
+#define VOP_VERSION_RK3568     VOP2_VERSION(0x40, 0x15, 0x8023)
+#define VOP_VERSION_RK3588     VOP2_VERSION(0x40, 0x17, 0x6786)
+#define VOP_VERSION_RK3528     VOP2_VERSION(0x50, 0x17, 0x1263)
+#define VOP_VERSION_RK3562     VOP2_VERSION(0x50, 0x17, 0x4350)
+#define VOP_VERSION_RK3576     VOP2_VERSION(0x50, 0x19, 0x9765)
+
 #define VOP2_VP_FEATURE_OUTPUT_10BIT        BIT(0)
 
 #define VOP2_FEATURE_HAS_SYS_GRF       BIT(0)
@@ -162,6 +172,7 @@ struct vop2_video_port_data {
 struct vop2_data {
        u8 nr_vps;
        u64 feature;
+       u32 version;
        const struct vop2_win_data *win;
        const struct vop2_video_port_data *vp;
        struct vop_rect max_input;
diff --git a/drivers/video/rockchip/rockchip_vop2_reg.c 
b/drivers/video/rockchip/rockchip_vop2_reg.c
index 1ce71c227ca8..63d824b69fe2 100644
--- a/drivers/video/rockchip/rockchip_vop2_reg.c
+++ b/drivers/video/rockchip/rockchip_vop2_reg.c
@@ -224,6 +224,7 @@ static const struct vop2_win_data rk3588_vop_win_data[] = {
 };
 
 static const struct vop2_data rk3566_vop = {
+       .version = VOP_VERSION_RK3568,
        .feature = VOP2_FEATURE_HAS_SYS_GRF,
        .nr_vps = 3,
        .max_input = { 4096, 2304 },
@@ -235,6 +236,7 @@ static const struct vop2_data rk3566_vop = {
 };
 
 static const struct vop2_data rk3568_vop = {
+       .version = VOP_VERSION_RK3568,
        .feature = VOP2_FEATURE_HAS_SYS_GRF,
        .nr_vps = 3,
        .max_input = { 4096, 2304 },
@@ -246,6 +248,7 @@ static const struct vop2_data rk3568_vop = {
 };
 
 static const struct vop2_data rk3588_vop = {
+       .version = VOP_VERSION_RK3588,
        .feature = VOP2_FEATURE_HAS_SYS_GRF | VOP2_FEATURE_HAS_VO1_GRF |
                   VOP2_FEATURE_HAS_VOP_GRF | VOP2_FEATURE_HAS_SYS_PMU,
        .nr_vps = 4,
-- 
2.47.3


Reply via email to