diff options
-rw-r--r-- | drivers/video/omap2/displays/panel-taal.c | 4 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dpi.c | 4 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dsi.c | 35 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dss.h | 2 | ||||
-rw-r--r-- | include/video/omapdss.h | 3 |
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); |
936 | err0: | 936 | err0: |
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 | ||
207 | err4: | 207 | err4: |
208 | if (dpi_use_dsi_pll(dssdev)) | 208 | if (dpi_use_dsi_pll(dssdev)) |
209 | dsi_pll_uninit(); | 209 | dsi_pll_uninit(true); |
210 | err3: | 210 | err3: |
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; |
1483 | err1: | 1487 | err1: |
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 | } | ||
1485 | err0: | 1492 | err0: |
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 | ||
1491 | void dsi_pll_uninit(void) | 1498 | void 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); |
3644 | err1: | 3655 | err1: |
3645 | dsi_pll_uninit(); | 3656 | dsi_pll_uninit(true); |
3646 | err0: | 3657 | err0: |
3647 | return r; | 3658 | return r; |
3648 | } | 3659 | } |
3649 | 3660 | ||
3650 | static void dsi_display_uninit_dsi(struct omap_dss_device *dssdev) | 3661 | static 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 | ||
3668 | static int dsi_core_init(void) | 3680 | static int dsi_core_init(void) |
@@ -3731,7 +3743,8 @@ err0: | |||
3731 | } | 3743 | } |
3732 | EXPORT_SYMBOL(omapdss_dsi_display_enable); | 3744 | EXPORT_SYMBOL(omapdss_dsi_display_enable); |
3733 | 3745 | ||
3734 | void omapdss_dsi_display_disable(struct omap_dss_device *dssdev) | 3746 | void 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); |
295 | int dsi_pll_init(struct omap_dss_device *dssdev, bool enable_hsclk, | 295 | int dsi_pll_init(struct omap_dss_device *dssdev, bool enable_hsclk, |
296 | bool enable_hsdiv); | 296 | bool enable_hsdiv); |
297 | void dsi_pll_uninit(void); | 297 | void dsi_pll_uninit(bool disconnect_lanes); |
298 | void dsi_get_overlay_fifo_thresholds(enum omap_plane plane, | 298 | void 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); | |||
589 | void omap_dsi_release_vc(struct omap_dss_device *dssdev, int channel); | 589 | void omap_dsi_release_vc(struct omap_dss_device *dssdev, int channel); |
590 | 590 | ||
591 | int omapdss_dsi_display_enable(struct omap_dss_device *dssdev); | 591 | int omapdss_dsi_display_enable(struct omap_dss_device *dssdev); |
592 | void omapdss_dsi_display_disable(struct omap_dss_device *dssdev); | 592 | void omapdss_dsi_display_disable(struct omap_dss_device *dssdev, |
593 | bool disconnect_lanes); | ||
593 | 594 | ||
594 | int omapdss_dpi_display_enable(struct omap_dss_device *dssdev); | 595 | int omapdss_dpi_display_enable(struct omap_dss_device *dssdev); |
595 | void omapdss_dpi_display_disable(struct omap_dss_device *dssdev); | 596 | void omapdss_dpi_display_disable(struct omap_dss_device *dssdev); |