unsigned long regm_dispc_max, regm_dsi_max;
unsigned long fint_min, fint_max;
unsigned long lpdiv_max;
+
+ unsigned scp_clk_refcount;
} dsi;
#ifdef DEBUG
return 0;
}
+static void dsi_enable_scp_clk(void)
+{
+ if (dsi.scp_clk_refcount++ == 0)
+ REG_FLD_MOD(DSI_CLK_CTRL, 1, 14, 14); /* CIO_CLK_ICG */
+}
+
+static void dsi_disable_scp_clk(void)
+{
+ WARN_ON(dsi.scp_clk_refcount == 0);
+ if (--dsi.scp_clk_refcount == 0)
+ REG_FLD_MOD(DSI_CLK_CTRL, 0, 14, 14); /* CIO_CLK_ICG */
+}
enum dsi_pll_power_state {
DSI_PLL_POWER_OFF = 0x0,
enable_clocks(1);
dsi_enable_pll_clock(1);
+ /*
+ * Note: SCP CLK is not required on OMAP3, but it is required on OMAP4.
+ */
+ dsi_enable_scp_clk();
if (!dsi.vdds_dsi_enabled) {
r = regulator_enable(dsi.vdds_dsi_reg);
dsi.vdds_dsi_enabled = false;
}
err0:
+ dsi_disable_scp_clk();
enable_clocks(0);
dsi_enable_pll_clock(0);
return r;
void dsi_pll_uninit(bool disconnect_lanes)
{
- enable_clocks(0);
- dsi_enable_pll_clock(0);
-
dsi.pll_locked = 0;
dsi_pll_power(DSI_PLL_POWER_OFF);
if (disconnect_lanes) {
regulator_disable(dsi.vdds_dsi_reg);
dsi.vdds_dsi_enabled = false;
}
+
+ dsi_disable_scp_clk();
+ enable_clocks(0);
+ dsi_enable_pll_clock(0);
+
DSSDBG("PLL uninit done\n");
}
int r;
/* The SCPClk is required for both PLL and CIO registers on OMAP4 */
- /* CIO_CLK_ICG, enable L3 clk to CIO */
- REG_FLD_MOD(DSI_CLK_CTRL, 1, 14, 14);
+ dsi_enable_scp_clk();
_dsi_print_reset_status();
err1:
dsi_pll_uninit(true);
err0:
+ dsi_disable_scp_clk();
return r;
}
dss_select_dsi_clk_source(OMAP_DSS_CLK_SRC_FCK);
dsi_cio_uninit();
dsi_pll_uninit(disconnect_lanes);
+ dsi_disable_scp_clk();
}
static int dsi_core_init(void)
static int omap_dsi1hw_remove(struct platform_device *pdev)
{
dsi_exit();
+ WARN_ON(dsi.scp_clk_refcount > 0);
return 0;
}