diff options
Diffstat (limited to 'drivers/video/fbdev/mxc/mipi_dsi_samsung.c')
-rw-r--r-- | drivers/video/fbdev/mxc/mipi_dsi_samsung.c | 145 |
1 files changed, 83 insertions, 62 deletions
diff --git a/drivers/video/fbdev/mxc/mipi_dsi_samsung.c b/drivers/video/fbdev/mxc/mipi_dsi_samsung.c index 553c0e83a7ea..7de2e2455665 100644 --- a/drivers/video/fbdev/mxc/mipi_dsi_samsung.c +++ b/drivers/video/fbdev/mxc/mipi_dsi_samsung.c @@ -56,6 +56,18 @@ static struct mipi_dsi_match_lcd mipi_dsi_lcd_db[] = { {mipid_hx8369_get_lcd_videomode, mipid_hx8369_lcd_setup} }, #endif +#ifdef CONFIG_FB_MXC_TRULY_PANEL_TFT3P5079E + { + "TRULY-WVGA-TFT3P5079E", + {mipid_otm8018b_get_lcd_videomode, mipid_otm8018b_lcd_setup} + }, +#endif +#ifdef CONFIG_FB_MXC_TRULY_PANEL_TFT3P5581E + { + "TRULY-WVGA-TFT3P5581E", + {mipid_hx8363_get_lcd_videomode, mipid_hx8363_lcd_setup} + }, +#endif { "", {NULL, NULL} } @@ -66,13 +78,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) @@ -214,6 +231,7 @@ static int mipi_dsi_pkt_write(struct mipi_dsi_info *mipi_dsi, return -ETIMEDOUT; } } + mdelay(10); return 0; } @@ -374,9 +392,13 @@ static int mipi_dsi_master_init(struct mipi_dsi_info *mipi_dsi, MIPI_DSI_PLL_BYPASS(0) | MIPI_DSI_BYTE_CLK_SRC(0), mipi_dsi->mmio_base + MIPI_DSI_CLKCTRL); - writel(MIPI_DSI_PLL_EN(1) | - MIPI_DSI_PMS(0x4190), - mipi_dsi->mmio_base + MIPI_DSI_PLLCTRL); + if (!strcmp(mipi_dsi->lcd_panel, "TRULY-WVGA-TFT3P5581E")) + writel(MIPI_DSI_PLL_EN(1) | MIPI_DSI_PMS(0x3141), + mipi_dsi->mmio_base + MIPI_DSI_PLLCTRL); + else + writel(MIPI_DSI_PLL_EN(1) | MIPI_DSI_PMS(0x4190), + mipi_dsi->mmio_base + MIPI_DSI_PLLCTRL); + /* set PLLTMR: stable time */ writel(33024, mipi_dsi->mmio_base + MIPI_DSI_PLLTMR); udelay(300); @@ -392,17 +414,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) | @@ -412,8 +423,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) | @@ -442,17 +453,31 @@ static int mipi_dsi_master_init(struct mipi_dsi_info *mipi_dsi, mipi_dsi->mmio_base + MIPI_DSI_MSYNC); /* configure d-phy timings */ - writel(MIPI_DSI_M_TLPXCTL(11) | MIPI_DSI_M_THSEXITCTL(18), - mipi_dsi->mmio_base + MIPI_DSI_PHYTIMING); - writel(MIPI_DSI_M_TCLKPRPRCTL(13) | - MIPI_DSI_M_TCLKZEROCTL(65) | - MIPI_DSI_M_TCLKPOSTCTL(17) | - MIPI_DSI_M_TCLKTRAILCTL(13), - mipi_dsi->mmio_base + MIPI_DSI_PHYTIMING1); - writel(MIPI_DSI_M_THSPRPRCTL(16) | - MIPI_DSI_M_THSZEROCTL(24) | - MIPI_DSI_M_THSTRAILCTL(16), - mipi_dsi->mmio_base + MIPI_DSI_PHYTIMING2); + if (!strcmp(mipi_dsi->lcd_panel, "TRULY-WVGA-TFT3P5581E")) { + writel(MIPI_DSI_M_TLPXCTL(2) | MIPI_DSI_M_THSEXITCTL(4), + mipi_dsi->mmio_base + MIPI_DSI_PHYTIMING); + writel(MIPI_DSI_M_TCLKPRPRCTL(5) | + MIPI_DSI_M_TCLKZEROCTL(14) | + MIPI_DSI_M_TCLKPOSTCTL(8) | + MIPI_DSI_M_TCLKTRAILCTL(3), + mipi_dsi->mmio_base + MIPI_DSI_PHYTIMING1); + writel(MIPI_DSI_M_THSPRPRCTL(3) | + MIPI_DSI_M_THSZEROCTL(3) | + MIPI_DSI_M_THSTRAILCTL(3), + mipi_dsi->mmio_base + MIPI_DSI_PHYTIMING2); + } else { + writel(MIPI_DSI_M_TLPXCTL(11) | MIPI_DSI_M_THSEXITCTL(18), + mipi_dsi->mmio_base + MIPI_DSI_PHYTIMING); + writel(MIPI_DSI_M_TCLKPRPRCTL(13) | + MIPI_DSI_M_TCLKZEROCTL(65) | + MIPI_DSI_M_TCLKPOSTCTL(17) | + MIPI_DSI_M_TCLKTRAILCTL(13), + mipi_dsi->mmio_base + MIPI_DSI_PHYTIMING1); + writel(MIPI_DSI_M_THSPRPRCTL(16) | + MIPI_DSI_M_THSZEROCTL(24) | + MIPI_DSI_M_THSTRAILCTL(16), + mipi_dsi->mmio_base + MIPI_DSI_PHYTIMING2); + } writel(0xf000f, mipi_dsi->mmio_base + MIPI_DSI_TIMEOUT); @@ -461,6 +486,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; @@ -496,23 +535,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: @@ -521,10 +554,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, @@ -542,14 +573,6 @@ static int mipi_dsi_enable(struct mxc_dispdrv_handle *disp, return ret; } } - - ret = device_reset(&mipi_dsi->pdev->dev); - if (ret) { - dev_err(&mipi_dsi->pdev->dev, - "failed to reset device: %d\n", ret); - return -EINVAL; - } - msleep(120); } if (!mipi_dsi->dsi_power_on) @@ -568,10 +591,15 @@ 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) { + dev_err(&mipi_dsi->pdev->dev, "failed to reset device: %d\n", ret); + return -EINVAL; + } + 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, @@ -580,8 +608,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); @@ -775,12 +803,6 @@ static int mipi_dsi_probe(struct platform_device *pdev) } } - ret = device_reset(&pdev->dev); - if (ret) { - dev_err(&pdev->dev, "failed to reset device: %d\n", ret); - goto dev_reset_fail; - } - mipi_dsi->lcd_panel = kstrdup(lcd_panel, GFP_KERNEL); if (!mipi_dsi->lcd_panel) { dev_err(&pdev->dev, "failed to allocate lcd panel name\n"); @@ -810,7 +832,6 @@ static int mipi_dsi_probe(struct platform_device *pdev) dispdrv_reg_fail: kfree(mipi_dsi->lcd_panel); kstrdup_fail: -dev_reset_fail: if (mipi_dsi->disp_power_on) regulator_disable(mipi_dsi->disp_power_on); |