/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ /* * Copyright (c) 2018 Microsemi Corporation */ #include #include #define BASE_MACRO 0x600a0000 #define REG_OFFSET(t, o) (t + (o*4)) #define REG_MACRO(x) REG_OFFSET(BASE_MACRO, x) #define BIT(nr) (1 << (nr)) #define MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0 REG_MACRO(6) #define MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0_LOCK_STATUS BIT(0) #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2 REG_MACRO(2) #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0 REG_MACRO(0) #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV (0x3F << 6) #define MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV_ENC(x) (x << 6) .set noreorder LEAF(pll_init) /* Make sure PLL is locked */ lw v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0 andi v1, v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0_LOCK_STATUS bne v1, zero, 1f nop /* Black magic from frontend */ li v1, 0x00610400 sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2 li v1, 0x00610c00 sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2 li v1, 0x00610800 sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2 li v1, 0x00610000 sw v1, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG2 /* Wait for lock */ 2: lw v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0 andi v1, v0, MACRO_CTRL_PLL5G_STATUS_PLL5G_STATUS0_LOCK_STATUS /* Keep looping if zero (no lock bit yet) */ beq v1, zero, 2b nop /* Setup PLL CPU clock divider for 416MHz */ 1: lw v0, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0 /* Keep reserved bits */ li v1, ~MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV and v0, v0, v1 /* Set code 6 ~ 416.66 MHz */ ori v0, v0, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0_CPU_CLK_DIV_ENC(6) sw v0, MACRO_CTRL_PLL5G_CFG_PLL5G_CFG0 jr ra nop END(pll_init)