aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/omap2/dss/dsi.c
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2011-04-13 10:12:52 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2011-05-11 07:20:15 -0400
commit24c1ae4191e911caa08b31079d61ff4db319a101 (patch)
treea0b35c0910cb2c8ff3b1522a6a5c1b1d090bba8f /drivers/video/omap2/dss/dsi.c
parentc335cbf94e7450fb41aafe97e805752a830d3a43 (diff)
OMAP: DSS2: DSI: implement enable/disable SCP clk
SCP clock is needed for CIO on OMAP3, and for CIO and PLL on OMAP4. Current driver enables the CIO clock always when DSI display is initialized. However, if a DPI display tries to use DSI PLL, the SCP clock is never enabled. This patch implements simple ref counting enable/disable functions for SCP clock. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video/omap2/dss/dsi.c')
-rw-r--r--drivers/video/omap2/dss/dsi.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
index 186a228f9f2..1198974c889 100644
--- a/drivers/video/omap2/dss/dsi.c
+++ b/drivers/video/omap2/dss/dsi.c
@@ -305,6 +305,8 @@ static struct
305 unsigned long regm_dispc_max, regm_dsi_max; 305 unsigned long regm_dispc_max, regm_dsi_max;
306 unsigned long fint_min, fint_max; 306 unsigned long fint_min, fint_max;
307 unsigned long lpdiv_max; 307 unsigned long lpdiv_max;
308
309 unsigned scp_clk_refcount;
308} dsi; 310} dsi;
309 311
310#ifdef DEBUG 312#ifdef DEBUG
@@ -1073,6 +1075,18 @@ static int dsi_set_lp_clk_divisor(struct omap_dss_device *dssdev)
1073 return 0; 1075 return 0;
1074} 1076}
1075 1077
1078static void dsi_enable_scp_clk(void)
1079{
1080 if (dsi.scp_clk_refcount++ == 0)
1081 REG_FLD_MOD(DSI_CLK_CTRL, 1, 14, 14); /* CIO_CLK_ICG */
1082}
1083
1084static void dsi_disable_scp_clk(void)
1085{
1086 WARN_ON(dsi.scp_clk_refcount == 0);
1087 if (--dsi.scp_clk_refcount == 0)
1088 REG_FLD_MOD(DSI_CLK_CTRL, 0, 14, 14); /* CIO_CLK_ICG */
1089}
1076 1090
1077enum dsi_pll_power_state { 1091enum dsi_pll_power_state {
1078 DSI_PLL_POWER_OFF = 0x0, 1092 DSI_PLL_POWER_OFF = 0x0,
@@ -1458,6 +1472,10 @@ int dsi_pll_init(struct omap_dss_device *dssdev, bool enable_hsclk,
1458 1472
1459 enable_clocks(1); 1473 enable_clocks(1);
1460 dsi_enable_pll_clock(1); 1474 dsi_enable_pll_clock(1);
1475 /*
1476 * Note: SCP CLK is not required on OMAP3, but it is required on OMAP4.
1477 */
1478 dsi_enable_scp_clk();
1461 1479
1462 if (!dsi.vdds_dsi_enabled) { 1480 if (!dsi.vdds_dsi_enabled) {
1463 r = regulator_enable(dsi.vdds_dsi_reg); 1481 r = regulator_enable(dsi.vdds_dsi_reg);
@@ -1503,6 +1521,7 @@ err1:
1503 dsi.vdds_dsi_enabled = false; 1521 dsi.vdds_dsi_enabled = false;
1504 } 1522 }
1505err0: 1523err0:
1524 dsi_disable_scp_clk();
1506 enable_clocks(0); 1525 enable_clocks(0);
1507 dsi_enable_pll_clock(0); 1526 dsi_enable_pll_clock(0);
1508 return r; 1527 return r;
@@ -1510,9 +1529,6 @@ err0:
1510 1529
1511void dsi_pll_uninit(bool disconnect_lanes) 1530void dsi_pll_uninit(bool disconnect_lanes)
1512{ 1531{
1513 enable_clocks(0);
1514 dsi_enable_pll_clock(0);
1515
1516 dsi.pll_locked = 0; 1532 dsi.pll_locked = 0;
1517 dsi_pll_power(DSI_PLL_POWER_OFF); 1533 dsi_pll_power(DSI_PLL_POWER_OFF);
1518 if (disconnect_lanes) { 1534 if (disconnect_lanes) {
@@ -1520,6 +1536,11 @@ void dsi_pll_uninit(bool disconnect_lanes)
1520 regulator_disable(dsi.vdds_dsi_reg); 1536 regulator_disable(dsi.vdds_dsi_reg);
1521 dsi.vdds_dsi_enabled = false; 1537 dsi.vdds_dsi_enabled = false;
1522 } 1538 }
1539
1540 dsi_disable_scp_clk();
1541 enable_clocks(0);
1542 dsi_enable_pll_clock(0);
1543
1523 DSSDBG("PLL uninit done\n"); 1544 DSSDBG("PLL uninit done\n");
1524} 1545}
1525 1546
@@ -3611,8 +3632,7 @@ static int dsi_display_init_dsi(struct omap_dss_device *dssdev)
3611 int r; 3632 int r;
3612 3633
3613 /* The SCPClk is required for both PLL and CIO registers on OMAP4 */ 3634 /* The SCPClk is required for both PLL and CIO registers on OMAP4 */
3614 /* CIO_CLK_ICG, enable L3 clk to CIO */ 3635 dsi_enable_scp_clk();
3615 REG_FLD_MOD(DSI_CLK_CTRL, 1, 14, 14);
3616 3636
3617 _dsi_print_reset_status(); 3637 _dsi_print_reset_status();
3618 3638
@@ -3668,6 +3688,7 @@ err2:
3668err1: 3688err1:
3669 dsi_pll_uninit(true); 3689 dsi_pll_uninit(true);
3670err0: 3690err0:
3691 dsi_disable_scp_clk();
3671 return r; 3692 return r;
3672} 3693}
3673 3694
@@ -3688,6 +3709,7 @@ static void dsi_display_uninit_dsi(struct omap_dss_device *dssdev,
3688 dss_select_dsi_clk_source(OMAP_DSS_CLK_SRC_FCK); 3709 dss_select_dsi_clk_source(OMAP_DSS_CLK_SRC_FCK);
3689 dsi_cio_uninit(); 3710 dsi_cio_uninit();
3690 dsi_pll_uninit(disconnect_lanes); 3711 dsi_pll_uninit(disconnect_lanes);
3712 dsi_disable_scp_clk();
3691} 3713}
3692 3714
3693static int dsi_core_init(void) 3715static int dsi_core_init(void)
@@ -4013,6 +4035,7 @@ err_dsi:
4013static int omap_dsi1hw_remove(struct platform_device *pdev) 4035static int omap_dsi1hw_remove(struct platform_device *pdev)
4014{ 4036{
4015 dsi_exit(); 4037 dsi_exit();
4038 WARN_ON(dsi.scp_clk_refcount > 0);
4016 return 0; 4039 return 0;
4017} 4040}
4018 4041