|
@@ -269,6 +269,21 @@ static uint64_t zynq_slcr_compute_clock(const uint64_t periods[],
|
|
|
zynq_slcr_compute_clock((plls), (state)->regs[reg], \
|
|
|
reg ## _ ## enable_field ## _SHIFT)
|
|
|
|
|
|
+static void zynq_slcr_compute_clocks_internal(ZynqSLCRState *s, uint64_t ps_clk)
|
|
|
+{
|
|
|
+ uint64_t io_pll = zynq_slcr_compute_pll(ps_clk, s->regs[R_IO_PLL_CTRL]);
|
|
|
+ uint64_t arm_pll = zynq_slcr_compute_pll(ps_clk, s->regs[R_ARM_PLL_CTRL]);
|
|
|
+ uint64_t ddr_pll = zynq_slcr_compute_pll(ps_clk, s->regs[R_DDR_PLL_CTRL]);
|
|
|
+
|
|
|
+ uint64_t uart_mux[4] = {io_pll, io_pll, arm_pll, ddr_pll};
|
|
|
+
|
|
|
+ /* compute uartX reference clocks */
|
|
|
+ clock_set(s->uart0_ref_clk,
|
|
|
+ ZYNQ_COMPUTE_CLK(s, uart_mux, R_UART_CLK_CTRL, CLKACT0));
|
|
|
+ clock_set(s->uart1_ref_clk,
|
|
|
+ ZYNQ_COMPUTE_CLK(s, uart_mux, R_UART_CLK_CTRL, CLKACT1));
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* Compute and set the ouputs clocks periods.
|
|
|
* But do not propagate them further. Connected clocks
|
|
@@ -283,17 +298,7 @@ static void zynq_slcr_compute_clocks(ZynqSLCRState *s)
|
|
|
ps_clk = 0;
|
|
|
}
|
|
|
|
|
|
- uint64_t io_pll = zynq_slcr_compute_pll(ps_clk, s->regs[R_IO_PLL_CTRL]);
|
|
|
- uint64_t arm_pll = zynq_slcr_compute_pll(ps_clk, s->regs[R_ARM_PLL_CTRL]);
|
|
|
- uint64_t ddr_pll = zynq_slcr_compute_pll(ps_clk, s->regs[R_DDR_PLL_CTRL]);
|
|
|
-
|
|
|
- uint64_t uart_mux[4] = {io_pll, io_pll, arm_pll, ddr_pll};
|
|
|
-
|
|
|
- /* compute uartX reference clocks */
|
|
|
- clock_set(s->uart0_ref_clk,
|
|
|
- ZYNQ_COMPUTE_CLK(s, uart_mux, R_UART_CLK_CTRL, CLKACT0));
|
|
|
- clock_set(s->uart1_ref_clk,
|
|
|
- ZYNQ_COMPUTE_CLK(s, uart_mux, R_UART_CLK_CTRL, CLKACT1));
|
|
|
+ zynq_slcr_compute_clocks_internal(s, ps_clk);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -416,7 +421,7 @@ static void zynq_slcr_reset_hold(Object *obj)
|
|
|
ZynqSLCRState *s = ZYNQ_SLCR(obj);
|
|
|
|
|
|
/* will disable all output clocks */
|
|
|
- zynq_slcr_compute_clocks(s);
|
|
|
+ zynq_slcr_compute_clocks_internal(s, 0);
|
|
|
zynq_slcr_propagate_clocks(s);
|
|
|
}
|
|
|
|
|
@@ -425,7 +430,7 @@ static void zynq_slcr_reset_exit(Object *obj)
|
|
|
ZynqSLCRState *s = ZYNQ_SLCR(obj);
|
|
|
|
|
|
/* will compute output clocks according to ps_clk and registers */
|
|
|
- zynq_slcr_compute_clocks(s);
|
|
|
+ zynq_slcr_compute_clocks_internal(s, clock_get(s->ps_clk));
|
|
|
zynq_slcr_propagate_clocks(s);
|
|
|
}
|
|
|
|