summaryrefslogtreecommitdiff
path: root/drivers/clk
diff options
context:
space:
mode:
authorCasey Piper <cpiper@codeaurora.org>2014-09-18 15:43:58 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:41:26 -0700
commit65de9c3fb40bf71c38405fbfae6e327e4c9547e4 (patch)
tree6715da9b7109dcc9927dd1c5b1f091ecbede9625 /drivers/clk
parent81a55379823f2c14cf98827ff704fe459e17de8d (diff)
clk: qcom: mdss: Reduce delays in HDMI clock enable
Reducing delays in HDMI clock enable to prevent the thread from being held in the realtime process and hogging the CPU. Updated delays are provided after further hardware testing. With the added microsecond delay in the timout loop, C and PHY ready should occur well before timeout. Change-Id: Ib36a06e5309f3f8ba9e4013d08ca2ed108457beb Signed-off-by: Casey Piper <cpiper@codeaurora.org>
Diffstat (limited to 'drivers/clk')
-rw-r--r--drivers/clk/msm/mdss/mdss-hdmi-pll-20nm.c57
1 files changed, 23 insertions, 34 deletions
diff --git a/drivers/clk/msm/mdss/mdss-hdmi-pll-20nm.c b/drivers/clk/msm/mdss/mdss-hdmi-pll-20nm.c
index 4540106fa0a5..43a9aaef841d 100644
--- a/drivers/clk/msm/mdss/mdss-hdmi-pll-20nm.c
+++ b/drivers/clk/msm/mdss/mdss-hdmi-pll-20nm.c
@@ -808,7 +808,7 @@ static inline struct hdmi_pll_vco_clk *to_hdmi_20nm_vco_clk(struct clk *clk)
static u32 hdmi_20nm_phy_pll_set_clk_rate(struct clk *c, u32 tmds_clk)
{
- u32 clk_index, sleep;
+ u32 clk_index;
struct hdmi_pll_vco_clk *vco = to_hdmi_20nm_vco_clk(c);
struct mdss_pll_resources *io = vco->priv;
@@ -830,26 +830,22 @@ static u32 hdmi_20nm_phy_pll_set_clk_rate(struct clk *c, u32 tmds_clk)
/* Initially shut down PHY */
pr_debug("%s: Disabling PHY\n", __func__);
MDSS_PLL_REG_W(io->phy_base, HDMI_PHY_PD_CTL, 0x0);
- /* Hardware recommended delay */
- for (sleep = 0; sleep < 250; ++sleep)
- udelay(1000);
+ udelay(1000);
+ mb();
/* power-up and recommended common block settings */
MDSS_PLL_REG_W(io->phy_base, HDMI_PHY_PD_CTL, 0x1F);
MDSS_PLL_REG_W(io->phy_base, HDMI_PHY_CFG, 0x01);
- /* Hardware recommended delay */
- for (sleep = 0; sleep < 20; ++sleep)
- udelay(1000);
+ udelay(1000);
+ mb();
MDSS_PLL_REG_W(io->phy_base, HDMI_PHY_CFG, 0x07);
- /* Hardware recommended delay */
- for (sleep = 0; sleep < 20; ++sleep)
- udelay(1000);
+ udelay(1000);
+ mb();
MDSS_PLL_REG_W(io->phy_base, HDMI_PHY_CFG, 0x05);
- /* Hardware recommended delay */
- for (sleep = 0; sleep < 20; ++sleep)
- udelay(1000);
+ udelay(1000);
+ mb();
MDSS_PLL_REG_W(io->pll_base, QSERDES_COM_SYS_CLK_CTRL, 0x42);
MDSS_PLL_REG_W(io->pll_base, QSERDES_COM_PLL_VCOTAIL_EN, 0x03);
@@ -945,9 +941,8 @@ static u32 hdmi_20nm_phy_pll_set_clk_rate(struct clk *c, u32 tmds_clk)
MDSS_PLL_REG_W(io->pll_base, QSERDES_COM_RESETSM_CNTRL2, 0x07);
- /* Hardware recommended delay */
- for (sleep = 0; sleep < 100; ++sleep)
- udelay(1000);
+ udelay(1000);
+ mb();
MDSS_PLL_REG_W(io->phy_base, HDMI_PHY_MODE,
clk_settings[CALC_HDMI_PHY_MODE][clk_index]);
@@ -1009,26 +1004,23 @@ static u32 hdmi_20nm_phy_pll_set_clk_rate(struct clk *c, u32 tmds_clk)
static int hdmi_20nm_vco_enable(struct clk *c)
{
- u32 ready_poll, sleep;
+ u32 ready_poll;
u32 time_out_loop;
/* Hardware recommended timeout iterator */
- u32 time_out_max = 2500;
+ u32 time_out_max = 50000;
struct hdmi_pll_vco_clk *vco = to_hdmi_20nm_vco_clk(c);
struct mdss_pll_resources *io = vco->priv;
MDSS_PLL_REG_W(io->phy_base, HDMI_PHY_CFG, 0x00000000);
- /* Hardware recommended delay */
- for (sleep = 0; sleep < 100; ++sleep)
- udelay(1000);
+ udelay(1);
+ mb();
MDSS_PLL_REG_W(io->phy_base, HDMI_PHY_CFG, 0x00000003);
- /* Hardware recommended delay */
- for (sleep = 0; sleep < 100; ++sleep)
- udelay(1000);
+ udelay(1);
+ mb();
MDSS_PLL_REG_W(io->phy_base, HDMI_PHY_CFG, 0x00000009);
- /* Hardware recommended delay */
- for (sleep = 0; sleep < 100; ++sleep)
- udelay(1000);
+ udelay(1);
+ mb();
/* Poll for C_READY and PHY READY */
pr_debug("%s: Waiting for PHY Ready\n", __func__);
@@ -1036,9 +1028,9 @@ static int hdmi_20nm_vco_enable(struct clk *c)
do {
ready_poll = MDSS_PLL_REG_R(io->pll_base, QSERDES_COM_RESET_SM);
time_out_loop++;
+ udelay(1);
} while (((ready_poll & (1 << 6)) == 0) &&
(time_out_loop < time_out_max));
-
if (time_out_loop >= time_out_max)
pr_err("%s: ERROR: TIMED OUT BEFORE C READY\n", __func__);
else
@@ -1050,16 +1042,13 @@ static int hdmi_20nm_vco_enable(struct clk *c)
do {
ready_poll = MDSS_PLL_REG_R(io->phy_base, HDMI_PHY_STATUS);
time_out_loop++;
+ udelay(1);
} while (((ready_poll & 0x1) == 0) && (time_out_loop < time_out_max));
- if (time_out_loop >= time_out_max) {
+ if (time_out_loop >= time_out_max)
pr_err("%s: TIMED OUT BEFORE PHY READY\n", __func__);
- } else {
- /* Hardware recommended delay */
- for (sleep = 0; sleep < 250; ++sleep)
- udelay(1000);
+ else
pr_debug("%s: HDMI PHY READY\n", __func__);
- }
io->pll_on = true;