1
2
3
4
5
6
7
8
9#ifndef HW_MISC_CPRMAN_H
10#define HW_MISC_CPRMAN_H
11
12#include "hw/sysbus.h"
13#include "hw/qdev-clock.h"
14
15#define TYPE_BCM2835_CPRMAN "bcm2835-cprman"
16
17typedef struct BCM2835CprmanState BCM2835CprmanState;
18
19DECLARE_INSTANCE_CHECKER(BCM2835CprmanState, CPRMAN,
20 TYPE_BCM2835_CPRMAN)
21
22#define CPRMAN_NUM_REGS (0x2000 / sizeof(uint32_t))
23
24typedef enum CprmanPll {
25 CPRMAN_PLLA = 0,
26 CPRMAN_PLLC,
27 CPRMAN_PLLD,
28 CPRMAN_PLLH,
29 CPRMAN_PLLB,
30
31 CPRMAN_NUM_PLL
32} CprmanPll;
33
34typedef enum CprmanPllChannel {
35 CPRMAN_PLLA_CHANNEL_DSI0 = 0,
36 CPRMAN_PLLA_CHANNEL_CORE,
37 CPRMAN_PLLA_CHANNEL_PER,
38 CPRMAN_PLLA_CHANNEL_CCP2,
39
40 CPRMAN_PLLC_CHANNEL_CORE2,
41 CPRMAN_PLLC_CHANNEL_CORE1,
42 CPRMAN_PLLC_CHANNEL_PER,
43 CPRMAN_PLLC_CHANNEL_CORE0,
44
45 CPRMAN_PLLD_CHANNEL_DSI0,
46 CPRMAN_PLLD_CHANNEL_CORE,
47 CPRMAN_PLLD_CHANNEL_PER,
48 CPRMAN_PLLD_CHANNEL_DSI1,
49
50 CPRMAN_PLLH_CHANNEL_AUX,
51 CPRMAN_PLLH_CHANNEL_RCAL,
52 CPRMAN_PLLH_CHANNEL_PIX,
53
54 CPRMAN_PLLB_CHANNEL_ARM,
55
56 CPRMAN_NUM_PLL_CHANNEL,
57
58
59 CPRMAN_CLOCK_SRC_NORMAL = -1,
60 CPRMAN_CLOCK_SRC_FORCE_GROUND = -2,
61 CPRMAN_CLOCK_SRC_DSI0HSCK = -3,
62} CprmanPllChannel;
63
64typedef enum CprmanClockMux {
65 CPRMAN_CLOCK_GNRIC,
66 CPRMAN_CLOCK_VPU,
67 CPRMAN_CLOCK_SYS,
68 CPRMAN_CLOCK_PERIA,
69 CPRMAN_CLOCK_PERII,
70 CPRMAN_CLOCK_H264,
71 CPRMAN_CLOCK_ISP,
72 CPRMAN_CLOCK_V3D,
73 CPRMAN_CLOCK_CAM0,
74 CPRMAN_CLOCK_CAM1,
75 CPRMAN_CLOCK_CCP2,
76 CPRMAN_CLOCK_DSI0E,
77 CPRMAN_CLOCK_DSI0P,
78 CPRMAN_CLOCK_DPI,
79 CPRMAN_CLOCK_GP0,
80 CPRMAN_CLOCK_GP1,
81 CPRMAN_CLOCK_GP2,
82 CPRMAN_CLOCK_HSM,
83 CPRMAN_CLOCK_OTP,
84 CPRMAN_CLOCK_PCM,
85 CPRMAN_CLOCK_PWM,
86 CPRMAN_CLOCK_SLIM,
87 CPRMAN_CLOCK_SMI,
88 CPRMAN_CLOCK_TEC,
89 CPRMAN_CLOCK_TD0,
90 CPRMAN_CLOCK_TD1,
91 CPRMAN_CLOCK_TSENS,
92 CPRMAN_CLOCK_TIMER,
93 CPRMAN_CLOCK_UART,
94 CPRMAN_CLOCK_VEC,
95 CPRMAN_CLOCK_PULSE,
96 CPRMAN_CLOCK_SDC,
97 CPRMAN_CLOCK_ARM,
98 CPRMAN_CLOCK_AVEO,
99 CPRMAN_CLOCK_EMMC,
100 CPRMAN_CLOCK_EMMC2,
101
102 CPRMAN_NUM_CLOCK_MUX
103} CprmanClockMux;
104
105typedef enum CprmanClockMuxSource {
106 CPRMAN_CLOCK_SRC_GND = 0,
107 CPRMAN_CLOCK_SRC_XOSC,
108 CPRMAN_CLOCK_SRC_TD0,
109 CPRMAN_CLOCK_SRC_TD1,
110 CPRMAN_CLOCK_SRC_PLLA,
111 CPRMAN_CLOCK_SRC_PLLC,
112 CPRMAN_CLOCK_SRC_PLLD,
113 CPRMAN_CLOCK_SRC_PLLH,
114 CPRMAN_CLOCK_SRC_PLLC_CORE1,
115 CPRMAN_CLOCK_SRC_PLLC_CORE2,
116
117 CPRMAN_NUM_CLOCK_MUX_SRC
118} CprmanClockMuxSource;
119
120typedef struct CprmanPllState {
121
122 DeviceState parent_obj;
123
124
125 CprmanPll id;
126
127 uint32_t *reg_cm;
128 uint32_t *reg_a2w_ctrl;
129 uint32_t *reg_a2w_ana;
130 uint32_t prediv_mask;
131 uint32_t *reg_a2w_frac;
132
133 Clock *xosc_in;
134 Clock *out;
135} CprmanPllState;
136
137typedef struct CprmanPllChannelState {
138
139 DeviceState parent_obj;
140
141
142 CprmanPllChannel id;
143 CprmanPll parent;
144
145 uint32_t *reg_cm;
146 uint32_t hold_mask;
147 uint32_t load_mask;
148 uint32_t *reg_a2w_ctrl;
149 int fixed_divider;
150
151 Clock *pll_in;
152 Clock *out;
153} CprmanPllChannelState;
154
155typedef struct CprmanClockMuxState {
156
157 DeviceState parent_obj;
158
159
160 CprmanClockMux id;
161
162 uint32_t *reg_ctl;
163 uint32_t *reg_div;
164 int int_bits;
165 int frac_bits;
166
167 Clock *srcs[CPRMAN_NUM_CLOCK_MUX_SRC];
168 Clock *out;
169
170
171
172
173
174 struct CprmanClockMuxState *backref[CPRMAN_NUM_CLOCK_MUX_SRC];
175} CprmanClockMuxState;
176
177typedef struct CprmanDsi0HsckMuxState {
178
179 DeviceState parent_obj;
180
181
182 CprmanClockMux id;
183
184 uint32_t *reg_cm;
185
186 Clock *plla_in;
187 Clock *plld_in;
188 Clock *out;
189} CprmanDsi0HsckMuxState;
190
191struct BCM2835CprmanState {
192
193 SysBusDevice parent_obj;
194
195
196 MemoryRegion iomem;
197
198 CprmanPllState plls[CPRMAN_NUM_PLL];
199 CprmanPllChannelState channels[CPRMAN_NUM_PLL_CHANNEL];
200 CprmanClockMuxState clock_muxes[CPRMAN_NUM_CLOCK_MUX];
201 CprmanDsi0HsckMuxState dsi0hsck_mux;
202
203 uint32_t regs[CPRMAN_NUM_REGS];
204 uint32_t xosc_freq;
205
206 Clock *xosc;
207 Clock *gnd;
208};
209
210#endif
211