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" 1609d56bbcSLuc Michel #define TYPE_CPRMAN_PLL_CHANNEL "bcm2835-cprman-pll-channel" 17*72813624SLuc Michel #define TYPE_CPRMAN_CLOCK_MUX "bcm2835-cprman-clock-mux" 181e986e25SLuc Michel 191e986e25SLuc Michel DECLARE_INSTANCE_CHECKER(CprmanPllState, CPRMAN_PLL, 201e986e25SLuc Michel TYPE_CPRMAN_PLL) 2109d56bbcSLuc Michel DECLARE_INSTANCE_CHECKER(CprmanPllChannelState, CPRMAN_PLL_CHANNEL, 2209d56bbcSLuc Michel TYPE_CPRMAN_PLL_CHANNEL) 23*72813624SLuc Michel DECLARE_INSTANCE_CHECKER(CprmanClockMuxState, CPRMAN_CLOCK_MUX, 24*72813624SLuc Michel TYPE_CPRMAN_CLOCK_MUX) 251e986e25SLuc Michel 26fc14176bSLuc Michel /* Register map */ 27fc14176bSLuc Michel 281e986e25SLuc Michel /* PLLs */ 291e986e25SLuc Michel REG32(CM_PLLA, 0x104) 301e986e25SLuc Michel FIELD(CM_PLLA, LOADDSI0, 0, 1) 311e986e25SLuc Michel FIELD(CM_PLLA, HOLDDSI0, 1, 1) 321e986e25SLuc Michel FIELD(CM_PLLA, LOADCCP2, 2, 1) 331e986e25SLuc Michel FIELD(CM_PLLA, HOLDCCP2, 3, 1) 341e986e25SLuc Michel FIELD(CM_PLLA, LOADCORE, 4, 1) 351e986e25SLuc Michel FIELD(CM_PLLA, HOLDCORE, 5, 1) 361e986e25SLuc Michel FIELD(CM_PLLA, LOADPER, 6, 1) 371e986e25SLuc Michel FIELD(CM_PLLA, HOLDPER, 7, 1) 381e986e25SLuc Michel FIELD(CM_PLLx, ANARST, 8, 1) 391e986e25SLuc Michel REG32(CM_PLLC, 0x108) 401e986e25SLuc Michel FIELD(CM_PLLC, LOADCORE0, 0, 1) 411e986e25SLuc Michel FIELD(CM_PLLC, HOLDCORE0, 1, 1) 421e986e25SLuc Michel FIELD(CM_PLLC, LOADCORE1, 2, 1) 431e986e25SLuc Michel FIELD(CM_PLLC, HOLDCORE1, 3, 1) 441e986e25SLuc Michel FIELD(CM_PLLC, LOADCORE2, 4, 1) 451e986e25SLuc Michel FIELD(CM_PLLC, HOLDCORE2, 5, 1) 461e986e25SLuc Michel FIELD(CM_PLLC, LOADPER, 6, 1) 471e986e25SLuc Michel FIELD(CM_PLLC, HOLDPER, 7, 1) 481e986e25SLuc Michel REG32(CM_PLLD, 0x10c) 491e986e25SLuc Michel FIELD(CM_PLLD, LOADDSI0, 0, 1) 501e986e25SLuc Michel FIELD(CM_PLLD, HOLDDSI0, 1, 1) 511e986e25SLuc Michel FIELD(CM_PLLD, LOADDSI1, 2, 1) 521e986e25SLuc Michel FIELD(CM_PLLD, HOLDDSI1, 3, 1) 531e986e25SLuc Michel FIELD(CM_PLLD, LOADCORE, 4, 1) 541e986e25SLuc Michel FIELD(CM_PLLD, HOLDCORE, 5, 1) 551e986e25SLuc Michel FIELD(CM_PLLD, LOADPER, 6, 1) 561e986e25SLuc Michel FIELD(CM_PLLD, HOLDPER, 7, 1) 571e986e25SLuc Michel REG32(CM_PLLH, 0x110) 581e986e25SLuc Michel FIELD(CM_PLLH, LOADPIX, 0, 1) 591e986e25SLuc Michel FIELD(CM_PLLH, LOADAUX, 1, 1) 601e986e25SLuc Michel FIELD(CM_PLLH, LOADRCAL, 2, 1) 611e986e25SLuc Michel REG32(CM_PLLB, 0x170) 621e986e25SLuc Michel FIELD(CM_PLLB, LOADARM, 0, 1) 631e986e25SLuc Michel FIELD(CM_PLLB, HOLDARM, 1, 1) 641e986e25SLuc Michel 651e986e25SLuc Michel REG32(A2W_PLLA_CTRL, 0x1100) 661e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, NDIV, 0, 10) 671e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, PDIV, 12, 3) 681e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, PWRDN, 16, 1) 691e986e25SLuc Michel FIELD(A2W_PLLx_CTRL, PRST_DISABLE, 17, 1) 701e986e25SLuc Michel REG32(A2W_PLLC_CTRL, 0x1120) 711e986e25SLuc Michel REG32(A2W_PLLD_CTRL, 0x1140) 721e986e25SLuc Michel REG32(A2W_PLLH_CTRL, 0x1160) 731e986e25SLuc Michel REG32(A2W_PLLB_CTRL, 0x11e0) 741e986e25SLuc Michel 751e986e25SLuc Michel REG32(A2W_PLLA_ANA0, 0x1010) 761e986e25SLuc Michel REG32(A2W_PLLA_ANA1, 0x1014) 771e986e25SLuc Michel FIELD(A2W_PLLx_ANA1, FB_PREDIV, 14, 1) 781e986e25SLuc Michel REG32(A2W_PLLA_ANA2, 0x1018) 791e986e25SLuc Michel REG32(A2W_PLLA_ANA3, 0x101c) 801e986e25SLuc Michel 811e986e25SLuc Michel REG32(A2W_PLLC_ANA0, 0x1030) 821e986e25SLuc Michel REG32(A2W_PLLC_ANA1, 0x1034) 831e986e25SLuc Michel REG32(A2W_PLLC_ANA2, 0x1038) 841e986e25SLuc Michel REG32(A2W_PLLC_ANA3, 0x103c) 851e986e25SLuc Michel 861e986e25SLuc Michel REG32(A2W_PLLD_ANA0, 0x1050) 871e986e25SLuc Michel REG32(A2W_PLLD_ANA1, 0x1054) 881e986e25SLuc Michel REG32(A2W_PLLD_ANA2, 0x1058) 891e986e25SLuc Michel REG32(A2W_PLLD_ANA3, 0x105c) 901e986e25SLuc Michel 911e986e25SLuc Michel REG32(A2W_PLLH_ANA0, 0x1070) 921e986e25SLuc Michel REG32(A2W_PLLH_ANA1, 0x1074) 931e986e25SLuc Michel FIELD(A2W_PLLH_ANA1, FB_PREDIV, 11, 1) 941e986e25SLuc Michel REG32(A2W_PLLH_ANA2, 0x1078) 951e986e25SLuc Michel REG32(A2W_PLLH_ANA3, 0x107c) 961e986e25SLuc Michel 971e986e25SLuc Michel REG32(A2W_PLLB_ANA0, 0x10f0) 981e986e25SLuc Michel REG32(A2W_PLLB_ANA1, 0x10f4) 991e986e25SLuc Michel REG32(A2W_PLLB_ANA2, 0x10f8) 1001e986e25SLuc Michel REG32(A2W_PLLB_ANA3, 0x10fc) 1011e986e25SLuc Michel 1021e986e25SLuc Michel REG32(A2W_PLLA_FRAC, 0x1200) 1031e986e25SLuc Michel FIELD(A2W_PLLx_FRAC, FRAC, 0, 20) 1041e986e25SLuc Michel REG32(A2W_PLLC_FRAC, 0x1220) 1051e986e25SLuc Michel REG32(A2W_PLLD_FRAC, 0x1240) 1061e986e25SLuc Michel REG32(A2W_PLLH_FRAC, 0x1260) 1071e986e25SLuc Michel REG32(A2W_PLLB_FRAC, 0x12e0) 1081e986e25SLuc Michel 10909d56bbcSLuc Michel /* PLL channels */ 11009d56bbcSLuc Michel REG32(A2W_PLLA_DSI0, 0x1300) 11109d56bbcSLuc Michel FIELD(A2W_PLLx_CHANNELy, DIV, 0, 8) 11209d56bbcSLuc Michel FIELD(A2W_PLLx_CHANNELy, DISABLE, 8, 1) 11309d56bbcSLuc Michel REG32(A2W_PLLA_CORE, 0x1400) 11409d56bbcSLuc Michel REG32(A2W_PLLA_PER, 0x1500) 11509d56bbcSLuc Michel REG32(A2W_PLLA_CCP2, 0x1600) 11609d56bbcSLuc Michel 11709d56bbcSLuc Michel REG32(A2W_PLLC_CORE2, 0x1320) 11809d56bbcSLuc Michel REG32(A2W_PLLC_CORE1, 0x1420) 11909d56bbcSLuc Michel REG32(A2W_PLLC_PER, 0x1520) 12009d56bbcSLuc Michel REG32(A2W_PLLC_CORE0, 0x1620) 12109d56bbcSLuc Michel 12209d56bbcSLuc Michel REG32(A2W_PLLD_DSI0, 0x1340) 12309d56bbcSLuc Michel REG32(A2W_PLLD_CORE, 0x1440) 12409d56bbcSLuc Michel REG32(A2W_PLLD_PER, 0x1540) 12509d56bbcSLuc Michel REG32(A2W_PLLD_DSI1, 0x1640) 12609d56bbcSLuc Michel 12709d56bbcSLuc Michel REG32(A2W_PLLH_AUX, 0x1360) 12809d56bbcSLuc Michel REG32(A2W_PLLH_RCAL, 0x1460) 12909d56bbcSLuc Michel REG32(A2W_PLLH_PIX, 0x1560) 13009d56bbcSLuc Michel REG32(A2W_PLLH_STS, 0x1660) 13109d56bbcSLuc Michel 13209d56bbcSLuc Michel REG32(A2W_PLLB_ARM, 0x13e0) 13309d56bbcSLuc Michel 134*72813624SLuc Michel /* Clock muxes */ 135*72813624SLuc Michel REG32(CM_GNRICCTL, 0x000) 136*72813624SLuc Michel FIELD(CM_CLOCKx_CTL, SRC, 0, 4) 137*72813624SLuc Michel FIELD(CM_CLOCKx_CTL, ENABLE, 4, 1) 138*72813624SLuc Michel FIELD(CM_CLOCKx_CTL, KILL, 5, 1) 139*72813624SLuc Michel FIELD(CM_CLOCKx_CTL, GATE, 6, 1) 140*72813624SLuc Michel FIELD(CM_CLOCKx_CTL, BUSY, 7, 1) 141*72813624SLuc Michel FIELD(CM_CLOCKx_CTL, BUSYD, 8, 1) 142*72813624SLuc Michel FIELD(CM_CLOCKx_CTL, MASH, 9, 2) 143*72813624SLuc Michel FIELD(CM_CLOCKx_CTL, FLIP, 11, 1) 144*72813624SLuc Michel REG32(CM_GNRICDIV, 0x004) 145*72813624SLuc Michel FIELD(CM_CLOCKx_DIV, FRAC, 0, 12) 146*72813624SLuc Michel REG32(CM_VPUCTL, 0x008) 147*72813624SLuc Michel REG32(CM_VPUDIV, 0x00c) 148*72813624SLuc Michel REG32(CM_SYSCTL, 0x010) 149*72813624SLuc Michel REG32(CM_SYSDIV, 0x014) 150*72813624SLuc Michel REG32(CM_PERIACTL, 0x018) 151*72813624SLuc Michel REG32(CM_PERIADIV, 0x01c) 152*72813624SLuc Michel REG32(CM_PERIICTL, 0x020) 153*72813624SLuc Michel REG32(CM_PERIIDIV, 0x024) 154*72813624SLuc Michel REG32(CM_H264CTL, 0x028) 155*72813624SLuc Michel REG32(CM_H264DIV, 0x02c) 156*72813624SLuc Michel REG32(CM_ISPCTL, 0x030) 157*72813624SLuc Michel REG32(CM_ISPDIV, 0x034) 158*72813624SLuc Michel REG32(CM_V3DCTL, 0x038) 159*72813624SLuc Michel REG32(CM_V3DDIV, 0x03c) 160*72813624SLuc Michel REG32(CM_CAM0CTL, 0x040) 161*72813624SLuc Michel REG32(CM_CAM0DIV, 0x044) 162*72813624SLuc Michel REG32(CM_CAM1CTL, 0x048) 163*72813624SLuc Michel REG32(CM_CAM1DIV, 0x04c) 164*72813624SLuc Michel REG32(CM_CCP2CTL, 0x050) 165*72813624SLuc Michel REG32(CM_CCP2DIV, 0x054) 166*72813624SLuc Michel REG32(CM_DSI0ECTL, 0x058) 167*72813624SLuc Michel REG32(CM_DSI0EDIV, 0x05c) 168*72813624SLuc Michel REG32(CM_DSI0PCTL, 0x060) 169*72813624SLuc Michel REG32(CM_DSI0PDIV, 0x064) 170*72813624SLuc Michel REG32(CM_DPICTL, 0x068) 171*72813624SLuc Michel REG32(CM_DPIDIV, 0x06c) 172*72813624SLuc Michel REG32(CM_GP0CTL, 0x070) 173*72813624SLuc Michel REG32(CM_GP0DIV, 0x074) 174*72813624SLuc Michel REG32(CM_GP1CTL, 0x078) 175*72813624SLuc Michel REG32(CM_GP1DIV, 0x07c) 176*72813624SLuc Michel REG32(CM_GP2CTL, 0x080) 177*72813624SLuc Michel REG32(CM_GP2DIV, 0x084) 178*72813624SLuc Michel REG32(CM_HSMCTL, 0x088) 179*72813624SLuc Michel REG32(CM_HSMDIV, 0x08c) 180*72813624SLuc Michel REG32(CM_OTPCTL, 0x090) 181*72813624SLuc Michel REG32(CM_OTPDIV, 0x094) 182*72813624SLuc Michel REG32(CM_PCMCTL, 0x098) 183*72813624SLuc Michel REG32(CM_PCMDIV, 0x09c) 184*72813624SLuc Michel REG32(CM_PWMCTL, 0x0a0) 185*72813624SLuc Michel REG32(CM_PWMDIV, 0x0a4) 186*72813624SLuc Michel REG32(CM_SLIMCTL, 0x0a8) 187*72813624SLuc Michel REG32(CM_SLIMDIV, 0x0ac) 188*72813624SLuc Michel REG32(CM_SMICTL, 0x0b0) 189*72813624SLuc Michel REG32(CM_SMIDIV, 0x0b4) 190*72813624SLuc Michel REG32(CM_TCNTCTL, 0x0c0) 191*72813624SLuc Michel REG32(CM_TCNTCNT, 0x0c4) 192*72813624SLuc Michel REG32(CM_TECCTL, 0x0c8) 193*72813624SLuc Michel REG32(CM_TECDIV, 0x0cc) 194*72813624SLuc Michel REG32(CM_TD0CTL, 0x0d0) 195*72813624SLuc Michel REG32(CM_TD0DIV, 0x0d4) 196*72813624SLuc Michel REG32(CM_TD1CTL, 0x0d8) 197*72813624SLuc Michel REG32(CM_TD1DIV, 0x0dc) 198*72813624SLuc Michel REG32(CM_TSENSCTL, 0x0e0) 199*72813624SLuc Michel REG32(CM_TSENSDIV, 0x0e4) 200*72813624SLuc Michel REG32(CM_TIMERCTL, 0x0e8) 201*72813624SLuc Michel REG32(CM_TIMERDIV, 0x0ec) 202*72813624SLuc Michel REG32(CM_UARTCTL, 0x0f0) 203*72813624SLuc Michel REG32(CM_UARTDIV, 0x0f4) 204*72813624SLuc Michel REG32(CM_VECCTL, 0x0f8) 205*72813624SLuc Michel REG32(CM_VECDIV, 0x0fc) 206*72813624SLuc Michel REG32(CM_PULSECTL, 0x190) 207*72813624SLuc Michel REG32(CM_PULSEDIV, 0x194) 208*72813624SLuc Michel REG32(CM_SDCCTL, 0x1a8) 209*72813624SLuc Michel REG32(CM_SDCDIV, 0x1ac) 210*72813624SLuc Michel REG32(CM_ARMCTL, 0x1b0) 211*72813624SLuc Michel REG32(CM_AVEOCTL, 0x1b8) 212*72813624SLuc Michel REG32(CM_AVEODIV, 0x1bc) 213*72813624SLuc Michel REG32(CM_EMMCCTL, 0x1c0) 214*72813624SLuc Michel REG32(CM_EMMCDIV, 0x1c4) 215*72813624SLuc Michel REG32(CM_EMMC2CTL, 0x1d0) 216*72813624SLuc Michel REG32(CM_EMMC2DIV, 0x1d4) 217*72813624SLuc Michel 2186d2b874cSLuc Michel /* misc registers */ 2196d2b874cSLuc Michel REG32(CM_LOCK, 0x114) 2206d2b874cSLuc Michel FIELD(CM_LOCK, FLOCKH, 12, 1) 2216d2b874cSLuc Michel FIELD(CM_LOCK, FLOCKD, 11, 1) 2226d2b874cSLuc Michel FIELD(CM_LOCK, FLOCKC, 10, 1) 2236d2b874cSLuc Michel FIELD(CM_LOCK, FLOCKB, 9, 1) 2246d2b874cSLuc Michel FIELD(CM_LOCK, FLOCKA, 8, 1) 2256d2b874cSLuc Michel 226fc14176bSLuc Michel /* 227fc14176bSLuc Michel * This field is common to all registers. Each register write value must match 228fc14176bSLuc Michel * the CPRMAN_PASSWORD magic value in its 8 MSB. 229fc14176bSLuc Michel */ 230fc14176bSLuc Michel FIELD(CPRMAN, PASSWORD, 24, 8) 231fc14176bSLuc Michel #define CPRMAN_PASSWORD 0x5a 232fc14176bSLuc Michel 2331e986e25SLuc Michel /* PLL init info */ 2341e986e25SLuc Michel typedef struct PLLInitInfo { 2351e986e25SLuc Michel const char *name; 2361e986e25SLuc Michel size_t cm_offset; 2371e986e25SLuc Michel size_t a2w_ctrl_offset; 2381e986e25SLuc Michel size_t a2w_ana_offset; 2391e986e25SLuc Michel uint32_t prediv_mask; /* Prediv bit in ana[1] */ 2401e986e25SLuc Michel size_t a2w_frac_offset; 2411e986e25SLuc Michel } PLLInitInfo; 2421e986e25SLuc Michel 2431e986e25SLuc Michel #define FILL_PLL_INIT_INFO(pll_) \ 2441e986e25SLuc Michel .cm_offset = R_CM_ ## pll_, \ 2451e986e25SLuc Michel .a2w_ctrl_offset = R_A2W_ ## pll_ ## _CTRL, \ 2461e986e25SLuc Michel .a2w_ana_offset = R_A2W_ ## pll_ ## _ANA0, \ 2471e986e25SLuc Michel .a2w_frac_offset = R_A2W_ ## pll_ ## _FRAC 2481e986e25SLuc Michel 2491e986e25SLuc Michel static const PLLInitInfo PLL_INIT_INFO[] = { 2501e986e25SLuc Michel [CPRMAN_PLLA] = { 2511e986e25SLuc Michel .name = "plla", 2521e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 2531e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLA), 2541e986e25SLuc Michel }, 2551e986e25SLuc Michel [CPRMAN_PLLC] = { 2561e986e25SLuc Michel .name = "pllc", 2571e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 2581e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLC), 2591e986e25SLuc Michel }, 2601e986e25SLuc Michel [CPRMAN_PLLD] = { 2611e986e25SLuc Michel .name = "plld", 2621e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 2631e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLD), 2641e986e25SLuc Michel }, 2651e986e25SLuc Michel [CPRMAN_PLLH] = { 2661e986e25SLuc Michel .name = "pllh", 2671e986e25SLuc Michel .prediv_mask = R_A2W_PLLH_ANA1_FB_PREDIV_MASK, 2681e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLH), 2691e986e25SLuc Michel }, 2701e986e25SLuc Michel [CPRMAN_PLLB] = { 2711e986e25SLuc Michel .name = "pllb", 2721e986e25SLuc Michel .prediv_mask = R_A2W_PLLx_ANA1_FB_PREDIV_MASK, 2731e986e25SLuc Michel FILL_PLL_INIT_INFO(PLLB), 2741e986e25SLuc Michel }, 2751e986e25SLuc Michel }; 2761e986e25SLuc Michel 2771e986e25SLuc Michel #undef FILL_PLL_CHANNEL_INIT_INFO 2781e986e25SLuc Michel 2791e986e25SLuc Michel static inline void set_pll_init_info(BCM2835CprmanState *s, 2801e986e25SLuc Michel CprmanPllState *pll, 2811e986e25SLuc Michel CprmanPll id) 2821e986e25SLuc Michel { 2831e986e25SLuc Michel pll->id = id; 2841e986e25SLuc Michel pll->reg_cm = &s->regs[PLL_INIT_INFO[id].cm_offset]; 2851e986e25SLuc Michel pll->reg_a2w_ctrl = &s->regs[PLL_INIT_INFO[id].a2w_ctrl_offset]; 2861e986e25SLuc Michel pll->reg_a2w_ana = &s->regs[PLL_INIT_INFO[id].a2w_ana_offset]; 2871e986e25SLuc Michel pll->prediv_mask = PLL_INIT_INFO[id].prediv_mask; 2881e986e25SLuc Michel pll->reg_a2w_frac = &s->regs[PLL_INIT_INFO[id].a2w_frac_offset]; 2891e986e25SLuc Michel } 2901e986e25SLuc Michel 29109d56bbcSLuc Michel 29209d56bbcSLuc Michel /* PLL channel init info */ 29309d56bbcSLuc Michel typedef struct PLLChannelInitInfo { 29409d56bbcSLuc Michel const char *name; 29509d56bbcSLuc Michel CprmanPll parent; 29609d56bbcSLuc Michel size_t cm_offset; 29709d56bbcSLuc Michel uint32_t cm_hold_mask; 29809d56bbcSLuc Michel uint32_t cm_load_mask; 29909d56bbcSLuc Michel size_t a2w_ctrl_offset; 30009d56bbcSLuc Michel unsigned int fixed_divider; 30109d56bbcSLuc Michel } PLLChannelInitInfo; 30209d56bbcSLuc Michel 30309d56bbcSLuc Michel #define FILL_PLL_CHANNEL_INIT_INFO_common(pll_, channel_) \ 30409d56bbcSLuc Michel .parent = CPRMAN_ ## pll_, \ 30509d56bbcSLuc Michel .cm_offset = R_CM_ ## pll_, \ 30609d56bbcSLuc Michel .cm_load_mask = R_CM_ ## pll_ ## _ ## LOAD ## channel_ ## _MASK, \ 30709d56bbcSLuc Michel .a2w_ctrl_offset = R_A2W_ ## pll_ ## _ ## channel_ 30809d56bbcSLuc Michel 30909d56bbcSLuc Michel #define FILL_PLL_CHANNEL_INIT_INFO(pll_, channel_) \ 31009d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO_common(pll_, channel_), \ 31109d56bbcSLuc Michel .cm_hold_mask = R_CM_ ## pll_ ## _ ## HOLD ## channel_ ## _MASK, \ 31209d56bbcSLuc Michel .fixed_divider = 1 31309d56bbcSLuc Michel 31409d56bbcSLuc Michel #define FILL_PLL_CHANNEL_INIT_INFO_nohold(pll_, channel_) \ 31509d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO_common(pll_, channel_), \ 31609d56bbcSLuc Michel .cm_hold_mask = 0 31709d56bbcSLuc Michel 31809d56bbcSLuc Michel static PLLChannelInitInfo PLL_CHANNEL_INIT_INFO[] = { 31909d56bbcSLuc Michel [CPRMAN_PLLA_CHANNEL_DSI0] = { 32009d56bbcSLuc Michel .name = "plla-dsi0", 32109d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLA, DSI0), 32209d56bbcSLuc Michel }, 32309d56bbcSLuc Michel [CPRMAN_PLLA_CHANNEL_CORE] = { 32409d56bbcSLuc Michel .name = "plla-core", 32509d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLA, CORE), 32609d56bbcSLuc Michel }, 32709d56bbcSLuc Michel [CPRMAN_PLLA_CHANNEL_PER] = { 32809d56bbcSLuc Michel .name = "plla-per", 32909d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLA, PER), 33009d56bbcSLuc Michel }, 33109d56bbcSLuc Michel [CPRMAN_PLLA_CHANNEL_CCP2] = { 33209d56bbcSLuc Michel .name = "plla-ccp2", 33309d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLA, CCP2), 33409d56bbcSLuc Michel }, 33509d56bbcSLuc Michel 33609d56bbcSLuc Michel [CPRMAN_PLLC_CHANNEL_CORE2] = { 33709d56bbcSLuc Michel .name = "pllc-core2", 33809d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLC, CORE2), 33909d56bbcSLuc Michel }, 34009d56bbcSLuc Michel [CPRMAN_PLLC_CHANNEL_CORE1] = { 34109d56bbcSLuc Michel .name = "pllc-core1", 34209d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLC, CORE1), 34309d56bbcSLuc Michel }, 34409d56bbcSLuc Michel [CPRMAN_PLLC_CHANNEL_PER] = { 34509d56bbcSLuc Michel .name = "pllc-per", 34609d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLC, PER), 34709d56bbcSLuc Michel }, 34809d56bbcSLuc Michel [CPRMAN_PLLC_CHANNEL_CORE0] = { 34909d56bbcSLuc Michel .name = "pllc-core0", 35009d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLC, CORE0), 35109d56bbcSLuc Michel }, 35209d56bbcSLuc Michel 35309d56bbcSLuc Michel [CPRMAN_PLLD_CHANNEL_DSI0] = { 35409d56bbcSLuc Michel .name = "plld-dsi0", 35509d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLD, DSI0), 35609d56bbcSLuc Michel }, 35709d56bbcSLuc Michel [CPRMAN_PLLD_CHANNEL_CORE] = { 35809d56bbcSLuc Michel .name = "plld-core", 35909d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLD, CORE), 36009d56bbcSLuc Michel }, 36109d56bbcSLuc Michel [CPRMAN_PLLD_CHANNEL_PER] = { 36209d56bbcSLuc Michel .name = "plld-per", 36309d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLD, PER), 36409d56bbcSLuc Michel }, 36509d56bbcSLuc Michel [CPRMAN_PLLD_CHANNEL_DSI1] = { 36609d56bbcSLuc Michel .name = "plld-dsi1", 36709d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLD, DSI1), 36809d56bbcSLuc Michel }, 36909d56bbcSLuc Michel 37009d56bbcSLuc Michel [CPRMAN_PLLH_CHANNEL_AUX] = { 37109d56bbcSLuc Michel .name = "pllh-aux", 37209d56bbcSLuc Michel .fixed_divider = 1, 37309d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO_nohold(PLLH, AUX), 37409d56bbcSLuc Michel }, 37509d56bbcSLuc Michel [CPRMAN_PLLH_CHANNEL_RCAL] = { 37609d56bbcSLuc Michel .name = "pllh-rcal", 37709d56bbcSLuc Michel .fixed_divider = 10, 37809d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO_nohold(PLLH, RCAL), 37909d56bbcSLuc Michel }, 38009d56bbcSLuc Michel [CPRMAN_PLLH_CHANNEL_PIX] = { 38109d56bbcSLuc Michel .name = "pllh-pix", 38209d56bbcSLuc Michel .fixed_divider = 10, 38309d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO_nohold(PLLH, PIX), 38409d56bbcSLuc Michel }, 38509d56bbcSLuc Michel 38609d56bbcSLuc Michel [CPRMAN_PLLB_CHANNEL_ARM] = { 38709d56bbcSLuc Michel .name = "pllb-arm", 38809d56bbcSLuc Michel FILL_PLL_CHANNEL_INIT_INFO(PLLB, ARM), 38909d56bbcSLuc Michel }, 39009d56bbcSLuc Michel }; 39109d56bbcSLuc Michel 39209d56bbcSLuc Michel #undef FILL_PLL_CHANNEL_INIT_INFO_nohold 39309d56bbcSLuc Michel #undef FILL_PLL_CHANNEL_INIT_INFO 39409d56bbcSLuc Michel #undef FILL_PLL_CHANNEL_INIT_INFO_common 39509d56bbcSLuc Michel 39609d56bbcSLuc Michel static inline void set_pll_channel_init_info(BCM2835CprmanState *s, 39709d56bbcSLuc Michel CprmanPllChannelState *channel, 39809d56bbcSLuc Michel CprmanPllChannel id) 39909d56bbcSLuc Michel { 40009d56bbcSLuc Michel channel->id = id; 40109d56bbcSLuc Michel channel->parent = PLL_CHANNEL_INIT_INFO[id].parent; 40209d56bbcSLuc Michel channel->reg_cm = &s->regs[PLL_CHANNEL_INIT_INFO[id].cm_offset]; 40309d56bbcSLuc Michel channel->hold_mask = PLL_CHANNEL_INIT_INFO[id].cm_hold_mask; 40409d56bbcSLuc Michel channel->load_mask = PLL_CHANNEL_INIT_INFO[id].cm_load_mask; 40509d56bbcSLuc Michel channel->reg_a2w_ctrl = &s->regs[PLL_CHANNEL_INIT_INFO[id].a2w_ctrl_offset]; 40609d56bbcSLuc Michel channel->fixed_divider = PLL_CHANNEL_INIT_INFO[id].fixed_divider; 40709d56bbcSLuc Michel } 40809d56bbcSLuc Michel 409*72813624SLuc Michel /* Clock mux init info */ 410*72813624SLuc Michel typedef struct ClockMuxInitInfo { 411*72813624SLuc Michel const char *name; 412*72813624SLuc Michel size_t cm_offset; /* cm_offset[0]->CM_CTL, cm_offset[1]->CM_DIV */ 413*72813624SLuc Michel int int_bits; 414*72813624SLuc Michel int frac_bits; 415*72813624SLuc Michel 416*72813624SLuc Michel CprmanPllChannel src_mapping[CPRMAN_NUM_CLOCK_MUX_SRC]; 417*72813624SLuc Michel } ClockMuxInitInfo; 418*72813624SLuc Michel 419*72813624SLuc Michel /* 420*72813624SLuc Michel * Each clock mux can have up to 10 sources. Sources 0 to 3 are always the 421*72813624SLuc Michel * same (ground, xosc, td0, td1). Sources 4 to 9 are mux specific, and are not 422*72813624SLuc Michel * always populated. The following macros catch all those cases. 423*72813624SLuc Michel */ 424*72813624SLuc Michel 425*72813624SLuc Michel /* Unknown mapping. Connect everything to ground */ 426*72813624SLuc Michel #define SRC_MAPPING_INFO_unknown \ 427*72813624SLuc Michel .src_mapping = { \ 428*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, /* gnd */ \ 429*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, /* xosc */ \ 430*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, /* test debug 0 */ \ 431*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, /* test debug 1 */ \ 432*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, /* pll a */ \ 433*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, /* pll c */ \ 434*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, /* pll d */ \ 435*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, /* pll h */ \ 436*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, /* pll c, core1 */ \ 437*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, /* pll c, core2 */ \ 438*72813624SLuc Michel } 439*72813624SLuc Michel 440*72813624SLuc Michel /* Only the oscillator and the two test debug clocks */ 441*72813624SLuc Michel #define SRC_MAPPING_INFO_xosc \ 442*72813624SLuc Michel .src_mapping = { \ 443*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 444*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 445*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 446*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 447*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 448*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 449*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 450*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 451*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 452*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 453*72813624SLuc Michel } 454*72813624SLuc Michel 455*72813624SLuc Michel /* All the PLL "core" channels */ 456*72813624SLuc Michel #define SRC_MAPPING_INFO_core \ 457*72813624SLuc Michel .src_mapping = { \ 458*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 459*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 460*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 461*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 462*72813624SLuc Michel CPRMAN_PLLA_CHANNEL_CORE, \ 463*72813624SLuc Michel CPRMAN_PLLC_CHANNEL_CORE0, \ 464*72813624SLuc Michel CPRMAN_PLLD_CHANNEL_CORE, \ 465*72813624SLuc Michel CPRMAN_PLLH_CHANNEL_AUX, \ 466*72813624SLuc Michel CPRMAN_PLLC_CHANNEL_CORE1, \ 467*72813624SLuc Michel CPRMAN_PLLC_CHANNEL_CORE2, \ 468*72813624SLuc Michel } 469*72813624SLuc Michel 470*72813624SLuc Michel /* All the PLL "per" channels */ 471*72813624SLuc Michel #define SRC_MAPPING_INFO_periph \ 472*72813624SLuc Michel .src_mapping = { \ 473*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 474*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 475*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 476*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 477*72813624SLuc Michel CPRMAN_PLLA_CHANNEL_PER, \ 478*72813624SLuc Michel CPRMAN_PLLC_CHANNEL_PER, \ 479*72813624SLuc Michel CPRMAN_PLLD_CHANNEL_PER, \ 480*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 481*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 482*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 483*72813624SLuc Michel } 484*72813624SLuc Michel 485*72813624SLuc Michel /* 486*72813624SLuc Michel * The DSI0 channels. This one got an intermediate mux between the PLL channels 487*72813624SLuc Michel * and the clock input. 488*72813624SLuc Michel */ 489*72813624SLuc Michel #define SRC_MAPPING_INFO_dsi0 \ 490*72813624SLuc Michel .src_mapping = { \ 491*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 492*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 493*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 494*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 495*72813624SLuc Michel CPRMAN_CLOCK_SRC_DSI0HSCK, \ 496*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 497*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 498*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 499*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 500*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 501*72813624SLuc Michel } 502*72813624SLuc Michel 503*72813624SLuc Michel /* The DSI1 channel */ 504*72813624SLuc Michel #define SRC_MAPPING_INFO_dsi1 \ 505*72813624SLuc Michel .src_mapping = { \ 506*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 507*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 508*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 509*72813624SLuc Michel CPRMAN_CLOCK_SRC_NORMAL, \ 510*72813624SLuc Michel CPRMAN_PLLD_CHANNEL_DSI1, \ 511*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 512*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 513*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 514*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 515*72813624SLuc Michel CPRMAN_CLOCK_SRC_FORCE_GROUND, \ 516*72813624SLuc Michel } 517*72813624SLuc Michel 518*72813624SLuc Michel #define FILL_CLOCK_MUX_SRC_MAPPING_INIT_INFO(kind_) \ 519*72813624SLuc Michel SRC_MAPPING_INFO_ ## kind_ 520*72813624SLuc Michel 521*72813624SLuc Michel #define FILL_CLOCK_MUX_INIT_INFO(clock_, kind_) \ 522*72813624SLuc Michel .cm_offset = R_CM_ ## clock_ ## CTL, \ 523*72813624SLuc Michel FILL_CLOCK_MUX_SRC_MAPPING_INIT_INFO(kind_) 524*72813624SLuc Michel 525*72813624SLuc Michel static ClockMuxInitInfo CLOCK_MUX_INIT_INFO[] = { 526*72813624SLuc Michel [CPRMAN_CLOCK_GNRIC] = { 527*72813624SLuc Michel .name = "gnric", 528*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(GNRIC, unknown), 529*72813624SLuc Michel }, 530*72813624SLuc Michel [CPRMAN_CLOCK_VPU] = { 531*72813624SLuc Michel .name = "vpu", 532*72813624SLuc Michel .int_bits = 12, 533*72813624SLuc Michel .frac_bits = 8, 534*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(VPU, core), 535*72813624SLuc Michel }, 536*72813624SLuc Michel [CPRMAN_CLOCK_SYS] = { 537*72813624SLuc Michel .name = "sys", 538*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(SYS, unknown), 539*72813624SLuc Michel }, 540*72813624SLuc Michel [CPRMAN_CLOCK_PERIA] = { 541*72813624SLuc Michel .name = "peria", 542*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(PERIA, unknown), 543*72813624SLuc Michel }, 544*72813624SLuc Michel [CPRMAN_CLOCK_PERII] = { 545*72813624SLuc Michel .name = "perii", 546*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(PERII, unknown), 547*72813624SLuc Michel }, 548*72813624SLuc Michel [CPRMAN_CLOCK_H264] = { 549*72813624SLuc Michel .name = "h264", 550*72813624SLuc Michel .int_bits = 4, 551*72813624SLuc Michel .frac_bits = 8, 552*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(H264, core), 553*72813624SLuc Michel }, 554*72813624SLuc Michel [CPRMAN_CLOCK_ISP] = { 555*72813624SLuc Michel .name = "isp", 556*72813624SLuc Michel .int_bits = 4, 557*72813624SLuc Michel .frac_bits = 8, 558*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(ISP, core), 559*72813624SLuc Michel }, 560*72813624SLuc Michel [CPRMAN_CLOCK_V3D] = { 561*72813624SLuc Michel .name = "v3d", 562*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(V3D, core), 563*72813624SLuc Michel }, 564*72813624SLuc Michel [CPRMAN_CLOCK_CAM0] = { 565*72813624SLuc Michel .name = "cam0", 566*72813624SLuc Michel .int_bits = 4, 567*72813624SLuc Michel .frac_bits = 8, 568*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(CAM0, periph), 569*72813624SLuc Michel }, 570*72813624SLuc Michel [CPRMAN_CLOCK_CAM1] = { 571*72813624SLuc Michel .name = "cam1", 572*72813624SLuc Michel .int_bits = 4, 573*72813624SLuc Michel .frac_bits = 8, 574*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(CAM1, periph), 575*72813624SLuc Michel }, 576*72813624SLuc Michel [CPRMAN_CLOCK_CCP2] = { 577*72813624SLuc Michel .name = "ccp2", 578*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(CCP2, unknown), 579*72813624SLuc Michel }, 580*72813624SLuc Michel [CPRMAN_CLOCK_DSI0E] = { 581*72813624SLuc Michel .name = "dsi0e", 582*72813624SLuc Michel .int_bits = 4, 583*72813624SLuc Michel .frac_bits = 8, 584*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(DSI0E, dsi0), 585*72813624SLuc Michel }, 586*72813624SLuc Michel [CPRMAN_CLOCK_DSI0P] = { 587*72813624SLuc Michel .name = "dsi0p", 588*72813624SLuc Michel .int_bits = 0, 589*72813624SLuc Michel .frac_bits = 0, 590*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(DSI0P, dsi0), 591*72813624SLuc Michel }, 592*72813624SLuc Michel [CPRMAN_CLOCK_DPI] = { 593*72813624SLuc Michel .name = "dpi", 594*72813624SLuc Michel .int_bits = 4, 595*72813624SLuc Michel .frac_bits = 8, 596*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(DPI, periph), 597*72813624SLuc Michel }, 598*72813624SLuc Michel [CPRMAN_CLOCK_GP0] = { 599*72813624SLuc Michel .name = "gp0", 600*72813624SLuc Michel .int_bits = 12, 601*72813624SLuc Michel .frac_bits = 12, 602*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(GP0, periph), 603*72813624SLuc Michel }, 604*72813624SLuc Michel [CPRMAN_CLOCK_GP1] = { 605*72813624SLuc Michel .name = "gp1", 606*72813624SLuc Michel .int_bits = 12, 607*72813624SLuc Michel .frac_bits = 12, 608*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(GP1, periph), 609*72813624SLuc Michel }, 610*72813624SLuc Michel [CPRMAN_CLOCK_GP2] = { 611*72813624SLuc Michel .name = "gp2", 612*72813624SLuc Michel .int_bits = 12, 613*72813624SLuc Michel .frac_bits = 12, 614*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(GP2, periph), 615*72813624SLuc Michel }, 616*72813624SLuc Michel [CPRMAN_CLOCK_HSM] = { 617*72813624SLuc Michel .name = "hsm", 618*72813624SLuc Michel .int_bits = 4, 619*72813624SLuc Michel .frac_bits = 8, 620*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(HSM, periph), 621*72813624SLuc Michel }, 622*72813624SLuc Michel [CPRMAN_CLOCK_OTP] = { 623*72813624SLuc Michel .name = "otp", 624*72813624SLuc Michel .int_bits = 4, 625*72813624SLuc Michel .frac_bits = 0, 626*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(OTP, xosc), 627*72813624SLuc Michel }, 628*72813624SLuc Michel [CPRMAN_CLOCK_PCM] = { 629*72813624SLuc Michel .name = "pcm", 630*72813624SLuc Michel .int_bits = 12, 631*72813624SLuc Michel .frac_bits = 12, 632*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(PCM, periph), 633*72813624SLuc Michel }, 634*72813624SLuc Michel [CPRMAN_CLOCK_PWM] = { 635*72813624SLuc Michel .name = "pwm", 636*72813624SLuc Michel .int_bits = 12, 637*72813624SLuc Michel .frac_bits = 12, 638*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(PWM, periph), 639*72813624SLuc Michel }, 640*72813624SLuc Michel [CPRMAN_CLOCK_SLIM] = { 641*72813624SLuc Michel .name = "slim", 642*72813624SLuc Michel .int_bits = 12, 643*72813624SLuc Michel .frac_bits = 12, 644*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(SLIM, periph), 645*72813624SLuc Michel }, 646*72813624SLuc Michel [CPRMAN_CLOCK_SMI] = { 647*72813624SLuc Michel .name = "smi", 648*72813624SLuc Michel .int_bits = 4, 649*72813624SLuc Michel .frac_bits = 8, 650*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(SMI, periph), 651*72813624SLuc Michel }, 652*72813624SLuc Michel [CPRMAN_CLOCK_TEC] = { 653*72813624SLuc Michel .name = "tec", 654*72813624SLuc Michel .int_bits = 6, 655*72813624SLuc Michel .frac_bits = 0, 656*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(TEC, xosc), 657*72813624SLuc Michel }, 658*72813624SLuc Michel [CPRMAN_CLOCK_TD0] = { 659*72813624SLuc Michel .name = "td0", 660*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(TD0, unknown), 661*72813624SLuc Michel }, 662*72813624SLuc Michel [CPRMAN_CLOCK_TD1] = { 663*72813624SLuc Michel .name = "td1", 664*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(TD1, unknown), 665*72813624SLuc Michel }, 666*72813624SLuc Michel [CPRMAN_CLOCK_TSENS] = { 667*72813624SLuc Michel .name = "tsens", 668*72813624SLuc Michel .int_bits = 5, 669*72813624SLuc Michel .frac_bits = 0, 670*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(TSENS, xosc), 671*72813624SLuc Michel }, 672*72813624SLuc Michel [CPRMAN_CLOCK_TIMER] = { 673*72813624SLuc Michel .name = "timer", 674*72813624SLuc Michel .int_bits = 6, 675*72813624SLuc Michel .frac_bits = 12, 676*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(TIMER, xosc), 677*72813624SLuc Michel }, 678*72813624SLuc Michel [CPRMAN_CLOCK_UART] = { 679*72813624SLuc Michel .name = "uart", 680*72813624SLuc Michel .int_bits = 10, 681*72813624SLuc Michel .frac_bits = 12, 682*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(UART, periph), 683*72813624SLuc Michel }, 684*72813624SLuc Michel [CPRMAN_CLOCK_VEC] = { 685*72813624SLuc Michel .name = "vec", 686*72813624SLuc Michel .int_bits = 4, 687*72813624SLuc Michel .frac_bits = 0, 688*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(VEC, periph), 689*72813624SLuc Michel }, 690*72813624SLuc Michel [CPRMAN_CLOCK_PULSE] = { 691*72813624SLuc Michel .name = "pulse", 692*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(PULSE, xosc), 693*72813624SLuc Michel }, 694*72813624SLuc Michel [CPRMAN_CLOCK_SDC] = { 695*72813624SLuc Michel .name = "sdram", 696*72813624SLuc Michel .int_bits = 6, 697*72813624SLuc Michel .frac_bits = 0, 698*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(SDC, core), 699*72813624SLuc Michel }, 700*72813624SLuc Michel [CPRMAN_CLOCK_ARM] = { 701*72813624SLuc Michel .name = "arm", 702*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(ARM, unknown), 703*72813624SLuc Michel }, 704*72813624SLuc Michel [CPRMAN_CLOCK_AVEO] = { 705*72813624SLuc Michel .name = "aveo", 706*72813624SLuc Michel .int_bits = 4, 707*72813624SLuc Michel .frac_bits = 0, 708*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(AVEO, periph), 709*72813624SLuc Michel }, 710*72813624SLuc Michel [CPRMAN_CLOCK_EMMC] = { 711*72813624SLuc Michel .name = "emmc", 712*72813624SLuc Michel .int_bits = 4, 713*72813624SLuc Michel .frac_bits = 8, 714*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(EMMC, periph), 715*72813624SLuc Michel }, 716*72813624SLuc Michel [CPRMAN_CLOCK_EMMC2] = { 717*72813624SLuc Michel .name = "emmc2", 718*72813624SLuc Michel .int_bits = 4, 719*72813624SLuc Michel .frac_bits = 8, 720*72813624SLuc Michel FILL_CLOCK_MUX_INIT_INFO(EMMC2, unknown), 721*72813624SLuc Michel }, 722*72813624SLuc Michel }; 723*72813624SLuc Michel 724*72813624SLuc Michel #undef FILL_CLOCK_MUX_INIT_INFO 725*72813624SLuc Michel #undef FILL_CLOCK_MUX_SRC_MAPPING_INIT_INFO 726*72813624SLuc Michel #undef SRC_MAPPING_INFO_dsi1 727*72813624SLuc Michel #undef SRC_MAPPING_INFO_dsi0 728*72813624SLuc Michel #undef SRC_MAPPING_INFO_periph 729*72813624SLuc Michel #undef SRC_MAPPING_INFO_core 730*72813624SLuc Michel #undef SRC_MAPPING_INFO_xosc 731*72813624SLuc Michel #undef SRC_MAPPING_INFO_unknown 732*72813624SLuc Michel 733*72813624SLuc Michel static inline void set_clock_mux_init_info(BCM2835CprmanState *s, 734*72813624SLuc Michel CprmanClockMuxState *mux, 735*72813624SLuc Michel CprmanClockMux id) 736*72813624SLuc Michel { 737*72813624SLuc Michel mux->id = id; 738*72813624SLuc Michel mux->reg_ctl = &s->regs[CLOCK_MUX_INIT_INFO[id].cm_offset]; 739*72813624SLuc Michel mux->reg_div = &s->regs[CLOCK_MUX_INIT_INFO[id].cm_offset + 1]; 740*72813624SLuc Michel mux->int_bits = CLOCK_MUX_INIT_INFO[id].int_bits; 741*72813624SLuc Michel mux->frac_bits = CLOCK_MUX_INIT_INFO[id].frac_bits; 742*72813624SLuc Michel } 743*72813624SLuc Michel 744fc14176bSLuc Michel #endif 745