Skip to content

Commit b6ec400

Browse files
rockosovjbrun3t
authored andcommitted
clk: meson: introduce new pll power-on sequence for A1 SoC family
Modern meson PLL IPs are a little bit different from early known PLLs. The main difference is located in the init/enable/disable sequences; the rate logic is the same. In A1 PLL, the PLL enable sequence is different, so add new optional pll reg bits and use the new power-on sequence to enable the PLL: 1. enable the pll, delay for 10us 2. enable the pll self-adaption current module, delay for 40us 3. enable the lock detect module Signed-off-by: Jian Hu <jian.hu@amlogic.com> Acked-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Signed-off-by: Dmitry Rokosov <ddrokosov@sberdevices.ru> Link: https://lore.kernel.org/r/20230523135351.19133-3-ddrokosov@sberdevices.ru Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
1 parent 02f1e17 commit b6ec400

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

drivers/clk/meson/clk-pll.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,25 @@ static int meson_clk_pll_enable(struct clk_hw *hw)
358358
if (MESON_PARM_APPLICABLE(&pll->rst))
359359
meson_parm_write(clk->map, &pll->rst, 0);
360360

361+
/*
362+
* Compared with the previous SoCs, self-adaption current module
363+
* is newly added for A1, keep the new power-on sequence to enable the
364+
* PLL. The sequence is:
365+
* 1. enable the pll, delay for 10us
366+
* 2. enable the pll self-adaption current module, delay for 40us
367+
* 3. enable the lock detect module
368+
*/
369+
if (MESON_PARM_APPLICABLE(&pll->current_en)) {
370+
usleep_range(10, 20);
371+
meson_parm_write(clk->map, &pll->current_en, 1);
372+
usleep_range(40, 50);
373+
};
374+
375+
if (MESON_PARM_APPLICABLE(&pll->l_detect)) {
376+
meson_parm_write(clk->map, &pll->l_detect, 1);
377+
meson_parm_write(clk->map, &pll->l_detect, 0);
378+
}
379+
361380
if (meson_clk_pll_wait_lock(hw))
362381
return -EIO;
363382

@@ -375,6 +394,10 @@ static void meson_clk_pll_disable(struct clk_hw *hw)
375394

376395
/* Disable the pll */
377396
meson_parm_write(clk->map, &pll->en, 0);
397+
398+
/* Disable PLL internal self-adaption current module */
399+
if (MESON_PARM_APPLICABLE(&pll->current_en))
400+
meson_parm_write(clk->map, &pll->current_en, 0);
378401
}
379402

380403
static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,

drivers/clk/meson/clk-pll.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ struct meson_clk_pll_data {
3636
struct parm frac;
3737
struct parm l;
3838
struct parm rst;
39+
struct parm current_en;
40+
struct parm l_detect;
3941
const struct reg_sequence *init_regs;
4042
unsigned int init_count;
4143
const struct pll_params_table *table;

0 commit comments

Comments
 (0)