[9610] fbdev: dpu20: Support Muti panel solution
authorKim Manseok <manseoks.kim@samsung.com>
Fri, 28 Sep 2018 04:11:01 +0000 (13:11 +0900)
committerCosmin Tanislav <demonsingur@gmail.com>
Mon, 22 Apr 2024 17:23:05 +0000 (20:23 +0300)
Change-Id: I3b3f23eb92eacec8a4b5d034447b7194f75a1ce1
Signed-off-by: Kim Manseok <manseoks.kim@samsung.com>
12 files changed:
arch/arm64/boot/dts/exynos/exynos9610-display-lcd.dtsi
arch/arm64/boot/dts/exynos/exynos9610.dts
arch/arm64/configs/erd9610_defconfig
drivers/video/fbdev/exynos/dpu20/dsim.h
drivers/video/fbdev/exynos/dpu20/dsim_drv.c
drivers/video/fbdev/exynos/dpu20/panels/Kconfig
drivers/video/fbdev/exynos/dpu20/panels/Makefile
drivers/video/fbdev/exynos/dpu20/panels/decon_lcd.h
drivers/video/fbdev/exynos/dpu20/panels/lcd_ctrl.h
drivers/video/fbdev/exynos/dpu20/panels/s6e3fa0_lcd_ctrl.c
drivers/video/fbdev/exynos/dpu20/panels/s6e3fa0_mipi_lcd.c
drivers/video/fbdev/exynos/dpu20/panels/s6e3fa0_param.h

index 8d68bff561ad36d5f72ee968c3935d7d1fe93d6a..fb85f58f0db2e41913b22869ad95293584c7ee21 100644 (file)
@@ -14,6 +14,7 @@
                target-path = "/";
                __overlay__ {
                        emul_display: emul_display {
+                               device_type = "samsung-emul";
                                mode = <0>; /* 0: video mode, 1: DP command mode, 2: MIPI command mode */
                                resolution = <320 240>;
                        /*      resolution = <1080 1920>; */
@@ -44,6 +45,7 @@
                        };
 
                        s6e3hf4: s6e3hf4_wqhd {
+                               device_type = "samsung-s6e3hf4";
                                mode = <2>;             /* 0: video mode, 1: DP command mode, 2: MIPI command mode */
                                resolution = <1440 2560>;
                                size = <68 122>;
@@ -78,6 +80,7 @@
                        };
 
                        s6e3ha2k: s6e3ha2k_wqhd {
+                               device_type = "samsung-s6e3ha2k";
                                mode = <2>;             /* 0: video mode, 1: DP command mode, 2: MIPI command mode */
                                resolution = <1440 2560>;
                                size = <80 120>;
                        };
 
                        s6e3ha3: s6e3ha3_wqhd {
+                               device_type = "samsung-s6e3ha3";
                                mode = <2>;             /* 0: video mode, 1: DP command mode, 2: MIPI command mode */
                                resolution = <1440 2560>;
                                size = <70 121>;
                        };
 
                        s6e3ha6: s6e3ha6_ddi {
+                               device_type = "samsung-s6e3ha6";
                                mode = <2>;
                                resolution = <1440 2960>;
                                size = <69 142>;
                        };
 
                        s6e3fa0: s6e3fa0_fhd {
+                               device_type = "samsung-s6e3fa0";
                                mode = <2>;             /* 0: video mode, 1: DP command mode, 2: MIPI command mode */
                                resolution = <1080 1920>;
                                size = <70 121>;
                        };
 
                        s6e3fa0_vid: s6e3fa0_hfd_vid {
+                               device_type = "samsung-s6e3fa0-vdo";
                                mode = <0>; /* 0: video mode, 1: DP command mode, 2: MIPI command mode */
                                resolution = <1080 1920>;
                                size = <80 120>;
index c7aa74e0b78c0f2ac2289bf851898a662754340b..0dc5d73457edbb7e4ff6b24ff40be765d88eb12d 100644 (file)
                clocks = <&clock UMUX_CLKCMU_DISPAUD_BUS>;
 
                memory-region = <&fb_rmem>;
+               ddi_id = <0xffffffff>;
        };
 
        decon_f: decon_f@0x148B0000 {
index e84ca5143e818ac1b2c706b9b4b6ffaf75047404..cfd8cf262ae88c0aba89784238cdac27dc9f3126 100644 (file)
@@ -336,7 +336,7 @@ CONFIG_EXYNOS_READ_ESD_SOLUTION=y
 # CONFIG_EXYNOS_DSIM_DITHER is not set
 CONFIG_EXYNOS_PANEL_CABC=y
 CONFIG_EXYNOS_DECON_LCD=y
-CONFIG_EXYNOS_DECON_LCD_S6E3FA0=y
+CONFIG_EXYNOS_DECON_LCD_MULTI=y
 CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
index 6a640a7af4947bee971b2358963fc32b91c2b06d..bdcc70c23d66ae09936a8e3ef8a681d329365ce3 100644 (file)
 #include "./cal_9610/dsim_cal.h"
 #endif
 
-#if defined(CONFIG_EXYNOS_DECON_LCD_S6E3HA2K)
-#include "./panels/s6e3ha2k_param.h"
-#elif defined(CONFIG_EXYNOS_DECON_LCD_S6E3HF4)
-#include "./panels/s6e3hf4_param.h"
-#elif defined(CONFIG_EXYNOS_DECON_LCD_EMUL_DISP)
-#include "./panels/emul_disp_param.h"
-#elif defined(CONFIG_EXYNOS_DECON_LCD_S6E3HA6)
-#include "./panels/s6e3ha6_param.h"
-#elif defined(CONFIG_EXYNOS_DECON_LCD_S6E3AA2)
-#include "./panels/s6e3aa2_param.h"
-#elif defined(CONFIG_EXYNOS_DECON_LCD_S6E3FA0)
-#include "./panels/s6e3fa0_param.h"
-#endif
-
 extern int dsim_log_level;
 
 #define DSIM_MODULE_NAME                       "exynos-dsim"
@@ -246,6 +232,7 @@ struct dsim_device {
        int esd_test;
        bool esd_recovering;
 #endif
+       u32 ddi_id;
 };
 
 struct dsim_lcd_driver {
index 81d676f7cb4581da299fe27544397db1830f74ce..d1f8b8ce2c66938549431c7c3d7f59a0dde9a443 100644 (file)
@@ -530,6 +530,23 @@ static int dsim_get_clocks(struct dsim_device *dsim)
        return 0;
 }
 
+static int dsim_get_ddi_id(struct dsim_device *dsim)
+{
+       struct device *dev = dsim->dev;
+
+       if (!dev->of_node) {
+               dsim_warn("no device tree information\n");
+               return -1;
+       }
+
+       dsim->ddi_id = 0;
+       of_property_read_u32(dev->of_node, "ddi_id", &dsim->ddi_id);
+
+       dsim_info("Transfered ddi id is [0x%08x]\n", dsim->ddi_id);
+
+       return 0;
+}
+
 static int dsim_get_gpios(struct dsim_device *dsim)
 {
        struct device *dev = dsim->dev;
@@ -1265,8 +1282,10 @@ int dsim_create_cmd_rw_sysfs(struct dsim_device *dsim)
 
 static void dsim_parse_lcd_info(struct dsim_device *dsim)
 {
+       struct device_node *node = NULL;
+       struct device *dev = dsim->dev;
+       char *ddi_device_type;
        u32 res[14];
-       struct device_node *node;
        unsigned int mres_num = 1;
        u32 mres_w[3] = {0, };
        u32 mres_h[3] = {0, };
@@ -1280,7 +1299,22 @@ static void dsim_parse_lcd_info(struct dsim_device *dsim)
        u32 hdr_mnl = 0;
        int k;
 
-       node = of_parse_phandle(dsim->dev->of_node, "lcd_info", 0);
+       of_property_read_u32(dev->of_node, "ddi_id", &dsim->ddi_id);
+       dsim_info("ddi id : 0x%08x\n", dsim->ddi_id);
+
+       switch (dsim->ddi_id) {
+       case 0xff244040:
+               ddi_device_type = "samsung-s6e3fa0-vdo";
+               dsim_info("ddi type : %s\n", ddi_device_type);
+               break;
+
+       default:
+               dsim_info("can't read ddi_device_type\n");
+               BUG();
+               break;
+       }
+
+       node = of_find_node_by_type(node, ddi_device_type);
 
        of_property_read_u32(node, "mode", &dsim->lcd_info.mode);
        dsim_info("%s mode\n", dsim->lcd_info.mode ? "command" : "video");
@@ -1485,31 +1519,23 @@ static int dsim_parse_dt(struct dsim_device *dsim, struct device *dev)
        dsim_get_gpios(dsim);
        dsim_get_regulator(dsim);
        dsim_parse_lcd_info(dsim);
+       dsim_get_ddi_id(dsim);
 
        return 0;
 }
 
 static void dsim_register_panel(struct dsim_device *dsim)
 {
-#if IS_ENABLED(CONFIG_EXYNOS_DECON_LCD_S6E3HA2K)
-       dsim->panel_ops = &s6e3ha2k_mipi_lcd_driver;
-#elif IS_ENABLED(CONFIG_EXYNOS_DECON_LCD_S6E3HF4)
-       dsim->panel_ops = &s6e3hf4_mipi_lcd_driver;
-#elif IS_ENABLED(CONFIG_EXYNOS_DECON_LCD_S6E3HA6)
-       dsim->panel_ops = &s6e3ha6_mipi_lcd_driver;
-#elif IS_ENABLED(CONFIG_EXYNOS_DECON_LCD_S6E3HA8)
-       dsim->panel_ops = &s6e3ha8_mipi_lcd_driver;
-#elif IS_ENABLED(CONFIG_EXYNOS_DECON_LCD_S6E3AA2)
-       dsim->panel_ops = &s6e3aa2_mipi_lcd_driver;
-#elif IS_ENABLED(CONFIG_EXYNOS_DECON_LCD_S6E3FA0)
-       dsim->panel_ops = &s6e3fa0_mipi_lcd_driver;
-#elif IS_ENABLED(CONFIG_EXYNOS_DECON_LCD_S6E3FA7)
-       dsim->panel_ops = &s6e3fa7_mipi_lcd_driver;
-#elif IS_ENABLED(CONFIG_EXYNOS_DECON_LCD_EMUL_DISP)
-       dsim->panel_ops = &emul_disp_mipi_lcd_driver;
-#else
-       dsim->panel_ops = &s6e3ha2k_mipi_lcd_driver;
-#endif
+       switch (dsim->ddi_id) {
+       case 0xff244040:
+               dsim->panel_ops = &s6e3fa0_mipi_lcd_driver;
+               dsim_info("panel ops : s6e3fa0_mipi_lcd_driver\n");
+               break;
+       default:
+               dsim_info("panel ops is not bind\n");
+               BUG();
+               break;
+       }
 }
 
 static int dsim_get_data_lanes(struct dsim_device *dsim)
index df2a3383b27761f4a787793be54f4d70cfaf1f13..62c4193dd5742c6b62fc72fbbee40ddb0ab34d90 100644 (file)
@@ -1,6 +1,9 @@
 config EXYNOS_DECON_LCD
        depends on EXYNOS_DPU20
        bool "Select LCD panel driver"
+config EXYNOS_DECON_LCD_MULTI
+       depends on EXYNOS_DECON_LCD && EXYNOS_MIPI_DSIM
+       tristate "Support Muli panel drivers"
 
 config EXYNOS_DECON_LCD_S6E3HA2K
        depends on EXYNOS_DECON_LCD && EXYNOS_MIPI_DSIM
index 9774c668ac303a27bf40e57cd2f02d56ca04e384..5147f2e9b862512cccd215ef31819c8865325668 100644 (file)
@@ -1,3 +1,4 @@
+obj-$(CONFIG_EXYNOS_DECON_LCD_MULTI)   += s6e3fa0_mipi_lcd.o s6e3fa0_lcd_ctrl.o
 obj-$(CONFIG_EXYNOS_DECON_LCD_S6E3HA2K)        += s6e3ha2k_mipi_lcd.o s6e3ha2k_lcd_ctrl.o
 obj-$(CONFIG_EXYNOS_DECON_LCD_S6E3HF4) += s6e3hf4_mipi_lcd.o s6e3hf4_lcd_ctrl.o
 obj-$(CONFIG_EXYNOS_DECON_LCD_S6E3HA6) += s6e3ha6_mipi_lcd.o s6e3ha6_lcd_ctrl.o
index e358c61855def56b883e967fff45b7bc405fc8eb..ce6420574620aaada4ccd5d3c52a448a06886a42 100644 (file)
@@ -142,4 +142,31 @@ struct decon_dsc {
                unsigned char *dec_pps_t;
 };
 
+#if defined(CONFIG_EXYNOS_PANEL_CABC)
+/*
+ * cabc_mode[1:0] must be re-mapped according to DDI command
+ * 3FA0 is OLED, so CABC command is not supported.
+ * Following values represent for ACL2 control of 3FA0.
+ * - [2'b00] ACL off
+ * - [2'b01] ACL low
+ * - [2'b10] ACL mid
+ * - [2'b11] ACL high
+ */
+enum cabc_mode {
+       CABC_OFF = 0,
+       CABC_USER_IMAGE,
+       CABC_STILL_PICTURE,
+       CABC_MOVING_IMAGE,
+       CABC_READ_MODE = 0x80,
+};
+
+enum power_mode {
+       POWER_SAVE_OFF = 0,
+       POWER_SAVE_LOW = 1,
+       POWER_SAVE_MEDIUM = 2,
+       POWER_SAVE_HIGH = 3,
+       POWER_SAVE_MAX = 4,
+};
+#endif
+
 #endif
index 2057538ab2839852021d3fcc79ea5b0db50174e1..91a05fc811e08b839cfe720b35ef1653278cf538 100644 (file)
 
 #include "decon_lcd.h"
 
-void lcd_init(int id, struct decon_lcd *lcd);
-void lcd_enable(int id);
-void lcd_disable(int id);
-void lcd_sleepin(int id);
-void lcd_sleepout(int id);
-int lcd_gamma_ctrl(int id, unsigned int backlightlevel);
-int lcd_gamma_update(int id);
-int lcd_dump(int id);
-void lcd_mres(int id, int mres_idx, int dsc_en);
-void lcd_lane_ctl(int id, unsigned int lane_num);
+void s6e3fa0_lcd_init(int id, struct decon_lcd *lcd);
+void s6e3fa0_lcd_enable(int id);
+void s6e3fa0_lcd_disable(int id);
+void s6e3fa0_lcd_sleepin(int id);
+void s6e3fa0_lcd_sleepout(int id);
+int s6e3fa0_lcd_gamma_ctrl(int id, unsigned int backlightlevel);
+int s6e3fa0_lcd_gamma_update(int id);
+int s6e3fa0_lcd_dump(int id);
+void s6e3fa0_lcd_mres(int id, int mres_idx, int dsc_en);
+void s6e3fa0_lcd_lane_ctl(int id, unsigned int lane_num);
 
 #endif /* __LCD_CTRL_H__ */
index 3a82f754d3bda3335a79fd03268181fc272c1f12..0a5734b9080e7f0ca40b444f7370b0ad7e94fe90 100644 (file)
@@ -89,7 +89,7 @@ struct decon_lcd s6e3fa0_lcd_info = {
  *     - mic : if mic is enabled, MIC_ENABLE command must be sent
  *     - mode : LCD init sequence depends on command or video mode
  */
-void lcd_init(int id, struct decon_lcd *lcd)
+void s6e3fa0_lcd_init(int id, struct decon_lcd *lcd)
 {
        if (dsim_wr_data(id, MIPI_DSI_DCS_LONG_WRITE, (unsigned long)SEQ_TEST_KEY_ON_F0,
                                ARRAY_SIZE(SEQ_TEST_KEY_ON_F0)) < 0)
@@ -168,13 +168,13 @@ void lcd_init(int id, struct decon_lcd *lcd)
                mdelay(120);
 }
 
-void lcd_enable(int id)
+void s6e3fa0_lcd_enable(int id)
 {
        if (dsim_wr_data(id, MIPI_DSI_DCS_SHORT_WRITE, SEQ_DISPLAY_ON[0], 0) < 0)
                dsim_err("fail to send SEQ_DISPLAY_ON command.\n");
 }
 
-void lcd_disable(int id)
+void s6e3fa0_lcd_disable(int id)
 {
        if (dsim_wr_data(id, MIPI_DSI_DCS_LONG_WRITE, (unsigned long)SEQ_DISPLAY_OFF,
                                ARRAY_SIZE(SEQ_DISPLAY_OFF)) < 0)
@@ -182,7 +182,7 @@ void lcd_disable(int id)
        mdelay(20);
 }
 
-void lcd_sleepin(int id)
+void s6e3fa0_lcd_sleepin(int id)
 {
        if (dsim_wr_data(id, MIPI_DSI_DCS_LONG_WRITE, (unsigned long)SEQ_SLEEP_IN,
                                ARRAY_SIZE(SEQ_SLEEP_IN)) < 0)
@@ -190,7 +190,7 @@ void lcd_sleepin(int id)
        mdelay(120);
 }
 
-void lcd_sleepout(int id)
+void s6e3fa0_lcd_sleepout(int id)
 {
        if (dsim_wr_data(id, MIPI_DSI_DCS_SHORT_WRITE, SEQ_SLEEP_OUT[0], 0) < 0)
                dsim_err("fail to send SEQ_SLEEP_OUT command.\n");
@@ -204,7 +204,7 @@ void lcd_sleepout(int id)
  * Parameter
  *     - backlightlevel : It is from 0 to 26.
  */
-int lcd_gamma_ctrl(int id, u32 backlightlevel)
+int s6e3fa0_lcd_gamma_ctrl(int id, u32 backlightlevel)
 {
        int ret;
 
@@ -218,7 +218,7 @@ int lcd_gamma_ctrl(int id, u32 backlightlevel)
        return 0;
 }
 
-int lcd_gamma_update(int id)
+int s6e3fa0_lcd_gamma_update(int id)
 {
        int ret;
 
index 1657c4b38be8118b3487fd20fc93fe13cd9f4cab..cf9f93462e6c4a16eb64b45b4283f1a763724793 100644 (file)
@@ -49,7 +49,7 @@ static int s6e3fa0_get_brightness(struct backlight_device *bd)
        return bd->props.brightness;
 }
 
-static int get_backlight_level(int brightness)
+static int s6e3fa0_get_backlight_level(int brightness)
 {
        int backlightlevel;
 
@@ -173,13 +173,13 @@ static int get_backlight_level(int brightness)
        return backlightlevel;
 }
 
-static int update_brightness(struct dsim_device *dsim, int brightness)
+static int s6e3fa0_update_brightness(struct dsim_device *dsim, int brightness)
 {
        int backlightlevel;
 
        dsim_dbg("%s +\n", __func__);
 
-       backlightlevel = get_backlight_level(brightness);
+       backlightlevel = s6e3fa0_get_backlight_level(brightness);
 
        set_brightness[1] = backlightlevel;
 
@@ -215,7 +215,7 @@ static int s6e3fa0_set_brightness(struct backlight_device *bd)
                return -EINVAL;
        }
 
-       update_brightness(dsim, brightness);
+       s6e3fa0_update_brightness(dsim, brightness);
        return 1;
 }
 
@@ -282,7 +282,7 @@ static int s6e3fa0_cabc_mode(struct dsim_device *dsim, int mode)
        return count;
 }
 
-static ssize_t panel_cabc_mode_show(struct device *dev,
+static ssize_t s6e3fa0_panel_cabc_mode_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
        ssize_t count = 0;
@@ -301,7 +301,7 @@ static ssize_t panel_cabc_mode_show(struct device *dev,
        return count;
 }
 
-static ssize_t panel_cabc_mode_store(struct device *dev,
+static ssize_t s6e3fa0_panel_cabc_mode_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t count)
 {
        int ret;
@@ -323,8 +323,8 @@ static ssize_t panel_cabc_mode_store(struct device *dev,
        return count;
 }
 
-static DEVICE_ATTR(cabc_mode, 0660, panel_cabc_mode_show,
-                       panel_cabc_mode_store);
+static DEVICE_ATTR(cabc_mode, 0660, s6e3fa0_panel_cabc_mode_show,
+                       s6e3fa0_panel_cabc_mode_store);
 
 static struct attribute *panel_attrs[] = {
        &dev_attr_cabc_mode.attr,
@@ -401,8 +401,8 @@ static int s6e3fa0_displayon(struct dsim_device *dsim)
        struct panel_device *panel = panel_drvdata;
 #endif
 
-       lcd_init(dsim->id, &dsim->lcd_info);
-       lcd_enable(dsim->id);
+       s6e3fa0_lcd_init(dsim->id, &dsim->lcd_info);
+       s6e3fa0_lcd_enable(dsim->id);
 
 #if defined(CONFIG_EXYNOS_PANEL_CABC)
        if (panel)
@@ -418,8 +418,8 @@ static int s6e3fa0_displayon(struct dsim_device *dsim)
 
 static int s6e3fa0_suspend(struct dsim_device *dsim)
 {
-       lcd_disable(dsim->id);
-       lcd_sleepin(dsim->id);
+       s6e3fa0_lcd_disable(dsim->id);
+       s6e3fa0_lcd_sleepin(dsim->id);
 
        return 1;
 }
@@ -506,20 +506,20 @@ static int s6e3fa0_read_state(struct dsim_device *dsim)
                return DSIM_ESD_OK;
        case 5: /* always return esd ok and display off/on by force*/
                dsim_info("%s, lcd_disable is called for ESD test\n", __func__);
-               lcd_disable(dsim->id);
+               s6e3fa0_lcd_disable(dsim->id);
                dsim_info("%s, 2sec sleep for ESD test\n", __func__);
                msleep(2000);
                dsim_info("%s, lcd_enable is called for ESD test\n", __func__);
-               lcd_enable(dsim->id);
+               s6e3fa0_lcd_enable(dsim->id);
                dsim->esd_test = 4;
                return DSIM_ESD_OK;
        case 6: /* always return esd detection and display off by force*/
                dsim_info("%s, lcd_disable is called for ESD test\n", __func__);
-               lcd_disable(dsim->id);
+               s6e3fa0_lcd_disable(dsim->id);
                dsim_info("%s, 2sec sleep for ESD test\n", __func__);
                msleep(2000);
                dsim_info("%s, lcd_enable is called for ESD test\n", __func__);
-               lcd_enable(dsim->id);
+               s6e3fa0_lcd_enable(dsim->id);
                dsim->esd_test = 4;
                return DSIM_ESD_ERROR;
        case 7: /* return DSIM_ESD_CHECK_ERROR by force */
index 4293fec2a0fbde663c737c19acc4af7ed7f817b3..baf8453d0d036311439368f3410eae44fba6f818 100644 (file)
 #ifndef __S6E3FA0_PARAM_H__
 #define __S6E3FA0_PARAM_H__
 
-#if defined(CONFIG_EXYNOS_PANEL_CABC)
-/*
- * cabc_mode[1:0] must be re-mapped according to DDI command
- * 3FA0 is OLED, so CABC command is not supported.
- * Following values represent for ACL2 control of 3FA0.
- * - [2'b00] ACL off
- * - [2'b01] ACL low
- * - [2'b10] ACL mid
- * - [2'b11] ACL high
- */
-enum cabc_mode {
-       CABC_OFF = 0,
-       CABC_USER_IMAGE,
-       CABC_STILL_PICTURE,
-       CABC_MOVING_IMAGE,
-       CABC_READ_MODE = 0x80,
-};
-
-enum power_mode {
-       POWER_SAVE_OFF = 0,
-       POWER_SAVE_LOW = 1,
-       POWER_SAVE_MEDIUM = 2,
-       POWER_SAVE_HIGH = 3,
-       POWER_SAVE_MAX = 4,
-};
-#endif
-
 /* MIPI commands list */
 static const unsigned char SEQ_TEST_KEY_ON_C0[] = {
        0xc0,