summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAnson Huang <Anson.Huang@nxp.com>2017-04-22 06:47:55 +0800
committerAnson Huang <Anson.Huang@nxp.com>2017-06-09 22:22:51 +0800
commit90ab3c365afd8c612360077f1d5b332b93ba0e25 (patch)
treee8108b5a432c5b44278b8a4d71ea4e763a667528 /drivers
parent38e29e8c9fbba0edbf0fd65cbfa2a7a69387934b (diff)
MGS-2842 ARM: imx: correct PFD setting rate flow
According to design, PFD needs to be gated before setting rate, this patch adds warning for PFD when there is any try to set PFD rate with gate open; Since PFD may be enabled during kernel boot up, here doing enable and disable before setting APLL_PFD2 rate is to make sure it is gated by clock framework before setting rate. Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/imx/clk-imx7ulp.c6
-rw-r--r--drivers/clk/imx/clk-pfdv2.c4
2 files changed, 9 insertions, 1 deletions
diff --git a/drivers/clk/imx/clk-imx7ulp.c b/drivers/clk/imx/clk-imx7ulp.c
index ab1403af2a50..0de0b161a1e3 100644
--- a/drivers/clk/imx/clk-imx7ulp.c
+++ b/drivers/clk/imx/clk-imx7ulp.c
@@ -183,7 +183,11 @@ static void __init imx7ulp_clocks_init(struct device_node *scg_node)
imx_clk_prepare_enable(clks[clks_init_on[i]]);
imx_clk_set_parent(clks[IMX7ULP_CLK_GPU2D], clks[IMX7ULP_CLK_APLL_PFD2]);
imx_clk_set_parent(clks[IMX7ULP_CLK_GPU3D], clks[IMX7ULP_CLK_APLL_PFD2]);
- imx_clk_set_rate(clks[IMX7ULP_CLK_APLL_PFD2], 350000000);
+
+ /* make sure PFD is gated before setting its rate */
+ clk_prepare_enable(clks[IMX7ULP_CLK_APLL_PFD2]);
+ clk_disable_unprepare(clks[IMX7ULP_CLK_APLL_PFD2]);
+ imx_clk_set_rate(clks[IMX7ULP_CLK_APLL_PFD2], 350000000);
pr_info("i.MX7ULP clock tree init done.\n");
}
diff --git a/drivers/clk/imx/clk-pfdv2.c b/drivers/clk/imx/clk-pfdv2.c
index ba0d4092fda5..b74f0809a03b 100644
--- a/drivers/clk/imx/clk-pfdv2.c
+++ b/drivers/clk/imx/clk-pfdv2.c
@@ -103,6 +103,10 @@ static int clk_pfd_set_rate(struct clk_hw *hw, unsigned long rate,
u32 val;
u8 frac;
+ /* PFD can NOT change rate without gating */
+ WARN_ON(!(readl_relaxed(pfd->reg) &
+ (1 << ((pfd->idx + 1) * 8 - 1))));
+
tmp = tmp * 18 + rate / 2;
do_div(tmp, rate);
frac = tmp;