mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 05:06:29 +00:00
clk: meson: add 'NOINIT_ENABLED' flag to eliminate init for enabled PLL
When dealing with certain PLLs, it is necessary to avoid modifying them if they have already been initialized by lower levels. For instance, in the A1 SoC Family, the sys_pll is enabled as the parent for the cpuclk, and it cannot be disabled during the initialization sequence. Therefore, initialization phase must be skipped. Signed-off-by: Dmitry Rokosov <ddrokosov@salutedevices.com> Link: https://lore.kernel.org/r/20240515185103.20256-2-ddrokosov@salutedevices.com Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
This commit is contained in:
parent
f06ac3ed04
commit
d4c83ac16c
@ -289,25 +289,6 @@ static int meson_clk_pll_wait_lock(struct clk_hw *hw)
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static int meson_clk_pll_init(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_regmap *clk = to_clk_regmap(hw);
|
||||
struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
|
||||
|
||||
if (pll->init_count) {
|
||||
if (MESON_PARM_APPLICABLE(&pll->rst))
|
||||
meson_parm_write(clk->map, &pll->rst, 1);
|
||||
|
||||
regmap_multi_reg_write(clk->map, pll->init_regs,
|
||||
pll->init_count);
|
||||
|
||||
if (MESON_PARM_APPLICABLE(&pll->rst))
|
||||
meson_parm_write(clk->map, &pll->rst, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int meson_clk_pll_is_enabled(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_regmap *clk = to_clk_regmap(hw);
|
||||
@ -324,6 +305,33 @@ static int meson_clk_pll_is_enabled(struct clk_hw *hw)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int meson_clk_pll_init(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_regmap *clk = to_clk_regmap(hw);
|
||||
struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
|
||||
|
||||
/*
|
||||
* Keep the clock running, which was already initialized and enabled
|
||||
* from the bootloader stage, to avoid any glitches.
|
||||
*/
|
||||
if ((pll->flags & CLK_MESON_PLL_NOINIT_ENABLED) &&
|
||||
meson_clk_pll_is_enabled(hw))
|
||||
return 0;
|
||||
|
||||
if (pll->init_count) {
|
||||
if (MESON_PARM_APPLICABLE(&pll->rst))
|
||||
meson_parm_write(clk->map, &pll->rst, 1);
|
||||
|
||||
regmap_multi_reg_write(clk->map, pll->init_regs,
|
||||
pll->init_count);
|
||||
|
||||
if (MESON_PARM_APPLICABLE(&pll->rst))
|
||||
meson_parm_write(clk->map, &pll->rst, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int meson_clk_pcie_pll_enable(struct clk_hw *hw)
|
||||
{
|
||||
int retries = 10;
|
||||
|
@ -28,6 +28,7 @@ struct pll_mult_range {
|
||||
}
|
||||
|
||||
#define CLK_MESON_PLL_ROUND_CLOSEST BIT(0)
|
||||
#define CLK_MESON_PLL_NOINIT_ENABLED BIT(1)
|
||||
|
||||
struct meson_clk_pll_data {
|
||||
struct parm en;
|
||||
|
Loading…
Reference in New Issue
Block a user