aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/omap2/displays/panel-taal.c4
-rw-r--r--drivers/video/omap2/dss/dpi.c4
-rw-r--r--drivers/video/omap2/dss/dsi.c35
-rw-r--r--drivers/video/omap2/dss/dss.h2
-rw-r--r--include/video/omapdss.h3
5 files changed, 31 insertions, 17 deletions
diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 83b0316e35ad..04d9bc94c5b3 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -932,7 +932,7 @@ err:
932 932
933 taal_hw_reset(dssdev); 933 taal_hw_reset(dssdev);
934 934
935 omapdss_dsi_display_disable(dssdev); 935 omapdss_dsi_display_disable(dssdev, true);
936err0: 936err0:
937 return r; 937 return r;
938} 938}
@@ -955,7 +955,7 @@ static void taal_power_off(struct omap_dss_device *dssdev)
955 taal_hw_reset(dssdev); 955 taal_hw_reset(dssdev);
956 } 956 }
957 957
958 omapdss_dsi_display_disable(dssdev); 958 omapdss_dsi_display_disable(dssdev, true);
959 959
960 td->enabled = 0; 960 td->enabled = 0;
961} 961}
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
index 4a2a1e1b195f..bec8c8a3b49d 100644
--- a/drivers/video/omap2/dss/dpi.c
+++ b/drivers/video/omap2/dss/dpi.c
@@ -206,7 +206,7 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
206 206
207err4: 207err4:
208 if (dpi_use_dsi_pll(dssdev)) 208 if (dpi_use_dsi_pll(dssdev))
209 dsi_pll_uninit(); 209 dsi_pll_uninit(true);
210err3: 210err3:
211 if (dpi_use_dsi_pll(dssdev)) 211 if (dpi_use_dsi_pll(dssdev))
212 dss_clk_disable(DSS_CLK_SYSCK); 212 dss_clk_disable(DSS_CLK_SYSCK);
@@ -227,7 +227,7 @@ void omapdss_dpi_display_disable(struct omap_dss_device *dssdev)
227 227
228 if (dpi_use_dsi_pll(dssdev)) { 228 if (dpi_use_dsi_pll(dssdev)) {
229 dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); 229 dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
230 dsi_pll_uninit(); 230 dsi_pll_uninit(true);
231 dss_clk_disable(DSS_CLK_SYSCK); 231 dss_clk_disable(DSS_CLK_SYSCK);
232 } 232 }
233 233
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
index e2ae1e7372f2..9befbceba10c 100644
--- a/drivers/video/omap2/dss/dsi.c
+++ b/drivers/video/omap2/dss/dsi.c
@@ -246,6 +246,7 @@ static struct
246 246
247 struct dsi_clock_info current_cinfo; 247 struct dsi_clock_info current_cinfo;
248 248
249 bool vdds_dsi_enabled;
249 struct regulator *vdds_dsi_reg; 250 struct regulator *vdds_dsi_reg;
250 251
251 struct { 252 struct {
@@ -1445,9 +1446,12 @@ int dsi_pll_init(struct omap_dss_device *dssdev, bool enable_hsclk,
1445 enable_clocks(1); 1446 enable_clocks(1);
1446 dsi_enable_pll_clock(1); 1447 dsi_enable_pll_clock(1);
1447 1448
1448 r = regulator_enable(dsi.vdds_dsi_reg); 1449 if (!dsi.vdds_dsi_enabled) {
1449 if (r) 1450 r = regulator_enable(dsi.vdds_dsi_reg);
1450 goto err0; 1451 if (r)
1452 goto err0;
1453 dsi.vdds_dsi_enabled = true;
1454 }
1451 1455
1452 /* XXX PLL does not come out of reset without this... */ 1456 /* XXX PLL does not come out of reset without this... */
1453 dispc_pck_free_enable(1); 1457 dispc_pck_free_enable(1);
@@ -1481,21 +1485,28 @@ int dsi_pll_init(struct omap_dss_device *dssdev, bool enable_hsclk,
1481 1485
1482 return 0; 1486 return 0;
1483err1: 1487err1:
1484 regulator_disable(dsi.vdds_dsi_reg); 1488 if (dsi.vdds_dsi_enabled) {
1489 regulator_disable(dsi.vdds_dsi_reg);
1490 dsi.vdds_dsi_enabled = false;
1491 }
1485err0: 1492err0:
1486 enable_clocks(0); 1493 enable_clocks(0);
1487 dsi_enable_pll_clock(0); 1494 dsi_enable_pll_clock(0);
1488 return r; 1495 return r;
1489} 1496}
1490 1497
1491void dsi_pll_uninit(void) 1498void dsi_pll_uninit(bool disconnect_lanes)
1492{ 1499{
1493 enable_clocks(0); 1500 enable_clocks(0);
1494 dsi_enable_pll_clock(0); 1501 dsi_enable_pll_clock(0);
1495 1502
1496 dsi.pll_locked = 0; 1503 dsi.pll_locked = 0;
1497 dsi_pll_power(DSI_PLL_POWER_OFF); 1504 dsi_pll_power(DSI_PLL_POWER_OFF);
1498 regulator_disable(dsi.vdds_dsi_reg); 1505 if (disconnect_lanes) {
1506 WARN_ON(!dsi.vdds_dsi_enabled);
1507 regulator_disable(dsi.vdds_dsi_reg);
1508 dsi.vdds_dsi_enabled = false;
1509 }
1499 DSSDBG("PLL uninit done\n"); 1510 DSSDBG("PLL uninit done\n");
1500} 1511}
1501 1512
@@ -3642,12 +3653,13 @@ err2:
3642 dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); 3653 dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
3643 dss_select_dsi_clk_source(OMAP_DSS_CLK_SRC_FCK); 3654 dss_select_dsi_clk_source(OMAP_DSS_CLK_SRC_FCK);
3644err1: 3655err1:
3645 dsi_pll_uninit(); 3656 dsi_pll_uninit(true);
3646err0: 3657err0:
3647 return r; 3658 return r;
3648} 3659}
3649 3660
3650static void dsi_display_uninit_dsi(struct omap_dss_device *dssdev) 3661static void dsi_display_uninit_dsi(struct omap_dss_device *dssdev,
3662 bool disconnect_lanes)
3651{ 3663{
3652 if (!dsi.ulps_enabled) 3664 if (!dsi.ulps_enabled)
3653 dsi_enter_ulps(); 3665 dsi_enter_ulps();
@@ -3662,7 +3674,7 @@ static void dsi_display_uninit_dsi(struct omap_dss_device *dssdev)
3662 dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); 3674 dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
3663 dss_select_dsi_clk_source(OMAP_DSS_CLK_SRC_FCK); 3675 dss_select_dsi_clk_source(OMAP_DSS_CLK_SRC_FCK);
3664 dsi_complexio_uninit(); 3676 dsi_complexio_uninit();
3665 dsi_pll_uninit(); 3677 dsi_pll_uninit(disconnect_lanes);
3666} 3678}
3667 3679
3668static int dsi_core_init(void) 3680static int dsi_core_init(void)
@@ -3731,7 +3743,8 @@ err0:
3731} 3743}
3732EXPORT_SYMBOL(omapdss_dsi_display_enable); 3744EXPORT_SYMBOL(omapdss_dsi_display_enable);
3733 3745
3734void omapdss_dsi_display_disable(struct omap_dss_device *dssdev) 3746void omapdss_dsi_display_disable(struct omap_dss_device *dssdev,
3747 bool disconnect_lanes)
3735{ 3748{
3736 DSSDBG("dsi_display_disable\n"); 3749 DSSDBG("dsi_display_disable\n");
3737 3750
@@ -3741,7 +3754,7 @@ void omapdss_dsi_display_disable(struct omap_dss_device *dssdev)
3741 3754
3742 dsi_display_uninit_dispc(dssdev); 3755 dsi_display_uninit_dispc(dssdev);
3743 3756
3744 dsi_display_uninit_dsi(dssdev); 3757 dsi_display_uninit_dsi(dssdev, disconnect_lanes);
3745 3758
3746 enable_clocks(0); 3759 enable_clocks(0);
3747 dsi_enable_pll_clock(0); 3760 dsi_enable_pll_clock(0);
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
index d3b5697134e1..eea5c7d58dde 100644
--- a/drivers/video/omap2/dss/dss.h
+++ b/drivers/video/omap2/dss/dss.h
@@ -294,7 +294,7 @@ int dsi_pll_calc_clock_div_pck(bool is_tft, unsigned long req_pck,
294 struct dispc_clock_info *dispc_cinfo); 294 struct dispc_clock_info *dispc_cinfo);
295int dsi_pll_init(struct omap_dss_device *dssdev, bool enable_hsclk, 295int dsi_pll_init(struct omap_dss_device *dssdev, bool enable_hsclk,
296 bool enable_hsdiv); 296 bool enable_hsdiv);
297void dsi_pll_uninit(void); 297void dsi_pll_uninit(bool disconnect_lanes);
298void dsi_get_overlay_fifo_thresholds(enum omap_plane plane, 298void dsi_get_overlay_fifo_thresholds(enum omap_plane plane,
299 u32 fifo_size, enum omap_burst_size *burst_size, 299 u32 fifo_size, enum omap_burst_size *burst_size,
300 u32 *fifo_low, u32 *fifo_high); 300 u32 *fifo_low, u32 *fifo_high);
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index 8138613c3112..0a10a234a989 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -589,7 +589,8 @@ int omap_dsi_set_vc_id(struct omap_dss_device *dssdev, int channel, int vc_id);
589void omap_dsi_release_vc(struct omap_dss_device *dssdev, int channel); 589void omap_dsi_release_vc(struct omap_dss_device *dssdev, int channel);
590 590
591int omapdss_dsi_display_enable(struct omap_dss_device *dssdev); 591int omapdss_dsi_display_enable(struct omap_dss_device *dssdev);
592void omapdss_dsi_display_disable(struct omap_dss_device *dssdev); 592void omapdss_dsi_display_disable(struct omap_dss_device *dssdev,
593 bool disconnect_lanes);
593 594
594int omapdss_dpi_display_enable(struct omap_dss_device *dssdev); 595int omapdss_dpi_display_enable(struct omap_dss_device *dssdev);
595void omapdss_dpi_display_disable(struct omap_dss_device *dssdev); 596void omapdss_dpi_display_disable(struct omap_dss_device *dssdev);