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>; */
};
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>;
};
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>;
clocks = <&clock UMUX_CLKCMU_DISPAUD_BUS>;
memory-region = <&fb_rmem>;
+ ddi_id = <0xffffffff>;
};
decon_f: decon_f@0x148B0000 {
# 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
#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"
int esd_test;
bool esd_recovering;
#endif
+ u32 ddi_id;
};
struct dsim_lcd_driver {
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;
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, };
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");
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)
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
+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
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
#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__ */
* - 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)
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)
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)
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");
* 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;
return 0;
}
-int lcd_gamma_update(int id)
+int s6e3fa0_lcd_gamma_update(int id)
{
int ret;
return bd->props.brightness;
}
-static int get_backlight_level(int brightness)
+static int s6e3fa0_get_backlight_level(int brightness)
{
int backlightlevel;
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;
return -EINVAL;
}
- update_brightness(dsim, brightness);
+ s6e3fa0_update_brightness(dsim, brightness);
return 1;
}
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;
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;
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,
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)
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;
}
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 */
#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,