1 /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
3 * Copyright (c) 2018 Microsemi Corporation
7 #include <asm/regdef.h>
9 #define BASE_MACRO 0x600a0000
10 #define REG_OFFSET(t, o) (t + (o*4))
11 #define REG_MACRO(x) REG_OFFSET(BASE_MACRO, x)
12 #define BIT(nr) (1 << (nr))
14 #define MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0 REG_MACRO(6)
15 #define MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0_LOCK_STATUS BIT(0)
16 #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2 REG_MACRO(2)
17 #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0 REG_MACRO(0)
18 #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV (0x3F << 6)
19 #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV_ENC(x) (x << 6)
23 /* Make sure PLL is locked */
24 lw v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0
25 andi v1, v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0_LOCK_STATUS
29 /* Black magic from frontend */
31 sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2
34 sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2
37 sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2
40 sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2
43 2: lw v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0
44 andi v1, v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0_LOCK_STATUS
45 /* Keep looping if zero (no lock bit yet) */
49 /* Setup PLL CPU clock divider for 416MHz */
50 1: lw v0, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0
52 /* Keep reserved bits */
53 li v1, ~MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV
56 /* Set code 6 ~ 416.66 MHz */
57 ori v0, v0, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV_ENC(6)
59 sw v0, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0