[RAMEN9610-9076] fbdev: dpu20: update dqe for supporting cgc2
authorChiHun Won <hj-yo.lee@samsung.com>
Mon, 26 Nov 2018 01:54:16 +0000 (10:54 +0900)
committerhskang <hs1218.kang@samsung.com>
Tue, 4 Dec 2018 12:33:36 +0000 (21:33 +0900)
Change-Id: Iba22dbc8a3b62a59b97b76cb557bbcafccc246dd
Signed-off-by: ChiHun Won <chihun.won@samsung.com>
drivers/video/fbdev/exynos/dpu20/cal_9610/regs-dqe.h
drivers/video/fbdev/exynos/dpu20/dqe.h
drivers/video/fbdev/exynos/dpu20/dqe_drv.c

index 846347884102519f8f45f78944a3a979f5f10f77..0fa7f950de46b20cec9bd239e8829742db6f5913 100644 (file)
@@ -21,7 +21,8 @@
 #define DQEIMG_HSIZE_GET(_v)           (((_v) >> 0) & 0x1fff)
 
 /* CGC_SET */
-#define DQECGCLUT_MAX                  (8)
+#define DQECGC1LUT_MAX                 (8)
+#define DQECGC2LUT_MAX                 (9)
 #define DQECGC1_RGB_BASE               0x0010
 #define DQECGC2_RGB_BASE               0x0410
 
@@ -43,6 +44,9 @@
 #define DQECGC1_YELLOW                 0x0024
 #define DQECGC1_WHITE                  0x0028
 #define DQECGC1_BLACK                  0x002c
+#define DQECGC_MC_CONTROL              0x0030
+#define DQECGC_MC_GAIN(_v)             (((_v) & 0xfff) << 4)
+#define DQECGC_MC_EN(_v)               (((_v) & 0x1) << 0)
 
 #define DQECGC2_RED                    0x0410
 #define DQECGC2_GREEN                  0x0414
index 6aa72f4f98e812e30042f2cba66e31248d46a974..39cfa1d961b27e19216ed18dad51e0d4a28f338b 100644 (file)
@@ -79,7 +79,7 @@ struct dqe_reg_dump {
 };
 
 struct dqe_ctx {
-       struct dqe_reg_dump cgc[DQECGCLUT_MAX];
+       struct dqe_reg_dump cgc[DQECGC1LUT_MAX + DQECGC2LUT_MAX];
        struct dqe_reg_dump gamma[DQEGAMMALUT_MAX];
        struct dqe_reg_dump hsc[DQEHSCLUT_MAX];
        u32 cgc_on;
index 4ffce52b0911e960c7776838ed3242d2b4f1cf1c..622e4631766a5b2c0c79786adb4d2cd488c9d8db 100644 (file)
@@ -26,7 +26,7 @@ struct dqe_device *dqe_drvdata;
 struct class *dqe_class;
 
 u32 gamma_lut[3][65];
-u32 cgc_lut[8][3];
+u32 cgc_lut[50];
 u32 hsc_lut[35];
 
 int dqe_log_level = 6;
@@ -34,16 +34,21 @@ module_param(dqe_log_level, int, 0644);
 
 static void dqe_load_context(void)
 {
-       int i;
+       int i, j;
        struct dqe_device *dqe = dqe_drvdata;
 
        dqe_info("%s\n", __func__);
 
-       for (i = 0; i < DQECGCLUT_MAX; i++) {
+       for (i = 0; i < DQECGC1LUT_MAX + 1; i++) {
                dqe->ctx.cgc[i].addr = DQECGC1_RGB_BASE + (i * 4);
                dqe->ctx.cgc[i].val = dqe_read(dqe->ctx.cgc[i].addr);
        }
 
+       for (i = DQECGC1LUT_MAX + 1, j = 0; i < (DQECGC1LUT_MAX + DQECGC2LUT_MAX); i++, j++) {
+               dqe->ctx.cgc[i].addr = DQECGC2_RGB_BASE + (j * 4);
+               dqe->ctx.cgc[i].val = dqe_read(dqe->ctx.cgc[i].addr);
+       }
+
        for (i = 0; i < DQEGAMMALUT_MAX; i++) {
                dqe->ctx.gamma[i].addr = DQEGAMMALUT_X_Y_BASE + (i * 4);
                dqe->ctx.gamma[i].val = dqe_read(dqe->ctx.gamma[i].addr);
@@ -56,7 +61,18 @@ static void dqe_load_context(void)
        dqe->ctx.hsc[DQEHSCLUT_MAX - 1].addr = DQEHSC_SKIN_H;
        dqe->ctx.hsc[DQEHSCLUT_MAX - 1].val = dqe_read(dqe->ctx.hsc[DQEHSCLUT_MAX - 1].addr);
 
-       for (i = 0; i < DQECGCLUT_MAX; i++) {
+       for (i = 0; i < DQECGC1LUT_MAX; i++) {
+               dqe_dbg("0x%04x %d %d %d",
+                       dqe->ctx.cgc[i].addr,
+                       DQECGCLUT_R_GET(dqe->ctx.cgc[i].val),
+                       DQECGCLUT_G_GET(dqe->ctx.cgc[i].val),
+                       DQECGCLUT_B_GET(dqe->ctx.cgc[i].val));
+       }
+
+       dqe_dbg("0x%04x %08x ",
+               dqe->ctx.cgc[DQECGC1LUT_MAX].addr, dqe->ctx.cgc[DQECGC1LUT_MAX].val);
+
+       for (i = DQECGC1LUT_MAX + 1; i < (DQECGC1LUT_MAX + DQECGC2LUT_MAX); i++) {
                dqe_dbg("0x%04x %d %d %d",
                        dqe->ctx.cgc[i].addr,
                        DQECGCLUT_R_GET(dqe->ctx.cgc[i].val),
@@ -92,6 +108,15 @@ static void dqe_init_context(void)
        dqe->ctx.cgc[5].val = 0x0ff3fc00; /* DQECGC1_YELLOW */
        dqe->ctx.cgc[6].val = 0x0ff3fcff; /* DQECGC1_WHITE */
        dqe->ctx.cgc[7].val = 0x00000000; /* DQECGC1_BLACK */
+       dqe->ctx.cgc[8].val = 0x00000000; /* DQECGC_MC_CONTROL*/
+       dqe->ctx.cgc[9].val = 0x0ff00000; /* DQECGC2_RED */
+       dqe->ctx.cgc[10].val = 0x0003fc00; /* DQECGC2_GREEN */
+       dqe->ctx.cgc[11].val = 0x000000ff; /* DQECGC2_BLUE */
+       dqe->ctx.cgc[12].val = 0x0003fcff; /* DQECGC2_CYAN */
+       dqe->ctx.cgc[13].val = 0x0ff000ff; /* DQECGC2_MAGENTA */
+       dqe->ctx.cgc[14].val = 0x0ff3fc00; /* DQECGC2_YELLOW */
+       dqe->ctx.cgc[15].val = 0x0ff3fcff; /* DQECGC2_WHITE */
+       dqe->ctx.cgc[16].val = 0x00000000; /* DQECGC12_BLACK */
 
        /* DQEGAMMALUT_R_01_00 -- DQEGAMMALUT_B_64 */
        for (j = 0, k = 0; j < 3; j++) {
@@ -133,7 +158,7 @@ static int dqe_save_context(void)
 
        dqe_dbg("%s\n", __func__);
 
-       for (i = 0; i < DQECGCLUT_MAX; i++)
+       for (i = 0; i < (DQECGC1LUT_MAX + DQECGC2LUT_MAX); i++)
                dqe->ctx.cgc[i].val =
                        dqe_read(dqe->ctx.cgc[i].addr);
 
@@ -162,12 +187,9 @@ static int dqe_restore_context(void)
 
        dqe_dbg("%s\n", __func__);
 
-       for (i = 0; i < DQECGCLUT_MAX; i++) {
+       for (i = 0; i < (DQECGC1LUT_MAX + DQECGC2LUT_MAX); i++)
                dqe_write(dqe->ctx.cgc[i].addr,
                                dqe->ctx.cgc[i].val);
-               dqe_write(dqe->ctx.cgc[i].addr + 0x0400,
-                               dqe->ctx.cgc[i].val);
-       }
 
        if (dqe->ctx.cgc_on)
                dqe_reg_set_cgc_on(1);
@@ -212,14 +234,28 @@ static void dqe_gamma_lut_set(void)
 
 static void dqe_cgc_lut_set(void)
 {
-       int i;
+       int i, j;
        struct dqe_device *dqe = dqe_drvdata;
 
-       for (i = 0; i < 8; i++) {
+       /* DQECGC1_RED -- DQECGC1_BLACK*/
+       for (i = 0, j = 0; i < 8; i++) {
                dqe->ctx.cgc[i].val = (
-                       DQECGCLUT_R(cgc_lut[i][0]) |
-                       DQECGCLUT_G(cgc_lut[i][1]) |
-                       DQECGCLUT_B(cgc_lut[i][2]));
+                       DQECGCLUT_R(cgc_lut[j]) |
+                       DQECGCLUT_G(cgc_lut[j + 1]) |
+                       DQECGCLUT_B(cgc_lut[j + 2]));
+               j += 3;
+       }
+
+       /* DQECGC_MC_CONTROL */
+       dqe->ctx.cgc[8].val = (DQECGC_MC_GAIN(cgc_lut[24]) | DQECGC_MC_EN(cgc_lut[25]));
+
+       /* DQECGC2_RED -- DQECGC2_BLACK*/
+       for (i = 9, j = 26; i < 17; i++) {
+               dqe->ctx.cgc[i].val = (
+                       DQECGCLUT_R(cgc_lut[j]) |
+                       DQECGCLUT_G(cgc_lut[j + 1]) |
+                       DQECGCLUT_B(cgc_lut[j + 2]));
+               j += 3;
        }
 }
 
@@ -402,7 +438,7 @@ static ssize_t decon_dqe_cgc_show(struct device *dev,
 
        mutex_lock(&dqe->lock);
 
-       for (i = 0; i < DQECGCLUT_MAX; i++) {
+       for (i = 0; i < DQECGC1LUT_MAX; i++) {
                dqe_info("%d %d %d ",
                        DQECGCLUT_R_GET(dqe->ctx.cgc[i].val),
                        DQECGCLUT_G_GET(dqe->ctx.cgc[i].val),
@@ -454,8 +490,8 @@ static ssize_t decon_dqe_cgc_store(struct device *dev, struct device_attribute *
        head = (char *)buffer;
        if  (*head != 0) {
                dqe_dbg("%s\n", head);
-               for (i = 0; i < 8; i++) {
-                       k = (i == 7) ? 2 : 3;
+               for (i = 0; i < 1; i++) {
+                       k = 49;
                        for (j = 0; j < k; j++) {
                                ptr = strchr(head, ',');
                                if (ptr == NULL) {
@@ -464,7 +500,7 @@ static ssize_t decon_dqe_cgc_store(struct device *dev, struct device_attribute *
                                        goto err;
                                }
                                *ptr = 0;
-                               ret = kstrtou32(head, 0, &cgc_lut[i][j]);
+                               ret = kstrtou32(head, 0, &cgc_lut[j]);
                                if (ret) {
                                        dqe_err("strtou32(%d, %d) error.\n", i, j);
                                        ret = -EINVAL;
@@ -477,7 +513,7 @@ static ssize_t decon_dqe_cgc_store(struct device *dev, struct device_attribute *
                while (*(head + k) >= '0' && *(head + k) <= '9')
                        k++;
                *(head + k) = 0;
-               ret = kstrtou32(head, 0, &cgc_lut[i-1][j]);
+               ret = kstrtou32(head, 0, &cgc_lut[j]);
                if (ret) {
                        dqe_err("strtou32(%d, %d) error.\n", i-1, j);
                        ret = -EINVAL;
@@ -488,9 +524,8 @@ static ssize_t decon_dqe_cgc_store(struct device *dev, struct device_attribute *
                goto err;
        }
 
-       for (i = 0; i < 8; i++)
-               for (j = 0; j < 3; j++)
-                       dqe_dbg("%d ", cgc_lut[i][j]);
+       for (j = 0; j < 50; j++)
+               dqe_dbg("%d ", cgc_lut[j]);
 
        dqe_cgc_lut_set();