xref: /qemu/include/hw/misc/bcm2835_cprman_internals.h (revision 7281362484ac1c1bc854ca17291c4078e870eec2)
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