Skip to content

Commit a4d023c

Browse files
Elaine Zhangrkhuangtao
authored andcommitted
clk: rockchip: Fix up the pll setting to support px30 SoC.
add px30 registers offset. add new pll type pll_px30 for px30 soc APLL. Change-Id: I321ba0d8dd45b90260cc7f22030ce905949ff762 Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
1 parent 0d451fd commit a4d023c

3 files changed

Lines changed: 83 additions & 1 deletion

File tree

drivers/clk/rockchip/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ obj-y += clk-muxgrf.o
1212
obj-y += clk-ddr.o
1313
obj-$(CONFIG_RESET_CONTROLLER) += softrst.o
1414

15+
obj-y += clk-px30.o
1516
obj-y += clk-rk3036.o
1617
obj-y += clk-rk3128.o
1718
obj-y += clk-rk3188.o

drivers/clk/rockchip/clk-pll.c

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,12 +421,32 @@ static int rockchip_rk3036_pll_set_params(struct rockchip_clk_pll *pll,
421421
rockchip_rk3036_pll_get_params(pll, &cur);
422422
cur.rate = 0;
423423

424+
if (pll->type == pll_px30) {
425+
writel_relaxed(HIWORD_UPDATE(1, PX30_BOOST_RECOVERY_MASK,
426+
PX30_BOOST_RECOVERY_SHIFT),
427+
pll->reg_base + PX30_BOOST_BOOST_CON);
428+
do {
429+
ret = readl_relaxed(pll->reg_base +
430+
PX30_BOOST_FSM_STATUS);
431+
} while (ret & PX30_BOOST_BUSY_STATE);
432+
writel_relaxed(HIWORD_UPDATE(1, PX30_BOOST_SW_CTRL_MASK,
433+
PX30_BOOST_SW_CTRL_SHIFT) |
434+
HIWORD_UPDATE(1, PX30_BOOST_LOW_FREQ_EN_MASK,
435+
PX30_BOOST_LOW_FREQ_EN_SHIFT),
436+
pll->reg_base + PX30_BOOST_BOOST_CON);
437+
}
438+
424439
cur_parent = pll_mux_ops->get_parent(&pll_mux->hw);
425440
if (cur_parent == PLL_MODE_NORM) {
426441
pll_mux_ops->set_parent(&pll_mux->hw, PLL_MODE_SLOW);
427442
rate_change_remuxed = 1;
428443
}
429444

445+
/* set pll power down */
446+
writel(HIWORD_UPDATE(1,
447+
RK3036_PLLCON1_PWRDOWN, 13),
448+
pll->reg_base + RK3036_PLLCON(1));
449+
430450
/* update pll values */
431451
writel_relaxed(HIWORD_UPDATE(rate->fbdiv, RK3036_PLLCON0_FBDIV_MASK,
432452
RK3036_PLLCON0_FBDIV_SHIFT) |
@@ -448,6 +468,16 @@ static int rockchip_rk3036_pll_set_params(struct rockchip_clk_pll *pll,
448468
pllcon |= rate->frac << RK3036_PLLCON2_FRAC_SHIFT;
449469
writel_relaxed(pllcon, pll->reg_base + RK3036_PLLCON(2));
450470

471+
if (pll->type == pll_px30) {
472+
writel_relaxed(HIWORD_UPDATE(0, PX30_BOOST_LOW_FREQ_EN_MASK,
473+
PX30_BOOST_LOW_FREQ_EN_SHIFT),
474+
pll->reg_base + PX30_BOOST_BOOST_CON);
475+
}
476+
477+
/* set pll power up */
478+
writel(HIWORD_UPDATE(0, RK3036_PLLCON1_PWRDOWN, 13),
479+
pll->reg_base + RK3036_PLLCON(1));
480+
451481
/* wait for the pll to lock */
452482
ret = rockchip_pll_wait_lock(pll);
453483
if (ret) {
@@ -459,6 +489,15 @@ static int rockchip_rk3036_pll_set_params(struct rockchip_clk_pll *pll,
459489
if (rate_change_remuxed)
460490
pll_mux_ops->set_parent(&pll_mux->hw, PLL_MODE_NORM);
461491

492+
if (pll->type == pll_px30) {
493+
writel_relaxed(HIWORD_UPDATE(0, PX30_BOOST_RECOVERY_MASK,
494+
PX30_BOOST_RECOVERY_SHIFT),
495+
pll->reg_base + PX30_BOOST_BOOST_CON);
496+
writel_relaxed(HIWORD_UPDATE(0, PX30_BOOST_SW_CTRL_MASK,
497+
PX30_BOOST_SW_CTRL_SHIFT),
498+
pll->reg_base + PX30_BOOST_BOOST_CON);
499+
}
500+
462501
return ret;
463502
}
464503

@@ -1303,7 +1342,8 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
13031342
pll_mux->lock = &ctx->lock;
13041343
pll_mux->hw.init = &init;
13051344

1306-
if (pll_type == pll_rk3036 ||
1345+
if (pll_type == pll_px30 ||
1346+
pll_type == pll_rk3036 ||
13071347
pll_type == pll_rk3066 ||
13081348
pll_type == pll_rk3328 ||
13091349
pll_type == pll_rk3366 ||
@@ -1355,6 +1395,7 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
13551395
}
13561396

13571397
switch (pll_type) {
1398+
case pll_px30:
13581399
case pll_rk3036:
13591400
case pll_rk3328:
13601401
if (!pll->rate_table)

drivers/clk/rockchip/clk.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,45 @@ struct clk;
3434
#define HIWORD_UPDATE(val, mask, shift) \
3535
((val) << (shift) | (mask) << ((shift) + 16))
3636

37+
#define PX30_PLL_CON(x) ((x) * 0x4)
38+
#define PX30_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
39+
#define PX30_CLKGATE_CON(x) ((x) * 0x4 + 0x200)
40+
#define PX30_GLB_SRST_FST 0xb8
41+
#define PX30_GLB_SRST_SND 0xbc
42+
#define PX30_SOFTRST_CON(x) ((x) * 0x4 + 0x300)
43+
#define PX30_MODE_CON 0xa0
44+
#define PX30_MISC_CON 0xa4
45+
#define PX30_SDMMC_CON0 0x380
46+
#define PX30_SDMMC_CON1 0x384
47+
#define PX30_SDIO_CON0 0x388
48+
#define PX30_SDIO_CON1 0x38c
49+
#define PX30_EMMC_CON0 0x390
50+
#define PX30_EMMC_CON1 0x394
51+
52+
#define PX30_PMU_PLL_CON(x) ((x) * 0x4)
53+
#define PX30_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x40)
54+
#define PX30_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x58)
55+
#define PX30_PMU_MODE 0x0020
56+
57+
#define PX30_BOOST_PLL_H_CON(x) ((x) * 0x4 + 0x8000)
58+
#define PX30_BOOST_CLK_CON 0x8008
59+
#define PX30_BOOST_BOOST_CON 0x800c
60+
#define PX30_BOOST_SWITCH_CNT 0x8010
61+
#define PX30_BOOST_HIGH_PERF_CNT0 0x8014
62+
#define PX30_BOOST_HIGH_PERF_CNT1 0x8018
63+
#define PX30_BOOST_STATIS_THRESHOLD 0x801c
64+
#define PX30_BOOST_SHORT_SWITCH_CNT 0x8020
65+
#define PX30_BOOST_SWITCH_THRESHOLD 0x8024
66+
#define PX30_BOOST_FSM_STATUS 0x8028
67+
#define PX30_BOOST_PLL_L_CON(x) ((x) * 0x4 + 0x802c)
68+
#define PX30_BOOST_RECOVERY_MASK 0x2
69+
#define PX30_BOOST_RECOVERY_SHIFT 1
70+
#define PX30_BOOST_SW_CTRL_MASK 0x4
71+
#define PX30_BOOST_SW_CTRL_SHIFT 2
72+
#define PX30_BOOST_LOW_FREQ_EN_MASK 0x8
73+
#define PX30_BOOST_LOW_FREQ_EN_SHIFT 3
74+
#define PX30_BOOST_BUSY_STATE BIT(8)
75+
3776
/* register positions shared by RK2928, RK3036, RK3066, RK3188 and RK3228 */
3877
#define RK2928_PLL_CON(x) ((x) * 0x4)
3978
#define RK2928_MODE_CON 0x40
@@ -134,6 +173,7 @@ struct clk;
134173
#define RK3399_PMU_GATEDIS_CON(x) ((x) * 0x4 + 0x130)
135174

136175
enum rockchip_pll_type {
176+
pll_px30,
137177
pll_rk3036,
138178
pll_rk3066,
139179
pll_rk3328,

0 commit comments

Comments
 (0)