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 151e986e25SLuc Michel #define TYPE_CPRMAN_PLL "bcm2835-cprman-pll" 16*09d56bbcSLuc Michel #define TYPE_CPRMAN_PLL_CHANNEL "bcm2835-cprman-pll-channel" 171e986e25SLuc Michel 181e986e25SLuc Michel DECLARE_INSTANCE_CHECKER(CprmanPllState, CPRMAN_PLL, 191e986e25SLuc Michel TYPE_CPRMAN_PLL) 20*09d56bbcSLuc Michel DECLARE_INSTANCE_CHECKER(CprmanPllChannelState, CPRMAN_PLL_CHANNEL, 21*09d56bbcSLuc Michel TYPE_CPRMAN_PLL_CHANNEL) 221e986e25SLuc Michel 23fc14176bSLuc Michel /* Register map */ 24fc14176bSLuc Michel 251e986e25SLuc Michel /* PLLs */ 261e986e25SLuc Michel REG32(CM_PLLA, 0x104) 271e986e25SLuc Michel FIELD(CM_PLLA, LOADDSI0, 0, 1) 281e986e25SLuc Michel FIELD(CM_PLLA, HOLDDSI0, 1, 1) 291e986e25SLuc Michel FIELD(CM_PLLA, LOADCCP2, 2, 1) 301e986e25SLuc Michel FIELD(CM_PLLA, HOLDCCP2, 3, 1) 311e986e25SLuc Michel FIELD(CM_PLLA, LOADCORE, 4, 1) 321e986e25SLuc Michel FIELD(CM_PLLA, HOLDCORE, 5, 1) 331e986e25SLuc Michel FIELD(CM_PLLA, LOADPER, 6, 1) 341e986e25SLuc Michel FIELD(CM_PLLA, HOLDPER, 7, 1) 351e986e25SLuc Michel FIELD(CM_PLLx, ANARST, 8, 1) 361e986e25SLuc Michel REG32(CM_PLLC, 0x108) 371e986e25SLuc Michel FIELD(CM_PLLC, LOADCORE0, 0, 1) 381e986e25SLuc Michel FIELD(CM_PLLC, HOLDCORE0, 1, 1) 391e986e25SLuc Michel FIELD(CM_PLLC, LOADCORE1, 2, 1) 401e986e25SLuc Michel FIELD(CM_PLLC, HOLDCORE1, 3, 1) 411e986e25SLuc Michel FIELD(CM_PLLC, LOADCORE2, 4, 1) 421e986e25SLuc Michel FIELD(CM_PLLC, HOLDCORE2, 5, 1) 431e986e25SLuc Michel FIELD(CM_PLLC, LOADPER, 6, 1) 441e986e25SLuc Michel FIELD(CM_PLLC, HOLDPER, 7, 1) 451e986e25SLuc Michel REG32(CM_PLLD, 0x10c) 461e986e25SLuc Michel FIELD(CM_PLLD, LOADDSI0, 0, 1) 471e986e25SLuc Michel FIELD(CM_PLLD, HOLDDSI0, 1, 1) 481e986e25SLuc Michel FIELD(CM_PLLD, LOADDSI1, 2, 1) 491e986e25SLuc Michel FIELD(CM_PLLD, HOLDDSI1, 3, 1) 501e986e25SLuc Michel FIELD(CM_PLLD, LOADCORE, 4, 1) 511e986e25SLuc Michel FIELD(CM_PLLD, HOLDCORE, 5, 1) 521e986e25SLuc Michel FIELD(CM_PLLD, LOADPER, 6, 1) 531e986e25SLuc Michel FIELD(CM_PLLD, HOLDPER, 7, 1) 541e986e25SLuc Michel REG32(CM_PLLH, 0x110) 551e986e25SLuc Michel FIELD(CM_PLLH, LOADPIX, 0, 1) 561e986e25SLuc Michel FIELD(CM_PLLH, LOADAUX, 1, 1) 571e986e25SLuc Michel FIELD(CM_PLLH, LOADRCAL, 2, 1) 581e986e25SLuc Michel REG32(CM_PLLB, 0x170) 591e986e25SLuc Michel FIELD(CM_PLLB, LOADARM, 0, 1) 601e986e25SLuc Michel FIELD(CM_PLLB, HOLDARM, 1, 1) 611e986e25SLuc Michel 621e986e25SLuc Michel REG32(A2W_PLLA_CTRL, 0x1100) 631e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, NDIV, 0, 10) 641e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, PDIV, 12, 3) 651e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, PWRDN, 16, 1) 661e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, PRST_DISABLE, 17, 1) 671e986e25SLuc Michel REG32(A2W_PLLC_CTRL, 0x1120) 681e986e25SLuc Michel REG32(A2W_PLLD_CTRL, 0x1140) 691e986e25SLuc Michel REG32(A2W_PLLH_CTRL, 0x1160) 701e986e25SLuc Michel REG32(A2W_PLLB_CTRL, 0x11e0) 711e986e25SLuc Michel 721e986e25SLuc Michel REG32(A2W_PLLA_ANA0, 0x1010) 731e986e25SLuc Michel REG32(A2W_PLLA_ANA1, 0x1014) 741e986e25SLuc Michel FIELD(A2W_PLLx_ANA1, FB_PREDIV, 14, 1) 751e986e25SLuc Michel REG32(A2W_PLLA_ANA2, 0x1018) 761e986e25SLuc Michel REG32(A2W_PLLA_ANA3, 0x101c) 771e986e25SLuc Michel 781e986e25SLuc Michel REG32(A2W_PLLC_ANA0, 0x1030) 791e986e25SLuc Michel REG32(A2W_PLLC_ANA1, 0x1034) 801e986e25SLuc Michel REG32(A2W_PLLC_ANA2, 0x1038) 811e986e25SLuc Michel REG32(A2W_PLLC_ANA3, 0x103c) 821e986e25SLuc Michel 831e986e25SLuc Michel REG32(A2W_PLLD_ANA0, 0x1050) 841e986e25SLuc Michel REG32(A2W_PLLD_ANA1, 0x1054) 851e986e25SLuc Michel REG32(A2W_PLLD_ANA2, 0x1058) 861e986e25SLuc Michel REG32(A2W_PLLD_ANA3, 0x105c) 871e986e25SLuc Michel 881e986e25SLuc Michel REG32(A2W_PLLH_ANA0, 0x1070) 891e986e25SLuc Michel REG32(A2W_PLLH_ANA1, 0x1074) 901e986e25SLuc Michel FIELD(A2W_PLLH_ANA1, FB_PREDIV, 11, 1) 911e986e25SLuc Michel REG32(A2W_PLLH_ANA2, 0x1078) 921e986e25SLuc Michel REG32(A2W_PLLH_ANA3, 0x107c) 931e986e25SLuc Michel 941e986e25SLuc Michel REG32(A2W_PLLB_ANA0, 0x10f0) 951e986e25SLuc Michel REG32(A2W_PLLB_ANA1, 0x10f4) 961e986e25SLuc Michel REG32(A2W_PLLB_ANA2, 0x10f8) 971e986e25SLuc Michel REG32(A2W_PLLB_ANA3, 0x10fc) 981e986e25SLuc Michel 991e986e25SLuc Michel REG32(A2W_PLLA_FRAC, 0x1200) 1001e986e25SLuc Michel FIELD(A2W_PLLx_FRAC, FRAC, 0, 20) 1011e986e25SLuc Michel REG32(A2W_PLLC_FRAC, 0x1220) 1021e986e25SLuc Michel REG32(A2W_PLLD_FRAC, 0x1240) 1031e986e25SLuc Michel REG32(A2W_PLLH_FRAC, 0x1260) 1041e986e25SLuc Michel REG32(A2W_PLLB_FRAC, 0x12e0) 1051e986e25SLuc Michel 106*09d56bbcSLuc Michel /* PLL channels */ 107*09d56bbcSLuc Michel REG32(A2W_PLLA_DSI0, 0x1300) 108*09d56bbcSLuc Michel FIELD(A2W_PLLx_CHANNELy, DIV, 0, 8) 109*09d56bbcSLuc Michel FIELD(A2W_PLLx_CHANNELy, DISABLE, 8, 1) 110*09d56bbcSLuc Michel REG32(A2W_PLLA_CORE, 0x1400) 111*09d56bbcSLuc Michel REG32(A2W_PLLA_PER, 0x1500) 112*09d56bbcSLuc Michel REG32(A2W_PLLA_CCP2, 0x1600) 113*09d56bbcSLuc Michel 114*09d56bbcSLuc Michel REG32(A2W_PLLC_CORE2, 0x1320) 115*09d56bbcSLuc Michel REG32(A2W_PLLC_CORE1, 0x1420) 116*09d56bbcSLuc Michel REG32(A2W_PLLC_PER, 0x1520) 117*09d56bbcSLuc Michel REG32(A2W_PLLC_CORE0, 0x1620) 118*09d56bbcSLuc Michel 119*09d56bbcSLuc Michel REG32(A2W_PLLD_DSI0, 0x1340) 120*09d56bbcSLuc Michel REG32(A2W_PLLD_CORE, 0x1440) 121*09d56bbcSLuc Michel REG32(A2W_PLLD_PER, 0x1540) 122*09d56bbcSLuc Michel REG32(A2W_PLLD_DSI1, 0x1640) 123*09d56bbcSLuc Michel 124*09d56bbcSLuc Michel REG32(A2W_PLLH_AUX, 0x1360) 125*09d56bbcSLuc Michel REG32(A2W_PLLH_RCAL, 0x1460) 126*09d56bbcSLuc Michel REG32(A2W_PLLH_PIX, 0x1560) 127*09d56bbcSLuc Michel REG32(A2W_PLLH_STS, 0x1660) 128*09d56bbcSLuc Michel 129*09d56bbcSLuc Michel REG32(A2W_PLLB_ARM, 0x13e0) 130*09d56bbcSLuc Michel 1316d2b874cSLuc Michel /* misc registers */ 1326d2b874cSLuc Michel REG32(CM_LOCK, 0x114) 1336d2b874cSLuc Michel FIELD(CM_LOCK, FLOCKH, 12, 1) 1346d2b874cSLuc Michel FIELD(CM_LOCK, FLOCKD, 11, 1) 1356d2b874cSLuc Michel FIELD(CM_LOCK, FLOCKC, 10, 1) 1366d2b874cSLuc Michel FIELD(CM_LOCK, FLOCKB, 9, 1) 1376d2b874cSLuc Michel FIELD(CM_LOCK, FLOCKA, 8, 1) 1386d2b874cSLuc Michel 139fc14176bSLuc Michel /* 140fc14176bSLuc Michel * This field is common to all registers. Each register write value must match 141fc14176bSLuc Michel * the CPRMAN_PASSWORD magic value in its 8 MSB. 142fc14176bSLuc Michel */ 143fc14176bSLuc Michel FIELD(CPRMAN, PASSWORD, 24, 8) 144fc14176bSLuc Michel #define CPRMAN_PASSWORD 0x5a 145fc14176bSLuc Michel 1461e986e25SLuc Michel /* PLL init info */ 1471e986e25SLuc Michel typedef struct PLLInitInfo { 1481e986e25SLuc Michel const char *name; 1491e986e25SLuc Michel size_t cm_offset; 1501e986e25SLuc Michel size_t a2w_ctrl_offset; 1511e986e25SLuc Michel size_t a2w_ana_offset; 1521e986e25SLuc Michel uint32_t prediv_mask; /* Prediv bit in ana[1] */ 1531e986e25SLuc Michel size_t a2w_frac_offset; 1541e986e25SLuc Michel } PLLInitInfo; 1551e986e25SLuc Michel 1561e986e25SLuc Michel #define FILL_PLL_INIT_INFO(pll_) \ 1571e986e25SLuc Michel .cm_offset = R_CM_ ## pll_, \ 1581e986e25SLuc Michel .a2w_ctrl_offset = R_A2W_ ## pll_ ## _CTRL, \ 1591e986e25SLuc Michel .a2w_ana_offset = R_A2W_ ## pll_ ## _ANA0, \ 1601e986e25SLuc Michel .a2w_frac_offset = R_A2W_ ## pll_ ## _FRAC 1611e986e25SLuc Michel 1621e986e25SLuc Michel static const PLLInitInfo PLL_INIT_INFO[] = { 1631e986e25SLuc Michel [CPRMAN_PLLA] = { 1641e986e25SLuc Michel .name = "plla", 1651e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 1661e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLA), 1671e986e25SLuc Michel }, 1681e986e25SLuc Michel [CPRMAN_PLLC] = { 1691e986e25SLuc Michel .name = "pllc", 1701e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 1711e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLC), 1721e986e25SLuc Michel }, 1731e986e25SLuc Michel [CPRMAN_PLLD] = { 1741e986e25SLuc Michel .name = "plld", 1751e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 1761e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLD), 1771e986e25SLuc Michel }, 1781e986e25SLuc Michel [CPRMAN_PLLH] = { 1791e986e25SLuc Michel .name = "pllh", 1801e986e25SLuc Michel .prediv_mask = R_A2W_PLLH_ANA1_FB_PREDIV_MASK, 1811e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLH), 1821e986e25SLuc Michel }, 1831e986e25SLuc Michel [CPRMAN_PLLB] = { 1841e986e25SLuc Michel .name = "pllb", 1851e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 1861e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLB), 1871e986e25SLuc Michel }, 1881e986e25SLuc Michel }; 1891e986e25SLuc Michel 1901e986e25SLuc Michel #undef FILL_PLL_CHANNEL_INIT_INFO 1911e986e25SLuc Michel 1921e986e25SLuc Michel static inline void set_pll_init_info(BCM2835CprmanState *s, 1931e986e25SLuc Michel CprmanPllState *pll, 1941e986e25SLuc Michel CprmanPll id) 1951e986e25SLuc Michel { 1961e986e25SLuc Michel pll->id = id; 1971e986e25SLuc Michel pll->reg_cm = &s->regs[PLL_INIT_INFO[id].cm_offset]; 1981e986e25SLuc Michel pll->reg_a2w_ctrl = &s->regs[PLL_INIT_INFO[id].a2w_ctrl_offset]; 1991e986e25SLuc Michel pll->reg_a2w_ana = &s->regs[PLL_INIT_INFO[id].a2w_ana_offset]; 2001e986e25SLuc Michel pll->prediv_mask = PLL_INIT_INFO[id].prediv_mask; 2011e986e25SLuc Michel pll->reg_a2w_frac = &s->regs[PLL_INIT_INFO[id].a2w_frac_offset]; 2021e986e25SLuc Michel } 2031e986e25SLuc Michel 204*09d56bbcSLuc Michel 205*09d56bbcSLuc Michel /* PLL channel init info */ 206*09d56bbcSLuc Michel typedef struct PLLChannelInitInfo { 207*09d56bbcSLuc Michel const char *name; 208*09d56bbcSLuc Michel CprmanPll parent; 209*09d56bbcSLuc Michel size_t cm_offset; 210*09d56bbcSLuc Michel uint32_t cm_hold_mask; 211*09d56bbcSLuc Michel uint32_t cm_load_mask; 212*09d56bbcSLuc Michel size_t a2w_ctrl_offset; 213*09d56bbcSLuc Michel unsigned int fixed_divider; 214*09d56bbcSLuc Michel } PLLChannelInitInfo; 215*09d56bbcSLuc Michel 216*09d56bbcSLuc Michel #define FILL_PLL_CHANNEL_INIT_INFO_common(pll_, channel_) \ 217*09d56bbcSLuc Michel .parent = CPRMAN_ ## pll_, \ 218*09d56bbcSLuc Michel .cm_offset = R_CM_ ## pll_, \ 219*09d56bbcSLuc Michel .cm_load_mask = R_CM_ ## pll_ ## _ ## LOAD ## channel_ ## _MASK, \ 220*09d56bbcSLuc Michel .a2w_ctrl_offset = R_A2W_ ## pll_ ## _ ## channel_ 221*09d56bbcSLuc Michel 222*09d56bbcSLuc Michel #define FILL_PLL_CHANNEL_INIT_INFO(pll_, channel_) \ 223*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO_common(pll_, channel_), \ 224*09d56bbcSLuc Michel .cm_hold_mask = R_CM_ ## pll_ ## _ ## HOLD ## channel_ ## _MASK, \ 225*09d56bbcSLuc Michel .fixed_divider = 1 226*09d56bbcSLuc Michel 227*09d56bbcSLuc Michel #define FILL_PLL_CHANNEL_INIT_INFO_nohold(pll_, channel_) \ 228*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO_common(pll_, channel_), \ 229*09d56bbcSLuc Michel .cm_hold_mask = 0 230*09d56bbcSLuc Michel 231*09d56bbcSLuc Michel static PLLChannelInitInfo PLL_CHANNEL_INIT_INFO[] = { 232*09d56bbcSLuc Michel [CPRMAN_PLLA_CHANNEL_DSI0] = { 233*09d56bbcSLuc Michel .name = "plla-dsi0", 234*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLA, DSI0), 235*09d56bbcSLuc Michel }, 236*09d56bbcSLuc Michel [CPRMAN_PLLA_CHANNEL_CORE] = { 237*09d56bbcSLuc Michel .name = "plla-core", 238*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLA, CORE), 239*09d56bbcSLuc Michel }, 240*09d56bbcSLuc Michel [CPRMAN_PLLA_CHANNEL_PER] = { 241*09d56bbcSLuc Michel .name = "plla-per", 242*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLA, PER), 243*09d56bbcSLuc Michel }, 244*09d56bbcSLuc Michel [CPRMAN_PLLA_CHANNEL_CCP2] = { 245*09d56bbcSLuc Michel .name = "plla-ccp2", 246*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLA, CCP2), 247*09d56bbcSLuc Michel }, 248*09d56bbcSLuc Michel 249*09d56bbcSLuc Michel [CPRMAN_PLLC_CHANNEL_CORE2] = { 250*09d56bbcSLuc Michel .name = "pllc-core2", 251*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLC, CORE2), 252*09d56bbcSLuc Michel }, 253*09d56bbcSLuc Michel [CPRMAN_PLLC_CHANNEL_CORE1] = { 254*09d56bbcSLuc Michel .name = "pllc-core1", 255*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLC, CORE1), 256*09d56bbcSLuc Michel }, 257*09d56bbcSLuc Michel [CPRMAN_PLLC_CHANNEL_PER] = { 258*09d56bbcSLuc Michel .name = "pllc-per", 259*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLC, PER), 260*09d56bbcSLuc Michel }, 261*09d56bbcSLuc Michel [CPRMAN_PLLC_CHANNEL_CORE0] = { 262*09d56bbcSLuc Michel .name = "pllc-core0", 263*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLC, CORE0), 264*09d56bbcSLuc Michel }, 265*09d56bbcSLuc Michel 266*09d56bbcSLuc Michel [CPRMAN_PLLD_CHANNEL_DSI0] = { 267*09d56bbcSLuc Michel .name = "plld-dsi0", 268*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLD, DSI0), 269*09d56bbcSLuc Michel }, 270*09d56bbcSLuc Michel [CPRMAN_PLLD_CHANNEL_CORE] = { 271*09d56bbcSLuc Michel .name = "plld-core", 272*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLD, CORE), 273*09d56bbcSLuc Michel }, 274*09d56bbcSLuc Michel [CPRMAN_PLLD_CHANNEL_PER] = { 275*09d56bbcSLuc Michel .name = "plld-per", 276*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLD, PER), 277*09d56bbcSLuc Michel }, 278*09d56bbcSLuc Michel [CPRMAN_PLLD_CHANNEL_DSI1] = { 279*09d56bbcSLuc Michel .name = "plld-dsi1", 280*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLD, DSI1), 281*09d56bbcSLuc Michel }, 282*09d56bbcSLuc Michel 283*09d56bbcSLuc Michel [CPRMAN_PLLH_CHANNEL_AUX] = { 284*09d56bbcSLuc Michel .name = "pllh-aux", 285*09d56bbcSLuc Michel .fixed_divider = 1, 286*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO_nohold(PLLH, AUX), 287*09d56bbcSLuc Michel }, 288*09d56bbcSLuc Michel [CPRMAN_PLLH_CHANNEL_RCAL] = { 289*09d56bbcSLuc Michel .name = "pllh-rcal", 290*09d56bbcSLuc Michel .fixed_divider = 10, 291*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO_nohold(PLLH, RCAL), 292*09d56bbcSLuc Michel }, 293*09d56bbcSLuc Michel [CPRMAN_PLLH_CHANNEL_PIX] = { 294*09d56bbcSLuc Michel .name = "pllh-pix", 295*09d56bbcSLuc Michel .fixed_divider = 10, 296*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO_nohold(PLLH, PIX), 297*09d56bbcSLuc Michel }, 298*09d56bbcSLuc Michel 299*09d56bbcSLuc Michel [CPRMAN_PLLB_CHANNEL_ARM] = { 300*09d56bbcSLuc Michel .name = "pllb-arm", 301*09d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLB, ARM), 302*09d56bbcSLuc Michel }, 303*09d56bbcSLuc Michel }; 304*09d56bbcSLuc Michel 305*09d56bbcSLuc Michel #undef FILL_PLL_CHANNEL_INIT_INFO_nohold 306*09d56bbcSLuc Michel #undef FILL_PLL_CHANNEL_INIT_INFO 307*09d56bbcSLuc Michel #undef FILL_PLL_CHANNEL_INIT_INFO_common 308*09d56bbcSLuc Michel 309*09d56bbcSLuc Michel static inline void set_pll_channel_init_info(BCM2835CprmanState *s, 310*09d56bbcSLuc Michel CprmanPllChannelState *channel, 311*09d56bbcSLuc Michel CprmanPllChannel id) 312*09d56bbcSLuc Michel { 313*09d56bbcSLuc Michel channel->id = id; 314*09d56bbcSLuc Michel channel->parent = PLL_CHANNEL_INIT_INFO[id].parent; 315*09d56bbcSLuc Michel channel->reg_cm = &s->regs[PLL_CHANNEL_INIT_INFO[id].cm_offset]; 316*09d56bbcSLuc Michel channel->hold_mask = PLL_CHANNEL_INIT_INFO[id].cm_hold_mask; 317*09d56bbcSLuc Michel channel->load_mask = PLL_CHANNEL_INIT_INFO[id].cm_load_mask; 318*09d56bbcSLuc Michel channel->reg_a2w_ctrl = &s->regs[PLL_CHANNEL_INIT_INFO[id].a2w_ctrl_offset]; 319*09d56bbcSLuc Michel channel->fixed_divider = PLL_CHANNEL_INIT_INFO[id].fixed_divider; 320*09d56bbcSLuc Michel } 321*09d56bbcSLuc Michel 322fc14176bSLuc Michel #endif 323