msm_fb: display: Fix DSI PLL/clock warnings
CRs-Fixed: 300073
Signed-off-by: Nagamalleswararao Ganji <nganji@codeaurora.org>
diff --git a/drivers/video/msm/mdp4_overlay_dsi_cmd.c b/drivers/video/msm/mdp4_overlay_dsi_cmd.c
index 9d00d80..433ac23 100644
--- a/drivers/video/msm/mdp4_overlay_dsi_cmd.c
+++ b/drivers/video/msm/mdp4_overlay_dsi_cmd.c
@@ -61,7 +61,7 @@
if (mipi_dsi_clk_on) {
if (dsi_state == ST_DSI_PLAYING) {
mdp4_stat.dsi_clkoff++;
- mipi_dsi_clk_disable();
+ mipi_dsi_turn_off_clks();
mdp4_overlay_dsi_state_set(ST_DSI_CLK_OFF);
}
}
@@ -577,7 +577,7 @@
/* satrt dsi clock if necessary */
if (mipi_dsi_clk_on == 0) {
local_bh_disable();
- mipi_dsi_clk_enable();
+ mipi_dsi_turn_on_clks();
local_bh_enable();
}
diff --git a/drivers/video/msm/mdp_dma.c b/drivers/video/msm/mdp_dma.c
index a78c0db..f9f7954 100644
--- a/drivers/video/msm/mdp_dma.c
+++ b/drivers/video/msm/mdp_dma.c
@@ -302,7 +302,7 @@
spin_lock_irqsave(&mdp_spin_lock, flag);
#ifdef DSI_CLK_CTRL
if (mipi_dsi_clk_on == 0)
- mipi_dsi_clk_enable();
+ mipi_dsi_turn_on_clks();
#endif
if (mfd->dma->busy == TRUE) {
diff --git a/drivers/video/msm/mipi_dsi.c b/drivers/video/msm/mipi_dsi.c
index efa5b41..b8963e4 100644
--- a/drivers/video/msm/mipi_dsi.c
+++ b/drivers/video/msm/mipi_dsi.c
@@ -113,13 +113,19 @@
#ifdef CONFIG_MSM_BUS_SCALING
mdp_bus_scale_update_request(0);
#endif
+
+ local_bh_disable();
+ mipi_dsi_clk_disable();
+ local_bh_enable();
+
/* disbale dsi engine */
MIPI_OUTP(MIPI_DSI_BASE + 0x0000, 0);
mipi_dsi_phy_ctrl(0);
+
local_bh_disable();
- mipi_dsi_clk_disable();
+ mipi_dsi_ahb_ctrl(0);
local_bh_enable();
if (mipi_dsi_pdata && mipi_dsi_pdata->dsi_power_save)
@@ -157,12 +163,13 @@
if (mipi_dsi_pdata && mipi_dsi_pdata->dsi_power_save)
mipi_dsi_pdata->dsi_power_save(1);
+ local_bh_disable();
+ mipi_dsi_ahb_ctrl(1);
+ local_bh_enable();
+
clk_rate = mfd->fbi->var.pixclock;
clk_rate = min(clk_rate, mfd->panel_info.clk_max);
- local_bh_disable();
- mipi_dsi_clk_enable();
- local_bh_enable();
#ifndef CONFIG_FB_MSM_MDP303
mdp4_overlay_dsi_state_set(ST_DSI_RESUME);
@@ -187,6 +194,10 @@
mipi_dsi_phy_init(0, &(mfd->panel_info), target_type);
+ local_bh_disable();
+ mipi_dsi_clk_enable();
+ local_bh_enable();
+
mipi = &mfd->panel_info.mipi;
if (mfd->panel_info.type == MIPI_VIDEO_PANEL) {
dummy_xres = mfd->panel_info.mipi.xres_pad;
diff --git a/drivers/video/msm/mipi_dsi.h b/drivers/video/msm/mipi_dsi.h
index ec48856..24474c8 100644
--- a/drivers/video/msm/mipi_dsi.h
+++ b/drivers/video/msm/mipi_dsi.h
@@ -279,6 +279,9 @@
uint32 *expected_dsi_pclk);
void mipi_dsi_clk_init(struct device *dev);
void mipi_dsi_clk_deinit(struct device *dev);
+void mipi_dsi_ahb_ctrl(u32 enable);
+void mipi_dsi_turn_on_clks(void);
+void mipi_dsi_turn_off_clks(void);
#ifdef CONFIG_FB_MSM_MDP303
void update_lane_config(struct msm_panel_info *pinfo);
diff --git a/drivers/video/msm/mipi_dsi_host.c b/drivers/video/msm/mipi_dsi_host.c
index b6e7bb4..3ce2274 100644
--- a/drivers/video/msm/mipi_dsi_host.c
+++ b/drivers/video/msm/mipi_dsi_host.c
@@ -39,6 +39,7 @@
#include "mdp.h"
#include "mdp4.h"
+int mipi_dsi_clk_on;
static struct completion dsi_dma_comp;
static struct dsi_buf dsi_tx_buf;
static int dsi_irq_enabled;
@@ -105,6 +106,32 @@
spin_unlock(&dsi_lock);
}
+void mipi_dsi_turn_on_clks(void)
+{
+ if (mipi_dsi_clk_on) {
+ pr_err("%s: mipi_dsi_clks already ON\n", __func__);
+ return;
+ }
+ mipi_dsi_clk_on = 1;
+ local_bh_disable();
+ mipi_dsi_ahb_ctrl(1);
+ mipi_dsi_clk_enable();
+ local_bh_enable();
+}
+
+void mipi_dsi_turn_off_clks(void)
+{
+ if (mipi_dsi_clk_on == 0) {
+ pr_err("%s: mipi_dsi_clks already OFF\n", __func__);
+ return;
+ }
+ mipi_dsi_clk_on = 0;
+ local_bh_disable();
+ mipi_dsi_clk_disable();
+ mipi_dsi_ahb_ctrl(0);
+ local_bh_enable();
+}
+
static void mipi_dsi_action(struct list_head *act_list)
{
struct list_head *lp;
diff --git a/drivers/video/msm/msm_dss_io_7x27a.c b/drivers/video/msm/msm_dss_io_7x27a.c
index fb7476c..2de4d69 100644
--- a/drivers/video/msm/msm_dss_io_7x27a.c
+++ b/drivers/video/msm/msm_dss_io_7x27a.c
@@ -19,7 +19,6 @@
char *mmss_sfpb_base;
void __iomem *periph_base;
-int mipi_dsi_clk_on;
static struct dsi_clk_desc dsicore_clk;
static struct dsi_clk_desc dsi_pclk;
@@ -292,56 +291,55 @@
MIPI_OUTP(MIPI_DSI_BASE + 0x100, 0x67);
/* pll ctrl 0 */
- MIPI_OUTP(MIPI_DSI_BASE + 0x200, pd->pll[0]);
+ MIPI_OUTP(MIPI_DSI_BASE + 0x0200, pd->pll[0]);
wmb();
- MIPI_OUTP(MIPI_DSI_BASE + 0x200, (pd->pll[0] | 0x01));
+}
+
+void mipi_dsi_ahb_ctrl(u32 enable)
+{
+ if (enable) {
+ clk_enable(ahb_m_clk);
+ clk_enable(ahb_s_clk);
+ } else {
+ clk_disable(ahb_m_clk);
+ clk_disable(ahb_s_clk);
+ }
}
void mipi_dsi_clk_enable(void)
{
unsigned data = 0;
-
- if (mipi_dsi_clk_on) {
- pr_err("%s: mipi_dsi_clk already ON\n", __func__);
- return;
- }
-
- mipi_dsi_clk_on = 1;
+ uint32 pll_ctrl;
if (clk_set_min_rate(ebi1_dsi_clk, 65000000)) /* 65 MHz */
pr_err("%s: ebi1_dsi_clk set rate failed\n", __func__);
clk_enable(ebi1_dsi_clk);
- clk_enable(dsi_ref_clk);
+
+ pll_ctrl = MIPI_INP(MIPI_DSI_BASE + 0x0200);
+ MIPI_OUTP(MIPI_DSI_BASE + 0x0200, pll_ctrl | 0x01);
+ mb();
+
clk_set_rate(dsi_byte_div_clk, data);
clk_set_rate(dsi_esc_clk, data);
- clk_enable(mdp_dsi_pclk);
- clk_enable(ahb_m_clk);
- clk_enable(ahb_s_clk);
- clk_enable(dsi_byte_div_clk);
- clk_enable(dsi_esc_clk);
mipi_dsi_pclk_ctrl(&dsi_pclk, 1);
mipi_dsi_clk_ctrl(&dsicore_clk, 1);
+
+ clk_enable(dsi_ref_clk);
+ clk_enable(mdp_dsi_pclk);
+ clk_enable(dsi_byte_div_clk);
+ clk_enable(dsi_esc_clk);
}
void mipi_dsi_clk_disable(void)
{
- if (mipi_dsi_clk_on == 0) {
- pr_err("%s: mipi_dsi_clk already OFF\n", __func__);
- return;
- }
-
- mipi_dsi_clk_on = 0;
-
- MIPI_OUTP(MIPI_DSI_BASE + 0x0118, 0);
-
- mipi_dsi_pclk_ctrl(&dsi_pclk, 0);
- mipi_dsi_clk_ctrl(&dsicore_clk, 0);
clk_disable(dsi_esc_clk);
clk_disable(dsi_byte_div_clk);
clk_disable(mdp_dsi_pclk);
- clk_disable(ahb_m_clk);
- clk_disable(ahb_s_clk);
clk_disable(dsi_ref_clk);
+ mipi_dsi_pclk_ctrl(&dsi_pclk, 0);
+ mipi_dsi_clk_ctrl(&dsicore_clk, 0);
+ /* DSIPHY_PLL_CTRL_0, disable dsi pll */
+ MIPI_OUTP(MIPI_DSI_BASE + 0x0200, 0x40);
if (clk_set_min_rate(ebi1_dsi_clk, 0))
pr_err("%s: ebi1_dsi_clk set rate failed\n", __func__);
clk_disable(ebi1_dsi_clk);
@@ -377,10 +375,7 @@
/* DSIPHY_CTRL_1 */
MIPI_OUTP(MIPI_DSI_BASE + 0x0294, 0x7f);
- /* DSIPHY_PLL_CTRL_0, disbale dsi pll */
- MIPI_OUTP(MIPI_DSI_BASE + 0x0200, 0x40);
-
- /* disbale dsi clk */
+ /* disable dsi clk */
MIPI_OUTP(MIPI_DSI_BASE + 0x0118, 0);
}
}
diff --git a/drivers/video/msm/msm_dss_io_8960.c b/drivers/video/msm/msm_dss_io_8960.c
index 8e2c10f..ba93df76 100644
--- a/drivers/video/msm/msm_dss_io_8960.c
+++ b/drivers/video/msm/msm_dss_io_8960.c
@@ -50,7 +50,6 @@
char *mmss_sfpb_base;
void __iomem *periph_base;
-int mipi_dsi_clk_on;
static struct dsi_clk_desc dsicore_clk;
static struct dsi_clk_desc dsi_pclk;
@@ -513,11 +512,8 @@
/* pll ctrl 0 */
MIPI_OUTP(MIPI_DSI_BASE + 0x200, pd->pll[0]);
wmb();
- MIPI_OUTP(MIPI_DSI_BASE + 0x200, (pd->pll[0] | 0x01));
- mipi_dsi_phy_rdy_poll();
-
- off = 0x0440; /* phy timig ctrl 0 - 11 */
+ off = 0x0440; /* phy timing ctrl 0 - 11 */
for (i = 0; i < 12; i++) {
MIPI_OUTP(MIPI_DSI_BASE + off, pd->timing[i]);
wmb();
@@ -528,50 +524,47 @@
mipi_dsi_configure_serdes();
}
+void mipi_dsi_ahb_ctrl(u32 enable)
+{
+ if (enable) {
+ clk_enable(amp_pclk); /* clock for AHB-master to AXI */
+ clk_enable(dsi_m_pclk);
+ clk_enable(dsi_s_pclk);
+ mipi_dsi_ahb_en();
+ mipi_dsi_sfpb_cfg();
+ } else {
+ clk_disable(dsi_m_pclk);
+ clk_disable(dsi_s_pclk);
+ clk_disable(amp_pclk); /* clock for AHB-master to AXI */
+ }
+}
+
void mipi_dsi_clk_enable(void)
{
- if (mipi_dsi_clk_on) {
- pr_err("%s: mipi_dsi_clk already ON\n", __func__);
- return;
- }
+ u32 pll_ctrl = MIPI_INP(MIPI_DSI_BASE + 0x0200);
+ MIPI_OUTP(MIPI_DSI_BASE + 0x0200, pll_ctrl | 0x01);
+ mipi_dsi_phy_rdy_poll();
- mipi_dsi_clk_on = 1;
-
- clk_enable(amp_pclk); /* clock for AHB-master to AXI */
- clk_enable(dsi_m_pclk);
- clk_enable(dsi_s_pclk);
if (clk_set_rate(dsi_byte_div_clk, 1) < 0) /* divided by 1 */
pr_err("%s: dsi_byte_div_clk - "
"clk_set_rate failed\n", __func__);
if (clk_set_rate(dsi_esc_clk, 2) < 0) /* divided by 2 */
pr_err("%s: dsi_esc_clk - "
"clk_set_rate failed\n", __func__);
- clk_enable(dsi_byte_div_clk);
- clk_enable(dsi_esc_clk);
mipi_dsi_pclk_ctrl(&dsi_pclk, 1);
mipi_dsi_clk_ctrl(&dsicore_clk, 1);
- mipi_dsi_ahb_en();
- mipi_dsi_sfpb_cfg();
+ clk_enable(dsi_byte_div_clk);
+ clk_enable(dsi_esc_clk);
}
void mipi_dsi_clk_disable(void)
{
- if (mipi_dsi_clk_on == 0) {
- pr_err("%s: mipi_dsi_clk already OFF\n", __func__);
- return;
- }
-
- mipi_dsi_clk_on = 0;
-
- MIPI_OUTP(MIPI_DSI_BASE + 0x0118, 0);
-
- mipi_dsi_pclk_ctrl(&dsi_pclk, 0);
- mipi_dsi_clk_ctrl(&dsicore_clk, 0);
clk_disable(dsi_esc_clk);
clk_disable(dsi_byte_div_clk);
- clk_disable(dsi_m_pclk);
- clk_disable(dsi_s_pclk);
- clk_disable(amp_pclk); /* clock for AHB-master to AXI */
+ mipi_dsi_pclk_ctrl(&dsi_pclk, 0);
+ mipi_dsi_clk_ctrl(&dsicore_clk, 0);
+ /* DSIPHY_PLL_CTRL_0, disable dsi pll */
+ MIPI_OUTP(MIPI_DSI_BASE + 0x0200, 0x0);
}
void mipi_dsi_phy_ctrl(int on)
@@ -592,10 +585,7 @@
/* DSIPHY_CTRL_1 */
MIPI_OUTP(MIPI_DSI_BASE + 0x0474, 0x7f);
- /* DSIPHY_PLL_CTRL_0, disbale dsi pll */
- MIPI_OUTP(MIPI_DSI_BASE + 0x0200, 0x40);
-
- /* disbale dsi clk */
+ /* disable dsi clk */
MIPI_OUTP(MIPI_DSI_BASE + 0x0118, 0);
}
}
diff --git a/drivers/video/msm/msm_dss_io_8x60.c b/drivers/video/msm/msm_dss_io_8x60.c
index 51120a3..0daf727 100644
--- a/drivers/video/msm/msm_dss_io_8x60.c
+++ b/drivers/video/msm/msm_dss_io_8x60.c
@@ -23,7 +23,6 @@
char *mmss_sfpb_base;
void __iomem *periph_base;
-int mipi_dsi_clk_on;
static struct dsi_clk_desc dsicore_clk;
static struct dsi_clk_desc dsi_pclk;
@@ -389,49 +388,46 @@
/* pll ctrl 0 */
MIPI_OUTP(MIPI_DSI_BASE + 0x200, pd->pll[0]);
wmb();
- MIPI_OUTP(MIPI_DSI_BASE + 0x200, (pd->pll[0] | 0x01));
+}
+
+void mipi_dsi_ahb_ctrl(u32 enable)
+{
+ if (enable) {
+ clk_enable(amp_pclk); /* clock for AHB-master to AXI */
+ clk_enable(dsi_m_pclk);
+ clk_enable(dsi_s_pclk);
+ mipi_dsi_ahb_en();
+ mipi_dsi_sfpb_cfg();
+ } else {
+ clk_disable(dsi_m_pclk);
+ clk_disable(dsi_s_pclk);
+ clk_disable(amp_pclk); /* clock for AHB-master to AXI */
+ }
}
void mipi_dsi_clk_enable(void)
{
- if (mipi_dsi_clk_on) {
- pr_err("%s: mipi_dsi_clk already ON\n", __func__);
- return;
- }
+ u32 pll_ctrl = MIPI_INP(MIPI_DSI_BASE + 0x0200);
+ MIPI_OUTP(MIPI_DSI_BASE + 0x0200, pll_ctrl | 0x01);
+ mb();
- mipi_dsi_clk_on = 1;
-
- clk_enable(amp_pclk); /* clock for AHB-master to AXI */
- clk_enable(dsi_m_pclk);
- clk_enable(dsi_s_pclk);
if (clk_set_rate(dsi_byte_div_clk, 1) < 0) /* divided by 1 */
pr_err("%s: clk_set_rate failed\n", __func__);
- clk_enable(dsi_byte_div_clk);
- clk_enable(dsi_esc_clk);
mipi_dsi_pclk_ctrl(&dsi_pclk, 1);
mipi_dsi_clk_ctrl(&dsicore_clk, 1);
- mipi_dsi_ahb_en();
- mipi_dsi_sfpb_cfg();
+ clk_enable(dsi_byte_div_clk);
+ clk_enable(dsi_esc_clk);
}
void mipi_dsi_clk_disable(void)
{
- if (mipi_dsi_clk_on == 0) {
- pr_err("%s: mipi_dsi_clk already OFF\n", __func__);
- return;
- }
-
- mipi_dsi_clk_on = 0;
-
- MIPI_OUTP(MIPI_DSI_BASE + 0x0118, 0);
+ clk_disable(dsi_esc_clk);
+ clk_disable(dsi_byte_div_clk);
mipi_dsi_pclk_ctrl(&dsi_pclk, 0);
mipi_dsi_clk_ctrl(&dsicore_clk, 0);
- clk_disable(dsi_esc_clk);
- clk_disable(dsi_byte_div_clk);
- clk_disable(dsi_m_pclk);
- clk_disable(dsi_s_pclk);
- clk_disable(amp_pclk); /* clock for AHB-master to AXI */
+ /* DSIPHY_PLL_CTRL_0, disable dsi pll */
+ MIPI_OUTP(MIPI_DSI_BASE + 0x0200, 0x40);
}
void mipi_dsi_phy_ctrl(int on)
@@ -464,10 +460,7 @@
/* DSIPHY_CTRL_1 */
MIPI_OUTP(MIPI_DSI_BASE + 0x0294, 0x7f);
- /* DSIPHY_PLL_CTRL_0, disbale dsi pll */
- MIPI_OUTP(MIPI_DSI_BASE + 0x0200, 0x40);
-
- /* disbale dsi clk */
+ /* disable dsi clk */
MIPI_OUTP(MIPI_DSI_BASE + 0x0118, 0);
}
}