Commit d3c56e2a authored by Dave Gerlach's avatar Dave Gerlach Committed by Tom Rini
Browse files

clk: ti: k3-pll: Change DIV_CTRL programming to read-modify-write

There are three different divider values in the DIV_CTRL register
controlled by the k3-pll driver. Currently the ti_pll_clk_set_rate
function writes the entire register when programming plld, even though
plld only resides in the lower 6 bits.

Change the plld programming to read-modify-write to only affect the
relevant bits for plld and to preserve the other two divider values
present in the upper 16 bits, otherwise they will always get set to zero
when programming plld.

Fixes: 0aa2930c

 ("clk: add support for TI K3 SoC PLL")
Signed-off-by: default avatarDave Gerlach <d-gerlach@ti.com>
parent ae8d3d23
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* /*
* Texas Instruments K3 SoC PLL clock driver * Texas Instruments K3 SoC PLL clock driver
* *
* Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/ * Copyright (C) 2020-2021 Texas Instruments Incorporated - http://www.ti.com/
* Tero Kristo <t-kristo@ti.com> * Tero Kristo <t-kristo@ti.com>
*/ */
...@@ -122,6 +122,7 @@ static ulong ti_pll_clk_set_rate(struct clk *clk, ulong rate) ...@@ -122,6 +122,7 @@ static ulong ti_pll_clk_set_rate(struct clk *clk, ulong rate)
unsigned long pllm; unsigned long pllm;
u32 pllfm = 0; u32 pllfm = 0;
unsigned long plld; unsigned long plld;
u32 div_ctrl;
u32 rem; u32 rem;
int shift; int shift;
...@@ -175,7 +176,15 @@ static ulong ti_pll_clk_set_rate(struct clk *clk, ulong rate) ...@@ -175,7 +176,15 @@ static ulong ti_pll_clk_set_rate(struct clk *clk, ulong rate)
writel(pllm, pll->reg + PLL_16FFT_FREQ_CTRL0); writel(pllm, pll->reg + PLL_16FFT_FREQ_CTRL0);
writel(pllfm, pll->reg + PLL_16FFT_FREQ_CTRL1); writel(pllfm, pll->reg + PLL_16FFT_FREQ_CTRL1);
writel(plld, pll->reg + PLL_16FFT_DIV_CTRL);
/*
* div_ctrl register contains other divider values, so rmw
* only plld and leave existing values alone
*/
div_ctrl = readl(pll->reg + PLL_16FFT_DIV_CTRL);
div_ctrl &= ~PLL_16FFT_DIV_CTRL_REF_DIV_MASK;
div_ctrl |= plld;
writel(div_ctrl, pll->reg + PLL_16FFT_DIV_CTRL);
ctrl &= ~PLL_16FFT_CTRL_BYPASS_EN; ctrl &= ~PLL_16FFT_CTRL_BYPASS_EN;
ctrl |= PLL_16FFT_CTRL_PLL_EN; ctrl |= PLL_16FFT_CTRL_PLL_EN;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment