Skip to content

Commit f1bc982

Browse files
tretterbebarino
authored andcommitted
soc: xilinx: vcu: implement PLL disable
The disabling of the PLL is not fully implemented, because according to the ZynqMP register reference the RESET, POR_IN and PWR_POR bits have to be set to bring the PLL into reset. Set the bits to disable the PLL. Signed-off-by: Michael Tretter <m.tretter@pengutronix.de> Acked-by: Michal Simek <michal.simek@xilinx.com> Link: https://lore.kernel.org/r/20210121071659.1226489-7-m.tretter@pengutronix.de Signed-off-by: Stephen Boyd <sboyd@kernel.org>
1 parent 354dcf7 commit f1bc982

1 file changed

Lines changed: 19 additions & 9 deletions

File tree

drivers/soc/xilinx/xlnx_vcu.c

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,10 @@ static int xvcu_pll_enable(struct xvcu_device *xvcu)
329329
return ret;
330330
}
331331

332+
xvcu_write_field_reg(base, VCU_PLL_CTRL,
333+
1, VCU_PLL_CTRL_BYPASS_MASK,
334+
VCU_PLL_CTRL_BYPASS_SHIFT);
335+
332336
vcu_pll_ctrl = xvcu_read(base, VCU_PLL_CTRL);
333337
vcu_pll_ctrl &= ~(VCU_PLL_CTRL_POR_IN_MASK <<
334338
VCU_PLL_CTRL_POR_IN_SHIFT);
@@ -340,15 +344,9 @@ static int xvcu_pll_enable(struct xvcu_device *xvcu)
340344
VCU_PLL_CTRL_PWR_POR_SHIFT;
341345
xvcu_write(base, VCU_PLL_CTRL, vcu_pll_ctrl);
342346

343-
xvcu_write_field_reg(base, VCU_PLL_CTRL,
344-
1, VCU_PLL_CTRL_BYPASS_MASK,
345-
VCU_PLL_CTRL_BYPASS_SHIFT);
346-
xvcu_write_field_reg(base, VCU_PLL_CTRL,
347-
1, VCU_PLL_CTRL_RESET_MASK,
348-
VCU_PLL_CTRL_RESET_SHIFT);
349-
xvcu_write_field_reg(base, VCU_PLL_CTRL,
350-
0, VCU_PLL_CTRL_RESET_MASK,
351-
VCU_PLL_CTRL_RESET_SHIFT);
347+
vcu_pll_ctrl &= ~(VCU_PLL_CTRL_RESET_MASK << VCU_PLL_CTRL_RESET_SHIFT);
348+
vcu_pll_ctrl |= (0 & VCU_PLL_CTRL_RESET_MASK) << VCU_PLL_CTRL_RESET_SHIFT;
349+
xvcu_write(base, VCU_PLL_CTRL, vcu_pll_ctrl);
352350

353351
ret = xvcu_pll_wait_for_lock(xvcu);
354352
if (ret) {
@@ -368,6 +366,18 @@ static int xvcu_pll_enable(struct xvcu_device *xvcu)
368366

369367
static void xvcu_pll_disable(struct xvcu_device *xvcu)
370368
{
369+
void __iomem *base = xvcu->vcu_slcr_ba;
370+
u32 vcu_pll_ctrl;
371+
372+
vcu_pll_ctrl = xvcu_read(base, VCU_PLL_CTRL);
373+
vcu_pll_ctrl &= ~(VCU_PLL_CTRL_POR_IN_MASK << VCU_PLL_CTRL_POR_IN_SHIFT);
374+
vcu_pll_ctrl |= (1 & VCU_PLL_CTRL_POR_IN_MASK) << VCU_PLL_CTRL_POR_IN_SHIFT;
375+
vcu_pll_ctrl &= ~(VCU_PLL_CTRL_PWR_POR_MASK << VCU_PLL_CTRL_PWR_POR_SHIFT);
376+
vcu_pll_ctrl |= (1 & VCU_PLL_CTRL_PWR_POR_MASK) << VCU_PLL_CTRL_PWR_POR_SHIFT;
377+
vcu_pll_ctrl &= ~(VCU_PLL_CTRL_RESET_MASK << VCU_PLL_CTRL_RESET_SHIFT);
378+
vcu_pll_ctrl |= (1 & VCU_PLL_CTRL_RESET_MASK) << VCU_PLL_CTRL_RESET_SHIFT;
379+
xvcu_write(base, VCU_PLL_CTRL, vcu_pll_ctrl);
380+
371381
clk_disable_unprepare(xvcu->pll_ref);
372382
}
373383

0 commit comments

Comments
 (0)