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