diff options
Diffstat (limited to 'drivers/video/mxc/mipi_dsi_samsung.c')
-rw-r--r-- | drivers/video/mxc/mipi_dsi_samsung.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/drivers/video/mxc/mipi_dsi_samsung.c b/drivers/video/mxc/mipi_dsi_samsung.c index 7e0fc9c2c578..edd578fcf015 100644 --- a/drivers/video/mxc/mipi_dsi_samsung.c +++ b/drivers/video/mxc/mipi_dsi_samsung.c @@ -365,9 +365,6 @@ static int mipi_dsi_master_init(struct mipi_dsi_info *mipi_dsi, struct fb_videomode *mode = mipi_dsi->mode; struct device *dev = &mipi_dsi->pdev->dev; - /* power on dphy */ - mipi_dsi_dphy_power_on(mipi_dsi->pdev); - /* configure DPHY PLL clock */ writel(MIPI_DSI_TX_REQUEST_HSCLK(0) | MIPI_DSI_DPHY_SEL(0) | @@ -533,6 +530,28 @@ static int mipi_dsi_enable(struct mxc_dispdrv_handle *disp, int ret; struct mipi_dsi_info *mipi_dsi = mxc_dispdrv_getdata(disp); + if (fbi->state == FBINFO_STATE_SUSPENDED) { + if (mipi_dsi->disp_power_on) { + ret = regulator_enable(mipi_dsi->disp_power_on); + if (ret) { + dev_err(&mipi_dsi->pdev->dev, "failed to enable display " + "power regulator, err = %d\n", ret); + 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); + } + + /* power on dphy */ + mipi_dsi_dphy_power_on(mipi_dsi->pdev); + ret = clk_prepare_enable(mipi_dsi->dphy_clk); ret |= clk_prepare_enable(mipi_dsi->cfg_clk); if (ret) { @@ -581,6 +600,15 @@ static void mipi_dsi_disable(struct mxc_dispdrv_handle *disp, struct mipi_dsi_info *mipi_dsi = mxc_dispdrv_getdata(disp); mipi_dsi_power_off(mipi_dsi->disp_mipi); + + if (fbi->state == FBINFO_STATE_SUSPENDED) { + mipi_dsi_dphy_power_down(); + + if (mipi_dsi->disp_power_on) + regulator_disable(mipi_dsi->disp_power_on); + + mipi_dsi->lcd_inited = 0; + } } static int mipi_dsi_setup(struct mxc_dispdrv_handle *disp, |