1fc14176bSLuc Michel /* 2fc14176bSLuc Michel * BCM2835 CPRMAN clock manager 3fc14176bSLuc Michel * 4fc14176bSLuc Michel * Copyright (c) 2020 Luc Michel <luc@lmichel.fr> 5fc14176bSLuc Michel * 6fc14176bSLuc Michel * SPDX-License-Identifier: GPL-2.0-or-later 7fc14176bSLuc Michel */ 8fc14176bSLuc Michel 9fc14176bSLuc Michel #ifndef HW_MISC_CPRMAN_INTERNALS_H 10fc14176bSLuc Michel #define HW_MISC_CPRMAN_INTERNALS_H 11fc14176bSLuc Michel 12fc14176bSLuc Michel #include "hw/registerfields.h" 13fc14176bSLuc Michel #include "hw/misc/bcm2835_cprman.h" 14fc14176bSLuc Michel 15*1e986e25SLuc Michel #define TYPE_CPRMAN_PLL "bcm2835-cprman-pll" 16*1e986e25SLuc Michel 17*1e986e25SLuc Michel DECLARE_INSTANCE_CHECKER(CprmanPllState, CPRMAN_PLL, 18*1e986e25SLuc Michel TYPE_CPRMAN_PLL) 19*1e986e25SLuc Michel 20fc14176bSLuc Michel /* Register map */ 21fc14176bSLuc Michel 22*1e986e25SLuc Michel /* PLLs */ 23*1e986e25SLuc Michel REG32(CM_PLLA, 0x104) 24*1e986e25SLuc Michel FIELD(CM_PLLA, LOADDSI0, 0, 1) 25*1e986e25SLuc Michel FIELD(CM_PLLA, HOLDDSI0, 1, 1) 26*1e986e25SLuc Michel FIELD(CM_PLLA, LOADCCP2, 2, 1) 27*1e986e25SLuc Michel FIELD(CM_PLLA, HOLDCCP2, 3, 1) 28*1e986e25SLuc Michel FIELD(CM_PLLA, LOADCORE, 4, 1) 29*1e986e25SLuc Michel FIELD(CM_PLLA, HOLDCORE, 5, 1) 30*1e986e25SLuc Michel FIELD(CM_PLLA, LOADPER, 6, 1) 31*1e986e25SLuc Michel FIELD(CM_PLLA, HOLDPER, 7, 1) 32*1e986e25SLuc Michel FIELD(CM_PLLx, ANARST, 8, 1) 33*1e986e25SLuc Michel REG32(CM_PLLC, 0x108) 34*1e986e25SLuc Michel FIELD(CM_PLLC, LOADCORE0, 0, 1) 35*1e986e25SLuc Michel FIELD(CM_PLLC, HOLDCORE0, 1, 1) 36*1e986e25SLuc Michel FIELD(CM_PLLC, LOADCORE1, 2, 1) 37*1e986e25SLuc Michel FIELD(CM_PLLC, HOLDCORE1, 3, 1) 38*1e986e25SLuc Michel FIELD(CM_PLLC, LOADCORE2, 4, 1) 39*1e986e25SLuc Michel FIELD(CM_PLLC, HOLDCORE2, 5, 1) 40*1e986e25SLuc Michel FIELD(CM_PLLC, LOADPER, 6, 1) 41*1e986e25SLuc Michel FIELD(CM_PLLC, HOLDPER, 7, 1) 42*1e986e25SLuc Michel REG32(CM_PLLD, 0x10c) 43*1e986e25SLuc Michel FIELD(CM_PLLD, LOADDSI0, 0, 1) 44*1e986e25SLuc Michel FIELD(CM_PLLD, HOLDDSI0, 1, 1) 45*1e986e25SLuc Michel FIELD(CM_PLLD, LOADDSI1, 2, 1) 46*1e986e25SLuc Michel FIELD(CM_PLLD, HOLDDSI1, 3, 1) 47*1e986e25SLuc Michel FIELD(CM_PLLD, LOADCORE, 4, 1) 48*1e986e25SLuc Michel FIELD(CM_PLLD, HOLDCORE, 5, 1) 49*1e986e25SLuc Michel FIELD(CM_PLLD, LOADPER, 6, 1) 50*1e986e25SLuc Michel FIELD(CM_PLLD, HOLDPER, 7, 1) 51*1e986e25SLuc Michel REG32(CM_PLLH, 0x110) 52*1e986e25SLuc Michel FIELD(CM_PLLH, LOADPIX, 0, 1) 53*1e986e25SLuc Michel FIELD(CM_PLLH, LOADAUX, 1, 1) 54*1e986e25SLuc Michel FIELD(CM_PLLH, LOADRCAL, 2, 1) 55*1e986e25SLuc Michel REG32(CM_PLLB, 0x170) 56*1e986e25SLuc Michel FIELD(CM_PLLB, LOADARM, 0, 1) 57*1e986e25SLuc Michel FIELD(CM_PLLB, HOLDARM, 1, 1) 58*1e986e25SLuc Michel 59*1e986e25SLuc Michel REG32(A2W_PLLA_CTRL, 0x1100) 60*1e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, NDIV, 0, 10) 61*1e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, PDIV, 12, 3) 62*1e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, PWRDN, 16, 1) 63*1e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, PRST_DISABLE, 17, 1) 64*1e986e25SLuc Michel REG32(A2W_PLLC_CTRL, 0x1120) 65*1e986e25SLuc Michel REG32(A2W_PLLD_CTRL, 0x1140) 66*1e986e25SLuc Michel REG32(A2W_PLLH_CTRL, 0x1160) 67*1e986e25SLuc Michel REG32(A2W_PLLB_CTRL, 0x11e0) 68*1e986e25SLuc Michel 69*1e986e25SLuc Michel REG32(A2W_PLLA_ANA0, 0x1010) 70*1e986e25SLuc Michel REG32(A2W_PLLA_ANA1, 0x1014) 71*1e986e25SLuc Michel FIELD(A2W_PLLx_ANA1, FB_PREDIV, 14, 1) 72*1e986e25SLuc Michel REG32(A2W_PLLA_ANA2, 0x1018) 73*1e986e25SLuc Michel REG32(A2W_PLLA_ANA3, 0x101c) 74*1e986e25SLuc Michel 75*1e986e25SLuc Michel REG32(A2W_PLLC_ANA0, 0x1030) 76*1e986e25SLuc Michel REG32(A2W_PLLC_ANA1, 0x1034) 77*1e986e25SLuc Michel REG32(A2W_PLLC_ANA2, 0x1038) 78*1e986e25SLuc Michel REG32(A2W_PLLC_ANA3, 0x103c) 79*1e986e25SLuc Michel 80*1e986e25SLuc Michel REG32(A2W_PLLD_ANA0, 0x1050) 81*1e986e25SLuc Michel REG32(A2W_PLLD_ANA1, 0x1054) 82*1e986e25SLuc Michel REG32(A2W_PLLD_ANA2, 0x1058) 83*1e986e25SLuc Michel REG32(A2W_PLLD_ANA3, 0x105c) 84*1e986e25SLuc Michel 85*1e986e25SLuc Michel REG32(A2W_PLLH_ANA0, 0x1070) 86*1e986e25SLuc Michel REG32(A2W_PLLH_ANA1, 0x1074) 87*1e986e25SLuc Michel FIELD(A2W_PLLH_ANA1, FB_PREDIV, 11, 1) 88*1e986e25SLuc Michel REG32(A2W_PLLH_ANA2, 0x1078) 89*1e986e25SLuc Michel REG32(A2W_PLLH_ANA3, 0x107c) 90*1e986e25SLuc Michel 91*1e986e25SLuc Michel REG32(A2W_PLLB_ANA0, 0x10f0) 92*1e986e25SLuc Michel REG32(A2W_PLLB_ANA1, 0x10f4) 93*1e986e25SLuc Michel REG32(A2W_PLLB_ANA2, 0x10f8) 94*1e986e25SLuc Michel REG32(A2W_PLLB_ANA3, 0x10fc) 95*1e986e25SLuc Michel 96*1e986e25SLuc Michel REG32(A2W_PLLA_FRAC, 0x1200) 97*1e986e25SLuc Michel FIELD(A2W_PLLx_FRAC, FRAC, 0, 20) 98*1e986e25SLuc Michel REG32(A2W_PLLC_FRAC, 0x1220) 99*1e986e25SLuc Michel REG32(A2W_PLLD_FRAC, 0x1240) 100*1e986e25SLuc Michel REG32(A2W_PLLH_FRAC, 0x1260) 101*1e986e25SLuc Michel REG32(A2W_PLLB_FRAC, 0x12e0) 102*1e986e25SLuc Michel 103fc14176bSLuc Michel /* 104fc14176bSLuc Michel * This field is common to all registers. Each register write value must match 105fc14176bSLuc Michel * the CPRMAN_PASSWORD magic value in its 8 MSB. 106fc14176bSLuc Michel */ 107fc14176bSLuc Michel FIELD(CPRMAN, PASSWORD, 24, 8) 108fc14176bSLuc Michel #define CPRMAN_PASSWORD 0x5a 109fc14176bSLuc Michel 110*1e986e25SLuc Michel /* PLL init info */ 111*1e986e25SLuc Michel typedef struct PLLInitInfo { 112*1e986e25SLuc Michel const char *name; 113*1e986e25SLuc Michel size_t cm_offset; 114*1e986e25SLuc Michel size_t a2w_ctrl_offset; 115*1e986e25SLuc Michel size_t a2w_ana_offset; 116*1e986e25SLuc Michel uint32_t prediv_mask; /* Prediv bit in ana[1] */ 117*1e986e25SLuc Michel size_t a2w_frac_offset; 118*1e986e25SLuc Michel } PLLInitInfo; 119*1e986e25SLuc Michel 120*1e986e25SLuc Michel #define FILL_PLL_INIT_INFO(pll_) \ 121*1e986e25SLuc Michel .cm_offset = R_CM_ ## pll_, \ 122*1e986e25SLuc Michel .a2w_ctrl_offset = R_A2W_ ## pll_ ## _CTRL, \ 123*1e986e25SLuc Michel .a2w_ana_offset = R_A2W_ ## pll_ ## _ANA0, \ 124*1e986e25SLuc Michel .a2w_frac_offset = R_A2W_ ## pll_ ## _FRAC 125*1e986e25SLuc Michel 126*1e986e25SLuc Michel static const PLLInitInfo PLL_INIT_INFO[] = { 127*1e986e25SLuc Michel [CPRMAN_PLLA] = { 128*1e986e25SLuc Michel .name = "plla", 129*1e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 130*1e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLA), 131*1e986e25SLuc Michel }, 132*1e986e25SLuc Michel [CPRMAN_PLLC] = { 133*1e986e25SLuc Michel .name = "pllc", 134*1e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 135*1e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLC), 136*1e986e25SLuc Michel }, 137*1e986e25SLuc Michel [CPRMAN_PLLD] = { 138*1e986e25SLuc Michel .name = "plld", 139*1e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 140*1e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLD), 141*1e986e25SLuc Michel }, 142*1e986e25SLuc Michel [CPRMAN_PLLH] = { 143*1e986e25SLuc Michel .name = "pllh", 144*1e986e25SLuc Michel .prediv_mask = R_A2W_PLLH_ANA1_FB_PREDIV_MASK, 145*1e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLH), 146*1e986e25SLuc Michel }, 147*1e986e25SLuc Michel [CPRMAN_PLLB] = { 148*1e986e25SLuc Michel .name = "pllb", 149*1e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 150*1e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLB), 151*1e986e25SLuc Michel }, 152*1e986e25SLuc Michel }; 153*1e986e25SLuc Michel 154*1e986e25SLuc Michel #undef FILL_PLL_CHANNEL_INIT_INFO 155*1e986e25SLuc Michel 156*1e986e25SLuc Michel static inline void set_pll_init_info(BCM2835CprmanState *s, 157*1e986e25SLuc Michel CprmanPllState *pll, 158*1e986e25SLuc Michel CprmanPll id) 159*1e986e25SLuc Michel { 160*1e986e25SLuc Michel pll->id = id; 161*1e986e25SLuc Michel pll->reg_cm = &s->regs[PLL_INIT_INFO[id].cm_offset]; 162*1e986e25SLuc Michel pll->reg_a2w_ctrl = &s->regs[PLL_INIT_INFO[id].a2w_ctrl_offset]; 163*1e986e25SLuc Michel pll->reg_a2w_ana = &s->regs[PLL_INIT_INFO[id].a2w_ana_offset]; 164*1e986e25SLuc Michel pll->prediv_mask = PLL_INIT_INFO[id].prediv_mask; 165*1e986e25SLuc Michel pll->reg_a2w_frac = &s->regs[PLL_INIT_INFO[id].a2w_frac_offset]; 166*1e986e25SLuc Michel } 167*1e986e25SLuc Michel 168fc14176bSLuc Michel #endif 169