summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFancy Fang <chen.fang@nxp.com>2016-06-13 17:38:47 +0800
committerFancy Fang <chen.fang@nxp.com>2016-06-14 10:10:41 +0800
commit9a3820046d963fe82e900b4924ab75d0b71058d9 (patch)
tree02482102b87eaf582cfffe7e2a67bbfcdb38b5cc
parentc88b7359ac59a8cd6ac0522d6bf388622a45c8f6 (diff)
MLK-12901-3 video: mipi_dsi_samsung: alwasy use video mode to transfer data and cmds.
Since the lcdif uses RGB interface to transfer image data to mipi dsi, video mode should be used to transfer the image data. So, the commands transfer should also use video mode to avoid unnecessary mode switches. Signed-off-by: Fancy Fang <chen.fang@nxp.com> (cherry picked from commit 57d2d01a4fbdf6fb8f71515a74765492d1d34dab)
-rw-r--r--drivers/video/fbdev/mxc/mipi_dsi_samsung.c63
1 files changed, 30 insertions, 33 deletions
diff --git a/drivers/video/fbdev/mxc/mipi_dsi_samsung.c b/drivers/video/fbdev/mxc/mipi_dsi_samsung.c
index 95ad7f43db5a..8b86b2fe1659 100644
--- a/drivers/video/fbdev/mxc/mipi_dsi_samsung.c
+++ b/drivers/video/fbdev/mxc/mipi_dsi_samsung.c
@@ -72,13 +72,18 @@ enum mipi_dsi_mode {
DSI_VIDEO_MODE
};
+enum mipi_dsi_trans_mode {
+ DSI_LP_MODE,
+ DSI_HS_MODE
+};
+
static struct regulator *mipi_phy_reg;
static DECLARE_COMPLETION(dsi_rx_done);
static DECLARE_COMPLETION(dsi_tx_done);
static void mipi_dsi_dphy_power_down(void);
static void mipi_dsi_set_mode(struct mipi_dsi_info *mipi_dsi,
- enum mipi_dsi_mode mode);
+ enum mipi_dsi_trans_mode mode);
static int mipi_dsi_lcd_init(struct mipi_dsi_info *mipi_dsi,
struct mxc_dispdrv_setting *setting)
@@ -399,17 +404,6 @@ static int mipi_dsi_master_init(struct mipi_dsi_info *mipi_dsi,
reg |= MIPI_DSI_ESC_CLK_EN(1);
writel(reg, mipi_dsi->mmio_base + MIPI_DSI_CLKCTRL);
- /* check clock and data lanes are in stop state
- * which means dphy is in low power mode
- */
- while (!mipi_dsi_lane_stop_state(mipi_dsi)) {
- time_out--;
- if (time_out == 0) {
- dev_err(dev, "MIPI DSI is not stop state.\n");
- return -EINVAL;
- }
- }
-
/* set main display resolution */
writel(MIPI_DSI_MAIN_HRESOL(mode->xres) |
MIPI_DSI_MAIN_VRESOL(mode->yres) |
@@ -419,8 +413,8 @@ static int mipi_dsi_master_init(struct mipi_dsi_info *mipi_dsi,
/* set config register */
writel(MIPI_DSI_MFLUSH_VS(1) |
MIPI_DSI_SYNC_IN_FORM(0) |
- MIPI_DSI_BURST_MODE(0) |
- MIPI_DSI_VIDEO_MODE(0) |
+ MIPI_DSI_BURST_MODE(1) |
+ MIPI_DSI_VIDEO_MODE(1) |
MIPI_DSI_AUTO_MODE(0) |
MIPI_DSI_HSE_DISABLE_MODE(0) |
MIPI_DSI_HFP_DISABLE_MODE(0) |
@@ -468,6 +462,20 @@ static int mipi_dsi_master_init(struct mipi_dsi_info *mipi_dsi,
udelay(300);
writel(0x1f, mipi_dsi->mmio_base + MIPI_DSI_FIFOCTRL);
+ /* check clock and data lanes are in stop state
+ * which means dphy is in low power mode
+ */
+ while (!mipi_dsi_lane_stop_state(mipi_dsi)) {
+ time_out--;
+ if (time_out == 0) {
+ dev_err(dev, "MIPI DSI is not stop state.\n");
+ return -EINVAL;
+ }
+ }
+
+ /* transfer commands always in lp mode */
+ writel(MIPI_DSI_CMD_LPDT, mipi_dsi->mmio_base + MIPI_DSI_ESCMODE);
+
mipi_dsi_init_interrupt(mipi_dsi);
return 0;
@@ -503,23 +511,17 @@ static void mipi_dsi_disp_deinit(struct mxc_dispdrv_handle *disp)
}
static void mipi_dsi_set_mode(struct mipi_dsi_info *mipi_dsi,
- enum mipi_dsi_mode mode)
+ enum mipi_dsi_trans_mode mode)
{
- unsigned int dsi_config, escape_mode, dsi_clkctrl;
+ unsigned int dsi_clkctrl;
- dsi_config = readl(mipi_dsi->mmio_base + MIPI_DSI_CONFIG);
- escape_mode = readl(mipi_dsi->mmio_base + MIPI_DSI_ESCMODE);
dsi_clkctrl = readl(mipi_dsi->mmio_base + MIPI_DSI_CLKCTRL);
switch (mode) {
- case DSI_COMMAND_MODE:
- dsi_config &= ~MIPI_DSI_VIDEO_MODE(1);
- escape_mode |= (MIPI_DSI_CMD_LPDT | MIPI_DSI_TX_LPDT);
+ case DSI_LP_MODE:
dsi_clkctrl &= ~MIPI_DSI_TX_REQUEST_HSCLK(1);
break;
- case DSI_VIDEO_MODE:
- dsi_config |= (MIPI_DSI_VIDEO_MODE(1) | MIPI_DSI_BURST_MODE(1));
- escape_mode &= ~(MIPI_DSI_CMD_LPDT | MIPI_DSI_TX_LPDT);
+ case DSI_HS_MODE:
dsi_clkctrl |= MIPI_DSI_TX_REQUEST_HSCLK(1);
break;
default:
@@ -528,10 +530,8 @@ static void mipi_dsi_set_mode(struct mipi_dsi_info *mipi_dsi,
return;
}
- writel(escape_mode, mipi_dsi->mmio_base + MIPI_DSI_ESCMODE);
- writel(dsi_config, mipi_dsi->mmio_base + MIPI_DSI_CONFIG);
-
writel(dsi_clkctrl, mipi_dsi->mmio_base + MIPI_DSI_CLKCTRL);
+ mdelay(1);
}
static int mipi_dsi_enable(struct mxc_dispdrv_handle *disp,
@@ -567,10 +567,6 @@ static int mipi_dsi_enable(struct mxc_dispdrv_handle *disp,
if (ret)
return -EINVAL;
- /* the mipi lcd panel should be config
- * in the dsi command mode.
- */
- mipi_dsi_set_mode(mipi_dsi, DSI_COMMAND_MODE);
msleep(20);
ret = device_reset(&mipi_dsi->pdev->dev);
if (ret) {
@@ -579,6 +575,7 @@ static int mipi_dsi_enable(struct mxc_dispdrv_handle *disp,
}
msleep(120);
+ /* the panel should be config under LP mode */
ret = mipi_dsi->lcd_callback->mipi_lcd_setup(mipi_dsi);
if (ret < 0) {
dev_err(&mipi_dsi->pdev->dev,
@@ -587,8 +584,8 @@ static int mipi_dsi_enable(struct mxc_dispdrv_handle *disp,
}
mipi_dsi->lcd_inited = 1;
- /* change to video mode for panel display */
- mipi_dsi_set_mode(mipi_dsi, DSI_VIDEO_MODE);
+ /* change to HS mode for panel display */
+ mipi_dsi_set_mode(mipi_dsi, DSI_HS_MODE);
} else {
ret = mipi_dsi_dcs_cmd(mipi_dsi, MIPI_DCS_EXIT_SLEEP_MODE,
NULL, 0);