1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include "qemu/osdep.h"
29#include "hw/sysbus.h"
30#include "hw/register-dep.h"
31#include "qemu/bitops.h"
32#include "qemu/log.h"
33#include "qemu/config-file.h"
34#include "sysemu/sysemu.h"
35
36#include "hw/fdt_generic_util.h"
37
38#ifndef XILINX_CRL_APB_ERR_DEBUG
39#define XILINX_CRL_APB_ERR_DEBUG 0
40#endif
41
42#define TYPE_XILINX_CRL_APB "xlnx.zynqmp-crl"
43
44#define XILINX_CRL_APB(obj) \
45 OBJECT_CHECK(CRL_APB, (obj), TYPE_XILINX_CRL_APB)
46
47DEP_REG32(ERR_CTRL, 0x0)
48 DEP_FIELD(ERR_CTRL, SLVERR_ENABLE, 1, 0)
49DEP_REG32(IR_STATUS, 0x4)
50 DEP_FIELD(IR_STATUS, ADDR_DECODE_ERR, 1, 0)
51DEP_REG32(IR_MASK, 0x8)
52 DEP_FIELD(IR_MASK, ADDR_DECODE_ERR, 1, 0)
53DEP_REG32(IR_ENABLE, 0xc)
54 DEP_FIELD(IR_ENABLE, ADDR_DECODE_ERR, 1, 0)
55DEP_REG32(IR_DISABLE, 0x10)
56 DEP_FIELD(IR_DISABLE, ADDR_DECODE_ERR, 1, 0)
57DEP_REG32(CRL_WPROT, 0x1C)
58 DEP_FIELD(CRL_WPROT, ACTIVE, 1, 0)
59DEP_REG32(IOPLL_CTRL, 0x20)
60 DEP_FIELD(IOPLL_CTRL, POST_SRC, 3, 24)
61 DEP_FIELD(IOPLL_CTRL, PRE_SRC, 3, 20)
62 DEP_FIELD(IOPLL_CTRL, DIV2, 1, 16)
63 DEP_FIELD(IOPLL_CTRL, FBDIV, 7, 8)
64 DEP_FIELD(IOPLL_CTRL, BYPASS, 1, 3)
65 DEP_FIELD(IOPLL_CTRL, RESET, 1, 0)
66DEP_REG32(IOPLL_CFG, 0x24)
67 DEP_FIELD(IOPLL_CFG, LOCK_DLY, 7, 25)
68 DEP_FIELD(IOPLL_CFG, LOCK_CNT, 10, 13)
69 DEP_FIELD(IOPLL_CFG, LFHF, 2, 10)
70 DEP_FIELD(IOPLL_CFG, CP, 4, 5)
71 DEP_FIELD(IOPLL_CFG, RES, 4, 0)
72DEP_REG32(IOPLL_FRAC_CFG, 0x28)
73 DEP_FIELD(IOPLL_FRAC_CFG, ENABLED, 1, 31)
74 DEP_FIELD(IOPLL_FRAC_CFG, SEED, 3, 22)
75 DEP_FIELD(IOPLL_FRAC_CFG, ALGRTHM, 1, 19)
76 DEP_FIELD(IOPLL_FRAC_CFG, ORDER, 1, 18)
77 DEP_FIELD(IOPLL_FRAC_CFG, DATA, 16, 0)
78DEP_REG32(RPLL_CTRL, 0x30)
79 DEP_FIELD(RPLL_CTRL, POST_SRC, 3, 24)
80 DEP_FIELD(RPLL_CTRL, PRE_SRC, 3, 20)
81 DEP_FIELD(RPLL_CTRL, DIV2, 1, 16)
82 DEP_FIELD(RPLL_CTRL, FBDIV, 7, 8)
83 DEP_FIELD(RPLL_CTRL, BYPASS, 1, 3)
84 DEP_FIELD(RPLL_CTRL, RESET, 1, 0)
85DEP_REG32(RPLL_CFG, 0x34)
86 DEP_FIELD(RPLL_CFG, LOCK_DLY, 7, 25)
87 DEP_FIELD(RPLL_CFG, LOCK_CNT, 10, 13)
88 DEP_FIELD(RPLL_CFG, LFHF, 2, 10)
89 DEP_FIELD(RPLL_CFG, CP, 4, 5)
90 DEP_FIELD(RPLL_CFG, RES, 4, 0)
91DEP_REG32(RPLL_FRAC_CFG, 0x38)
92 DEP_FIELD(RPLL_FRAC_CFG, ENABLED, 1, 31)
93 DEP_FIELD(RPLL_FRAC_CFG, SEED, 3, 22)
94 DEP_FIELD(RPLL_FRAC_CFG, ALGRTHM, 1, 19)
95 DEP_FIELD(RPLL_FRAC_CFG, ORDER, 1, 18)
96 DEP_FIELD(RPLL_FRAC_CFG, DATA, 16, 0)
97DEP_REG32(PLL_STATUS, 0x40)
98 DEP_FIELD(PLL_STATUS, RPLL_STABLE, 1, 4)
99 DEP_FIELD(PLL_STATUS, IOPLL_STABLE, 1, 3)
100 DEP_FIELD(PLL_STATUS, RPLL_LOCK, 1, 1)
101 DEP_FIELD(PLL_STATUS, IOPLL_LOCK, 1, 0)
102DEP_REG32(IOPLL_TO_FPD_CTRL, 0x44)
103 DEP_FIELD(IOPLL_TO_FPD_CTRL, DIVISOR0, 6, 8)
104DEP_REG32(RPLL_TO_FPD_CTRL, 0x48)
105 DEP_FIELD(RPLL_TO_FPD_CTRL, DIVISOR0, 6, 8)
106DEP_REG32(USB3_DUAL_REF_CTRL, 0x4c)
107 DEP_FIELD(USB3_DUAL_REF_CTRL, CLKACT, 1, 25)
108 DEP_FIELD(USB3_DUAL_REF_CTRL, DIVISOR1, 6, 16)
109 DEP_FIELD(USB3_DUAL_REF_CTRL, DIVISOR0, 6, 8)
110 DEP_FIELD(USB3_DUAL_REF_CTRL, SRCSEL, 3, 0)
111DEP_REG32(GEM0_REF_CTRL, 0x50)
112 DEP_FIELD(GEM0_REF_CTRL, RX_CLKACT, 1, 26)
113 DEP_FIELD(GEM0_REF_CTRL, CLKACT, 1, 25)
114 DEP_FIELD(GEM0_REF_CTRL, DIVISOR1, 6, 16)
115 DEP_FIELD(GEM0_REF_CTRL, DIVISOR0, 6, 8)
116 DEP_FIELD(GEM0_REF_CTRL, SRCSEL, 3, 0)
117DEP_REG32(GEM1_REF_CTRL, 0x54)
118 DEP_FIELD(GEM1_REF_CTRL, RX_CLKACT, 1, 26)
119 DEP_FIELD(GEM1_REF_CTRL, CLKACT, 1, 25)
120 DEP_FIELD(GEM1_REF_CTRL, DIVISOR1, 6, 16)
121 DEP_FIELD(GEM1_REF_CTRL, DIVISOR0, 6, 8)
122 DEP_FIELD(GEM1_REF_CTRL, SRCSEL, 3, 0)
123DEP_REG32(GEM2_REF_CTRL, 0x58)
124 DEP_FIELD(GEM2_REF_CTRL, RX_CLKACT, 1, 26)
125 DEP_FIELD(GEM2_REF_CTRL, CLKACT, 1, 25)
126 DEP_FIELD(GEM2_REF_CTRL, DIVISOR1, 6, 16)
127 DEP_FIELD(GEM2_REF_CTRL, DIVISOR0, 6, 8)
128 DEP_FIELD(GEM2_REF_CTRL, SRCSEL, 3, 0)
129DEP_REG32(GEM3_REF_CTRL, 0x5c)
130 DEP_FIELD(GEM3_REF_CTRL, RX_CLKACT, 1, 26)
131 DEP_FIELD(GEM3_REF_CTRL, CLKACT, 1, 25)
132 DEP_FIELD(GEM3_REF_CTRL, DIVISOR1, 6, 16)
133 DEP_FIELD(GEM3_REF_CTRL, DIVISOR0, 6, 8)
134 DEP_FIELD(GEM3_REF_CTRL, SRCSEL, 3, 0)
135DEP_REG32(USB0_BUS_REF_CTRL, 0x60)
136 DEP_FIELD(USB0_BUS_REF_CTRL, CLKACT, 1, 25)
137 DEP_FIELD(USB0_BUS_REF_CTRL, DIVISOR1, 6, 16)
138 DEP_FIELD(USB0_BUS_REF_CTRL, DIVISOR0, 6, 8)
139 DEP_FIELD(USB0_BUS_REF_CTRL, SRCSEL, 3, 0)
140DEP_REG32(USB1_BUS_REF_CTRL, 0x64)
141 DEP_FIELD(USB1_BUS_REF_CTRL, CLKACT, 1, 25)
142 DEP_FIELD(USB1_BUS_REF_CTRL, DIVISOR1, 6, 16)
143 DEP_FIELD(USB1_BUS_REF_CTRL, DIVISOR0, 6, 8)
144 DEP_FIELD(USB1_BUS_REF_CTRL, SRCSEL, 3, 0)
145DEP_REG32(QSPI_REF_CTRL, 0x68)
146 DEP_FIELD(QSPI_REF_CTRL, CLKACT, 1, 24)
147 DEP_FIELD(QSPI_REF_CTRL, DIVISOR1, 6, 16)
148 DEP_FIELD(QSPI_REF_CTRL, DIVISOR0, 6, 8)
149 DEP_FIELD(QSPI_REF_CTRL, SRCSEL, 3, 0)
150DEP_REG32(SDIO0_REF_CTRL, 0x6c)
151 DEP_FIELD(SDIO0_REF_CTRL, CLKACT, 1, 24)
152 DEP_FIELD(SDIO0_REF_CTRL, DIVISOR1, 6, 16)
153 DEP_FIELD(SDIO0_REF_CTRL, DIVISOR0, 6, 8)
154 DEP_FIELD(SDIO0_REF_CTRL, SRCSEL, 3, 0)
155DEP_REG32(SDIO1_REF_CTRL, 0x70)
156 DEP_FIELD(SDIO1_REF_CTRL, CLKACT, 1, 24)
157 DEP_FIELD(SDIO1_REF_CTRL, DIVISOR1, 6, 16)
158 DEP_FIELD(SDIO1_REF_CTRL, DIVISOR0, 6, 8)
159 DEP_FIELD(SDIO1_REF_CTRL, SRCSEL, 3, 0)
160DEP_REG32(UART0_REF_CTRL, 0x74)
161 DEP_FIELD(UART0_REF_CTRL, CLKACT, 1, 24)
162 DEP_FIELD(UART0_REF_CTRL, DIVISOR1, 6, 16)
163 DEP_FIELD(UART0_REF_CTRL, DIVISOR0, 6, 8)
164 DEP_FIELD(UART0_REF_CTRL, SRCSEL, 3, 0)
165DEP_REG32(UART1_REF_CTRL, 0x78)
166 DEP_FIELD(UART1_REF_CTRL, CLKACT, 1, 24)
167 DEP_FIELD(UART1_REF_CTRL, DIVISOR1, 6, 16)
168 DEP_FIELD(UART1_REF_CTRL, DIVISOR0, 6, 8)
169 DEP_FIELD(UART1_REF_CTRL, SRCSEL, 3, 0)
170DEP_REG32(SPI0_REF_CTRL, 0x7c)
171 DEP_FIELD(SPI0_REF_CTRL, CLKACT, 1, 24)
172 DEP_FIELD(SPI0_REF_CTRL, DIVISOR1, 6, 16)
173 DEP_FIELD(SPI0_REF_CTRL, DIVISOR0, 6, 8)
174 DEP_FIELD(SPI0_REF_CTRL, SRCSEL, 3, 0)
175DEP_REG32(SPI1_REF_CTRL, 0x80)
176 DEP_FIELD(SPI1_REF_CTRL, CLKACT, 1, 24)
177 DEP_FIELD(SPI1_REF_CTRL, DIVISOR1, 6, 16)
178 DEP_FIELD(SPI1_REF_CTRL, DIVISOR0, 6, 8)
179 DEP_FIELD(SPI1_REF_CTRL, SRCSEL, 3, 0)
180DEP_REG32(CAN0_REF_CTRL, 0x84)
181 DEP_FIELD(CAN0_REF_CTRL, CLKACT, 1, 24)
182 DEP_FIELD(CAN0_REF_CTRL, DIVISOR1, 6, 16)
183 DEP_FIELD(CAN0_REF_CTRL, DIVISOR0, 6, 8)
184 DEP_FIELD(CAN0_REF_CTRL, SRCSEL, 3, 0)
185DEP_REG32(CAN1_REF_CTRL, 0x88)
186 DEP_FIELD(CAN1_REF_CTRL, CLKACT, 1, 24)
187 DEP_FIELD(CAN1_REF_CTRL, DIVISOR1, 6, 16)
188 DEP_FIELD(CAN1_REF_CTRL, DIVISOR0, 6, 8)
189 DEP_FIELD(CAN1_REF_CTRL, SRCSEL, 3, 0)
190DEP_REG32(CPU_R5_CTRL, 0x90)
191 DEP_FIELD(CPU_R5_CTRL, CLKACT_CORE, 1, 25)
192 DEP_FIELD(CPU_R5_CTRL, CLKACT, 1, 24)
193 DEP_FIELD(CPU_R5_CTRL, DIVISOR0, 6, 8)
194 DEP_FIELD(CPU_R5_CTRL, SRCSEL, 3, 0)
195DEP_REG32(IOU_SWITCH_CTRL, 0x9c)
196 DEP_FIELD(IOU_SWITCH_CTRL, CLKACT, 1, 24)
197 DEP_FIELD(IOU_SWITCH_CTRL, DIVISOR0, 6, 8)
198 DEP_FIELD(IOU_SWITCH_CTRL, SRCSEL, 3, 0)
199DEP_REG32(CSU_PLL_CTRL, 0xa0)
200 DEP_FIELD(CSU_PLL_CTRL, CLKACT, 1, 24)
201 DEP_FIELD(CSU_PLL_CTRL, DIVISOR0, 6, 8)
202 DEP_FIELD(CSU_PLL_CTRL, SRCSEL, 3, 0)
203DEP_REG32(PCAP_CTRL, 0xa4)
204 DEP_FIELD(PCAP_CTRL, CLKACT, 1, 24)
205 DEP_FIELD(PCAP_CTRL, DIVISOR0, 6, 8)
206 DEP_FIELD(PCAP_CTRL, SRCSEL, 3, 0)
207DEP_REG32(LPD_SWITCH_CTRL, 0xa8)
208 DEP_FIELD(LPD_SWITCH_CTRL, CLKACT, 1, 24)
209 DEP_FIELD(LPD_SWITCH_CTRL, DIVISOR0, 6, 8)
210 DEP_FIELD(LPD_SWITCH_CTRL, SRCSEL, 3, 0)
211DEP_REG32(LPD_LSBUS_CTRL, 0xac)
212 DEP_FIELD(LPD_LSBUS_CTRL, CLKACT, 1, 24)
213 DEP_FIELD(LPD_LSBUS_CTRL, DIVISOR0, 6, 8)
214 DEP_FIELD(LPD_LSBUS_CTRL, SRCSEL, 3, 0)
215DEP_REG32(DBG_LPD_CTRL, 0xb0)
216 DEP_FIELD(DBG_LPD_CTRL, CLKACT, 1, 24)
217 DEP_FIELD(DBG_LPD_CTRL, DIVISOR0, 6, 8)
218 DEP_FIELD(DBG_LPD_CTRL, SRCSEL, 3, 0)
219DEP_REG32(NAND_REF_CTRL, 0xb4)
220 DEP_FIELD(NAND_REF_CTRL, CLKACT, 1, 24)
221 DEP_FIELD(NAND_REF_CTRL, DIVISOR1, 6, 16)
222 DEP_FIELD(NAND_REF_CTRL, DIVISOR0, 6, 8)
223 DEP_FIELD(NAND_REF_CTRL, SRCSEL, 3, 0)
224DEP_REG32(ADMA_REF_CTRL, 0xb8)
225 DEP_FIELD(ADMA_REF_CTRL, CLKACT, 1, 24)
226 DEP_FIELD(ADMA_REF_CTRL, DIVISOR0, 6, 8)
227 DEP_FIELD(ADMA_REF_CTRL, SRCSEL, 3, 0)
228DEP_REG32(PL0_REF_CTRL, 0xc0)
229 DEP_FIELD(PL0_REF_CTRL, CLKACT, 1, 24)
230 DEP_FIELD(PL0_REF_CTRL, DIVISOR1, 6, 16)
231 DEP_FIELD(PL0_REF_CTRL, DIVISOR0, 6, 8)
232 DEP_FIELD(PL0_REF_CTRL, SRCSEL, 3, 0)
233DEP_REG32(PL1_REF_CTRL, 0xc4)
234 DEP_FIELD(PL1_REF_CTRL, CLKACT, 1, 24)
235 DEP_FIELD(PL1_REF_CTRL, DIVISOR1, 6, 16)
236 DEP_FIELD(PL1_REF_CTRL, DIVISOR0, 6, 8)
237 DEP_FIELD(PL1_REF_CTRL, SRCSEL, 3, 0)
238DEP_REG32(PL2_REF_CTRL, 0xc8)
239 DEP_FIELD(PL2_REF_CTRL, CLKACT, 1, 24)
240 DEP_FIELD(PL2_REF_CTRL, DIVISOR1, 6, 16)
241 DEP_FIELD(PL2_REF_CTRL, DIVISOR0, 6, 8)
242 DEP_FIELD(PL2_REF_CTRL, SRCSEL, 3, 0)
243DEP_REG32(PL3_REF_CTRL, 0xcc)
244 DEP_FIELD(PL3_REF_CTRL, CLKACT, 1, 24)
245 DEP_FIELD(PL3_REF_CTRL, DIVISOR1, 6, 16)
246 DEP_FIELD(PL3_REF_CTRL, DIVISOR0, 6, 8)
247 DEP_FIELD(PL3_REF_CTRL, SRCSEL, 3, 0)
248DEP_REG32(PL0_THR_CTRL, 0xd0)
249 DEP_FIELD(PL0_THR_CTRL, CURR_VAL, 16, 16)
250 DEP_FIELD(PL0_THR_CTRL, RUNNING, 1, 15)
251 DEP_FIELD(PL0_THR_CTRL, CPU_START, 1, 1)
252 DEP_FIELD(PL0_THR_CTRL, CNT_RST, 1, 0)
253DEP_REG32(PL0_THR_CNT, 0xd4)
254 DEP_FIELD(PL0_THR_CNT, LAST_CNT, 16, 0)
255DEP_REG32(PL1_THR_CTRL, 0xd8)
256 DEP_FIELD(PL1_THR_CTRL, CURR_VAL, 16, 16)
257 DEP_FIELD(PL1_THR_CTRL, RUNNING, 1, 15)
258 DEP_FIELD(PL1_THR_CTRL, CPU_START, 1, 1)
259 DEP_FIELD(PL1_THR_CTRL, CNT_RST, 1, 0)
260DEP_REG32(PL1_THR_CNT, 0xdc)
261 DEP_FIELD(PL1_THR_CNT, LAST_CNT, 16, 0)
262DEP_REG32(PL2_THR_CTRL, 0xe0)
263 DEP_FIELD(PL2_THR_CTRL, CURR_VAL, 16, 16)
264 DEP_FIELD(PL2_THR_CTRL, RUNNING, 1, 15)
265 DEP_FIELD(PL2_THR_CTRL, CPU_START, 1, 1)
266 DEP_FIELD(PL2_THR_CTRL, CNT_RST, 1, 0)
267DEP_REG32(PL2_THR_CNT, 0xe4)
268 DEP_FIELD(PL2_THR_CNT, LAST_CNT, 16, 0)
269DEP_REG32(PL3_THR_CTRL, 0xe8)
270 DEP_FIELD(PL3_THR_CTRL, CURR_VAL, 16, 16)
271 DEP_FIELD(PL3_THR_CTRL, RUNNING, 1, 15)
272 DEP_FIELD(PL3_THR_CTRL, CPU_START, 1, 1)
273 DEP_FIELD(PL3_THR_CTRL, CNT_RST, 1, 0)
274DEP_REG32(PL3_THR_CNT, 0xfc)
275 DEP_FIELD(PL3_THR_CNT, LAST_CNT, 16, 0)
276DEP_REG32(GEM_TSU_REF_CTRL, 0x100)
277 DEP_FIELD(GEM_TSU_REF_CTRL, CLKACT, 1, 24)
278 DEP_FIELD(GEM_TSU_REF_CTRL, DIVISOR1, 6, 16)
279 DEP_FIELD(GEM_TSU_REF_CTRL, DIVISOR0, 6, 8)
280 DEP_FIELD(GEM_TSU_REF_CTRL, SRCSEL, 3, 0)
281DEP_REG32(DLL_REF_CTRL, 0x104)
282 DEP_FIELD(DLL_REF_CTRL, SRCSEL, 3, 0)
283DEP_REG32(AMS_REF_CTRL, 0x108)
284 DEP_FIELD(AMS_REF_CTRL, CLKACT, 1, 24)
285 DEP_FIELD(AMS_REF_CTRL, DIVISOR1, 6, 16)
286 DEP_FIELD(AMS_REF_CTRL, DIVISOR0, 6, 8)
287 DEP_FIELD(AMS_REF_CTRL, SRCSEL, 3, 0)
288DEP_REG32(I2C0_REF_CTRL, 0x120)
289 DEP_FIELD(I2C0_REF_CTRL, CLKACT, 1, 24)
290 DEP_FIELD(I2C0_REF_CTRL, DIVISOR1, 6, 16)
291 DEP_FIELD(I2C0_REF_CTRL, DIVISOR0, 6, 8)
292 DEP_FIELD(I2C0_REF_CTRL, SRCSEL, 3, 0)
293DEP_REG32(I2C1_REF_CTRL, 0x124)
294 DEP_FIELD(I2C1_REF_CTRL, CLKACT, 1, 24)
295 DEP_FIELD(I2C1_REF_CTRL, DIVISOR1, 6, 16)
296 DEP_FIELD(I2C1_REF_CTRL, DIVISOR0, 6, 8)
297 DEP_FIELD(I2C1_REF_CTRL, SRCSEL, 3, 0)
298DEP_REG32(TIMESTAMP_REF_CTRL, 0x128)
299 DEP_FIELD(TIMESTAMP_REF_CTRL, CLKACT, 1, 24)
300 DEP_FIELD(TIMESTAMP_REF_CTRL, DIVISOR0, 6, 8)
301 DEP_FIELD(TIMESTAMP_REF_CTRL, SRCSEL, 3, 0)
302DEP_REG32(SAFETY_CHK, 0x130)
303 DEP_FIELD(SAFETY_CHK, CHK_VAL, 32, 0)
304DEP_REG32(CLKMON_STATUS, 0x140)
305 DEP_FIELD(CLKMON_STATUS, CNTA7_OVER_ERR, 1, 15)
306 DEP_FIELD(CLKMON_STATUS, MON7_ERR, 1, 14)
307 DEP_FIELD(CLKMON_STATUS, CNTA6_OVER_ERR, 1, 13)
308 DEP_FIELD(CLKMON_STATUS, MON6_ERR, 1, 12)
309 DEP_FIELD(CLKMON_STATUS, CNTA5_OVER_ERR, 1, 11)
310 DEP_FIELD(CLKMON_STATUS, MON5_ERR, 1, 10)
311 DEP_FIELD(CLKMON_STATUS, CNTA4_OVER_ERR, 1, 9)
312 DEP_FIELD(CLKMON_STATUS, MON4_ERR, 1, 8)
313 DEP_FIELD(CLKMON_STATUS, CNTA3_OVER_ERR, 1, 7)
314 DEP_FIELD(CLKMON_STATUS, MON3_ERR, 1, 6)
315 DEP_FIELD(CLKMON_STATUS, CNTA2_OVER_ERR, 1, 5)
316 DEP_FIELD(CLKMON_STATUS, MON2_ERR, 1, 4)
317 DEP_FIELD(CLKMON_STATUS, CNTA1_OVER_ERR, 1, 3)
318 DEP_FIELD(CLKMON_STATUS, MON1_ERR, 1, 2)
319 DEP_FIELD(CLKMON_STATUS, CNTA0_OVER_ERR, 1, 1)
320 DEP_FIELD(CLKMON_STATUS, MON0_ERR, 1, 0)
321DEP_REG32(CLKMON_MASK, 0x144)
322 DEP_FIELD(CLKMON_MASK, CNTA7_OVER_ERR, 1, 15)
323 DEP_FIELD(CLKMON_MASK, MON7_ERR, 1, 14)
324 DEP_FIELD(CLKMON_MASK, CNTA6_OVER_ERR, 1, 13)
325 DEP_FIELD(CLKMON_MASK, MON6_ERR, 1, 12)
326 DEP_FIELD(CLKMON_MASK, CNTA5_OVER_ERR, 1, 11)
327 DEP_FIELD(CLKMON_MASK, MON5_ERR, 1, 10)
328 DEP_FIELD(CLKMON_MASK, CNTA4_OVER_ERR, 1, 9)
329 DEP_FIELD(CLKMON_MASK, MON4_ERR, 1, 8)
330 DEP_FIELD(CLKMON_MASK, CNTA3_OVER_ERR, 1, 7)
331 DEP_FIELD(CLKMON_MASK, MON3_ERR, 1, 6)
332 DEP_FIELD(CLKMON_MASK, CNTA2_OVER_ERR, 1, 5)
333 DEP_FIELD(CLKMON_MASK, MON2_ERR, 1, 4)
334 DEP_FIELD(CLKMON_MASK, CNTA1_OVER_ERR, 1, 3)
335 DEP_FIELD(CLKMON_MASK, MON1_ERR, 1, 2)
336 DEP_FIELD(CLKMON_MASK, CNTA0_OVER_ERR, 1, 1)
337 DEP_FIELD(CLKMON_MASK, MON0_ERR, 1, 0)
338DEP_REG32(CLKMON_ENABLE, 0x148)
339 DEP_FIELD(CLKMON_ENABLE, CNTA7_OVER_ERR, 1, 15)
340 DEP_FIELD(CLKMON_ENABLE, MON7_ERR, 1, 14)
341 DEP_FIELD(CLKMON_ENABLE, CNTA6_OVER_ERR, 1, 13)
342 DEP_FIELD(CLKMON_ENABLE, MON6_ERR, 1, 12)
343 DEP_FIELD(CLKMON_ENABLE, CNTA5_OVER_ERR, 1, 11)
344 DEP_FIELD(CLKMON_ENABLE, MON5_ERR, 1, 10)
345 DEP_FIELD(CLKMON_ENABLE, CNTA4_OVER_ERR, 1, 9)
346 DEP_FIELD(CLKMON_ENABLE, MON4_ERR, 1, 8)
347 DEP_FIELD(CLKMON_ENABLE, CNTA3_OVER_ERR, 1, 7)
348 DEP_FIELD(CLKMON_ENABLE, MON3_ERR, 1, 6)
349 DEP_FIELD(CLKMON_ENABLE, CNTA2_OVER_ERR, 1, 5)
350 DEP_FIELD(CLKMON_ENABLE, MON2_ERR, 1, 4)
351 DEP_FIELD(CLKMON_ENABLE, CNTA1_OVER_ERR, 1, 3)
352 DEP_FIELD(CLKMON_ENABLE, MON1_ERR, 1, 2)
353 DEP_FIELD(CLKMON_ENABLE, CNTA0_OVER_ERR, 1, 1)
354 DEP_FIELD(CLKMON_ENABLE, MON0_ERR, 1, 0)
355DEP_REG32(CLKMON_DISABLE, 0x14C)
356 DEP_FIELD(CLKMON_DISABLE, CNTA7_OVER_ERR, 1, 15)
357 DEP_FIELD(CLKMON_DISABLE, MON7_ERR, 1, 14)
358 DEP_FIELD(CLKMON_DISABLE, CNTA6_OVER_ERR, 1, 13)
359 DEP_FIELD(CLKMON_DISABLE, MON6_ERR, 1, 12)
360 DEP_FIELD(CLKMON_DISABLE, CNTA5_OVER_ERR, 1, 11)
361 DEP_FIELD(CLKMON_DISABLE, MON5_ERR, 1, 10)
362 DEP_FIELD(CLKMON_DISABLE, CNTA4_OVER_ERR, 1, 9)
363 DEP_FIELD(CLKMON_DISABLE, MON4_ERR, 1, 8)
364 DEP_FIELD(CLKMON_DISABLE, CNTA3_OVER_ERR, 1, 7)
365 DEP_FIELD(CLKMON_DISABLE, MON3_ERR, 1, 6)
366 DEP_FIELD(CLKMON_DISABLE, CNTA2_OVER_ERR, 1, 5)
367 DEP_FIELD(CLKMON_DISABLE, MON2_ERR, 1, 4)
368 DEP_FIELD(CLKMON_DISABLE, CNTA1_OVER_ERR, 1, 3)
369 DEP_FIELD(CLKMON_DISABLE, MON1_ERR, 1, 2)
370 DEP_FIELD(CLKMON_DISABLE, CNTA0_OVER_ERR, 1, 1)
371 DEP_FIELD(CLKMON_DISABLE, MON0_ERR, 1, 0)
372DEP_REG32(CLKMON_TRIGGER, 0x150)
373 DEP_FIELD(CLKMON_TRIGGER, CNTA7_OVER_ERR, 1, 15)
374 DEP_FIELD(CLKMON_TRIGGER, MON7_ERR, 1, 14)
375 DEP_FIELD(CLKMON_TRIGGER, CNTA6_OVER_ERR, 1, 13)
376 DEP_FIELD(CLKMON_TRIGGER, MON6_ERR, 1, 12)
377 DEP_FIELD(CLKMON_TRIGGER, CNTA5_OVER_ERR, 1, 11)
378 DEP_FIELD(CLKMON_TRIGGER, MON5_ERR, 1, 10)
379 DEP_FIELD(CLKMON_TRIGGER, CNTA4_OVER_ERR, 1, 9)
380 DEP_FIELD(CLKMON_TRIGGER, MON4_ERR, 1, 8)
381 DEP_FIELD(CLKMON_TRIGGER, CNTA3_OVER_ERR, 1, 7)
382 DEP_FIELD(CLKMON_TRIGGER, MON3_ERR, 1, 6)
383 DEP_FIELD(CLKMON_TRIGGER, CNTA2_OVER_ERR, 1, 5)
384 DEP_FIELD(CLKMON_TRIGGER, MON2_ERR, 1, 4)
385 DEP_FIELD(CLKMON_TRIGGER, CNTA1_OVER_ERR, 1, 3)
386 DEP_FIELD(CLKMON_TRIGGER, MON1_ERR, 1, 2)
387 DEP_FIELD(CLKMON_TRIGGER, CNTA0_OVER_ERR, 1, 1)
388 DEP_FIELD(CLKMON_TRIGGER, MON0_ERR, 1, 0)
389DEP_REG32(CHKR0_CLKA_UPPER, 0x160)
390 DEP_FIELD(CHKR0_CLKA_UPPER, THRSHLD, 32, 0)
391DEP_REG32(CHKR0_CLKA_LOWER, 0x164)
392 DEP_FIELD(CHKR0_CLKA_LOWER, THRSHLD, 32, 0)
393DEP_REG32(CHKR0_CLKB_CNT, 0x168)
394 DEP_FIELD(CHKR0_CLKB_CNT, VALUE, 32, 0)
395DEP_REG32(CHKR0_CTRL, 0x16C)
396 DEP_FIELD(CHKR0_CTRL, START_SINGLE, 1, 8)
397 DEP_FIELD(CHKR0_CTRL, START_CONTINUOUS, 1, 7)
398 DEP_FIELD(CHKR0_CTRL, CLKB_MUX_CTRL, 1, 5)
399 DEP_FIELD(CHKR0_CTRL, CLKA_MUX_CTRL, 3, 1)
400 DEP_FIELD(CHKR0_CTRL, ENABLE, 1, 0)
401DEP_REG32(CHKR1_CLKA_UPPER, 0x170)
402 DEP_FIELD(CHKR1_CLKA_UPPER, THRSHLD, 32, 0)
403DEP_REG32(CHKR1_CLKA_LOWER, 0x174)
404 DEP_FIELD(CHKR1_CLKA_LOWER, THRSHLD, 32, 0)
405DEP_REG32(CHKR1_CLKB_CNT, 0x178)
406 DEP_FIELD(CHKR1_CLKB_CNT, VALUE, 32, 0)
407DEP_REG32(CHKR1_CTRL, 0x17C)
408 DEP_FIELD(CHKR1_CTRL, START_SINGLE, 1, 8)
409 DEP_FIELD(CHKR1_CTRL, START_CONTINUOUS, 1, 7)
410 DEP_FIELD(CHKR1_CTRL, CLKB_MUX_CTRL, 1, 5)
411 DEP_FIELD(CHKR1_CTRL, CLKA_MUX_CTRL, 3, 1)
412 DEP_FIELD(CHKR1_CTRL, ENABLE, 1, 0)
413DEP_REG32(CHKR2_CLKA_UPPER, 0x180)
414 DEP_FIELD(CHKR2_CLKA_UPPER, THRSHLD, 32, 0)
415DEP_REG32(CHKR2_CLKA_LOWER, 0x184)
416 DEP_FIELD(CHKR2_CLKA_LOWER, THRSHLD, 32, 0)
417DEP_REG32(CHKR2_CLKB_CNT, 0x188)
418 DEP_FIELD(CHKR2_CLKB_CNT, VALUE, 32, 0)
419DEP_REG32(CHKR2_CTRL, 0x18C)
420 DEP_FIELD(CHKR2_CTRL, START_SINGLE, 1, 8)
421 DEP_FIELD(CHKR2_CTRL, START_CONTINUOUS, 1, 7)
422 DEP_FIELD(CHKR2_CTRL, CLKB_MUX_CTRL, 1, 5)
423 DEP_FIELD(CHKR2_CTRL, CLKA_MUX_CTRL, 3, 1)
424 DEP_FIELD(CHKR2_CTRL, ENABLE, 1, 0)
425DEP_REG32(CHKR3_CLKA_UPPER, 0x190)
426 DEP_FIELD(CHKR3_CLKA_UPPER, THRSHLD, 32, 0)
427DEP_REG32(CHKR3_CLKA_LOWER, 0x194)
428 DEP_FIELD(CHKR3_CLKA_LOWER, THRSHLD, 32, 0)
429DEP_REG32(CHKR3_CLKB_CNT, 0x198)
430 DEP_FIELD(CHKR3_CLKB_CNT, VALUE, 32, 0)
431DEP_REG32(CHKR3_CTRL, 0x19C)
432 DEP_FIELD(CHKR3_CTRL, START_SINGLE, 1, 8)
433 DEP_FIELD(CHKR3_CTRL, START_CONTINUOUS, 1, 7)
434 DEP_FIELD(CHKR3_CTRL, CLKB_MUX_CTRL, 1, 5)
435 DEP_FIELD(CHKR3_CTRL, CLKA_MUX_CTRL, 3, 1)
436 DEP_FIELD(CHKR3_CTRL, ENABLE, 1, 0)
437DEP_REG32(CHKR4_CLKA_UPPER, 0x1A0)
438 DEP_FIELD(CHKR4_CLKA_UPPER, THRSHLD, 32, 0)
439DEP_REG32(CHKR4_CLKA_LOWER, 0x1A4)
440 DEP_FIELD(CHKR4_CLKA_LOWER, THRSHLD, 32, 0)
441DEP_REG32(CHKR4_CLKB_CNT, 0x1A8)
442 DEP_FIELD(CHKR4_CLKB_CNT, VALUE, 32, 0)
443DEP_REG32(CHKR4_CTRL, 0x1AC)
444 DEP_FIELD(CHKR4_CTRL, START_SINGLE, 1, 8)
445 DEP_FIELD(CHKR4_CTRL, START_CONTINUOUS, 1, 7)
446 DEP_FIELD(CHKR4_CTRL, CLKB_MUX_CTRL, 1, 5)
447 DEP_FIELD(CHKR4_CTRL, CLKA_MUX_CTRL, 3, 1)
448 DEP_FIELD(CHKR4_CTRL, ENABLE, 1, 0)
449DEP_REG32(CHKR5_CLKA_UPPER, 0x1B0)
450 DEP_FIELD(CHKR5_CLKA_UPPER, THRSHLD, 32, 0)
451DEP_REG32(CHKR5_CLKA_LOWER, 0x1B4)
452 DEP_FIELD(CHKR5_CLKA_LOWER, THRSHLD, 32, 0)
453DEP_REG32(CHKR5_CLKB_CNT, 0x1B8)
454 DEP_FIELD(CHKR5_CLKB_CNT, VALUE, 32, 0)
455DEP_REG32(CHKR5_CTRL, 0x1BC)
456 DEP_FIELD(CHKR5_CTRL, START_SINGLE, 1, 8)
457 DEP_FIELD(CHKR5_CTRL, START_CONTINUOUS, 1, 7)
458 DEP_FIELD(CHKR5_CTRL, CLKB_MUX_CTRL, 1, 5)
459 DEP_FIELD(CHKR5_CTRL, CLKA_MUX_CTRL, 3, 1)
460 DEP_FIELD(CHKR5_CTRL, ENABLE, 1, 0)
461DEP_REG32(CHKR6_CLKA_UPPER, 0x1C0)
462 DEP_FIELD(CHKR6_CLKA_UPPER, THRSHLD, 32, 0)
463DEP_REG32(CHKR6_CLKA_LOWER, 0x1C4)
464 DEP_FIELD(CHKR6_CLKA_LOWER, THRSHLD, 32, 0)
465DEP_REG32(CHKR6_CLKB_CNT, 0x1C8)
466 DEP_FIELD(CHKR6_CLKB_CNT, VALUE, 32, 0)
467DEP_REG32(CHKR6_CTRL, 0x1CC)
468 DEP_FIELD(CHKR6_CTRL, START_SINGLE, 1, 8)
469 DEP_FIELD(CHKR6_CTRL, START_CONTINUOUS, 1, 7)
470 DEP_FIELD(CHKR6_CTRL, CLKB_MUX_CTRL, 1, 5)
471 DEP_FIELD(CHKR6_CTRL, CLKA_MUX_CTRL, 3, 1)
472 DEP_FIELD(CHKR6_CTRL, ENABLE, 1, 0)
473DEP_REG32(CHKR7_CLKA_UPPER, 0x1D0)
474 DEP_FIELD(CHKR7_CLKA_UPPER, THRSHLD, 32, 0)
475DEP_REG32(CHKR7_CLKA_LOWER, 0x1D4)
476 DEP_FIELD(CHKR7_CLKA_LOWER, THRSHLD, 32, 0)
477DEP_REG32(CHKR7_CLKB_CNT, 0x1D8)
478 DEP_FIELD(CHKR7_CLKB_CNT, VALUE, 32, 0)
479DEP_REG32(CHKR7_CTRL, 0x1DC)
480 DEP_FIELD(CHKR7_CTRL, START_SINGLE, 1, 8)
481 DEP_FIELD(CHKR7_CTRL, START_CONTINUOUS, 1, 7)
482 DEP_FIELD(CHKR7_CTRL, CLKB_MUX_CTRL, 1, 5)
483 DEP_FIELD(CHKR7_CTRL, CLKA_MUX_CTRL, 3, 1)
484 DEP_FIELD(CHKR7_CTRL, ENABLE, 1, 0)
485DEP_REG32(BOOT_MODE_USER, 0x200)
486 DEP_FIELD(BOOT_MODE_USER, ALT_BOOT_MODE, 4, 12)
487 DEP_FIELD(BOOT_MODE_USER, USE_ALT, 1, 8)
488 DEP_FIELD(BOOT_MODE_USER, BOOT_MODE, 4, 0)
489DEP_REG32(BOOT_MODE_POR, 0x204)
490 DEP_FIELD(BOOT_MODE_POR, BOOT_MODE2, 4, 8)
491 DEP_FIELD(BOOT_MODE_POR, BOOT_MODE1, 4, 4)
492 DEP_FIELD(BOOT_MODE_POR, BOOT_MODE0, 4, 0)
493DEP_REG32(RESET_CTRL, 0x218)
494 DEP_FIELD(RESET_CTRL, SOFT_RESET, 1, 4)
495 DEP_FIELD(RESET_CTRL, SRST_DIS, 1, 0)
496DEP_REG32(BLOCKONLY_RST, 0x21c)
497 DEP_FIELD(BLOCKONLY_RST, DEBUG_ONLY, 1, 0)
498DEP_REG32(RESET_REASON, 0x220)
499 DEP_FIELD(RESET_REASON, DEBUG_SYS, 1, 6)
500 DEP_FIELD(RESET_REASON, SOFT, 1, 5)
501 DEP_FIELD(RESET_REASON, SRST, 1, 4)
502 DEP_FIELD(RESET_REASON, PSONLY_RESET_REQ, 1, 3)
503 DEP_FIELD(RESET_REASON, PMU_SYS_RESET, 1, 2)
504 DEP_FIELD(RESET_REASON, EXTERNAL_POR, 1, 0)
505DEP_REG32(RST_LPD_IOU0, 0x230)
506 DEP_FIELD(RST_LPD_IOU0, GEM3_RESET, 1, 3)
507 DEP_FIELD(RST_LPD_IOU0, GEM2_RESET, 1, 2)
508 DEP_FIELD(RST_LPD_IOU0, GEM1_RESET, 1, 1)
509 DEP_FIELD(RST_LPD_IOU0, GEM0_RESET, 1, 0)
510DEP_REG32(RST_LPD_IOU1, 0x234)
511DEP_REG32(RST_LPD_IOU2, 0x238)
512 DEP_FIELD(RST_LPD_IOU2, TIMESTAMP_RESET, 1, 20)
513 DEP_FIELD(RST_LPD_IOU2, IOU_CC_RESET, 1, 19)
514 DEP_FIELD(RST_LPD_IOU2, GPIO_RESET, 1, 18)
515 DEP_FIELD(RST_LPD_IOU2, ADMA_RESET, 1, 17)
516 DEP_FIELD(RST_LPD_IOU2, NAND_RESET, 1, 16)
517 DEP_FIELD(RST_LPD_IOU2, SWDT_RESET, 1, 15)
518 DEP_FIELD(RST_LPD_IOU2, TTC3_RESET, 1, 14)
519 DEP_FIELD(RST_LPD_IOU2, TTC2_RESET, 1, 13)
520 DEP_FIELD(RST_LPD_IOU2, TTC1_RESET, 1, 12)
521 DEP_FIELD(RST_LPD_IOU2, TTC0_RESET, 1, 11)
522 DEP_FIELD(RST_LPD_IOU2, I2C1_RESET, 1, 10)
523 DEP_FIELD(RST_LPD_IOU2, I2C0_RESET, 1, 9)
524 DEP_FIELD(RST_LPD_IOU2, CAN1_RESET, 1, 8)
525 DEP_FIELD(RST_LPD_IOU2, CAN0_RESET, 1, 7)
526 DEP_FIELD(RST_LPD_IOU2, SDIO1_RESET, 1, 6)
527 DEP_FIELD(RST_LPD_IOU2, SDIO0_RESET, 1, 5)
528 DEP_FIELD(RST_LPD_IOU2, SPI1_RESET, 1, 4)
529 DEP_FIELD(RST_LPD_IOU2, SPI0_RESET, 1, 3)
530 DEP_FIELD(RST_LPD_IOU2, UART1_RESET, 1, 2)
531 DEP_FIELD(RST_LPD_IOU2, UART0_RESET, 1, 1)
532 DEP_FIELD(RST_LPD_IOU2, QSPI_RESET, 1, 0)
533DEP_REG32(RST_LPD_TOP, 0x23c)
534 DEP_FIELD(RST_LPD_TOP, FPD_RESET, 1, 23)
535 DEP_FIELD(RST_LPD_TOP, LPD_SWDT_RESET, 1, 20)
536 DEP_FIELD(RST_LPD_TOP, AFI_FM6_RESET, 1, 19)
537 DEP_FIELD(RST_LPD_TOP, SYSMON_RESET, 1, 17)
538 DEP_FIELD(RST_LPD_TOP, RTC_RESET, 1, 16)
539 DEP_FIELD(RST_LPD_TOP, APM_RESET, 1, 15)
540 DEP_FIELD(RST_LPD_TOP, IPI_RESET, 1, 14)
541 DEP_FIELD(RST_LPD_TOP, USB1_APB_RESET, 1, 11)
542 DEP_FIELD(RST_LPD_TOP, USB0_APB_RESET, 1, 10)
543 DEP_FIELD(RST_LPD_TOP, USB1_HIBERRESET, 1, 9)
544 DEP_FIELD(RST_LPD_TOP, USB0_HIBERRESET, 1, 8)
545 DEP_FIELD(RST_LPD_TOP, USB1_CORERESET, 1, 7)
546 DEP_FIELD(RST_LPD_TOP, USB0_CORERESET, 1, 6)
547 DEP_FIELD(RST_LPD_TOP, RPU_PGE_RESET, 1, 4)
548 DEP_FIELD(RST_LPD_TOP, RPU_OCM_RESET, 1, 3)
549 DEP_FIELD(RST_LPD_TOP, RPU_AMBA_RESET, 1, 2)
550 DEP_FIELD(RST_LPD_TOP, RPU_R51_RESET, 1, 1)
551 DEP_FIELD(RST_LPD_TOP, RPU_R50_RESET, 1, 0)
552DEP_REG32(RST_LPD_DBG, 0x240)
553 DEP_FIELD(RST_LPD_DBG, DBG_ACK, 1, 15)
554 DEP_FIELD(RST_LPD_DBG, RPU_DBG1_RESET, 1, 5)
555 DEP_FIELD(RST_LPD_DBG, RPU_DBG0_RESET, 1, 4)
556 DEP_FIELD(RST_LPD_DBG, DBG_LPD_RESET, 1, 1)
557 DEP_FIELD(RST_LPD_DBG, DBG_FPD_RESET, 1, 0)
558DEP_REG32(BANK3_CTRL0, 0x270)
559 DEP_FIELD(BANK3_CTRL0, DRIVE0, 10, 0)
560DEP_REG32(BANK3_CTRL1, 0x274)
561 DEP_FIELD(BANK3_CTRL1, DRIVE1, 10, 0)
562DEP_REG32(BANK3_CTRL2, 0x278)
563 DEP_FIELD(BANK3_CTRL2, SCHMITT_CMOS_N, 10, 0)
564DEP_REG32(BANK3_CTRL3, 0x27C)
565 DEP_FIELD(BANK3_CTRL3, PULL_HIGH_LOW_N, 10, 0)
566DEP_REG32(BANK3_CTRL4, 0x280)
567 DEP_FIELD(BANK3_CTRL4, PULL_ENABLE, 10, 0)
568DEP_REG32(BANK3_CTRL5, 0x284)
569 DEP_FIELD(BANK3_CTRL5, SLOW_FAST_SLEW_N, 10, 0)
570DEP_REG32(BANK3_STATUS, 0x288)
571 DEP_FIELD(BANK3_STATUS, VMODE_1P8_3P3_N, 1, 0)
572
573#define R_MAX (R_BANK3_STATUS + 1)
574
575typedef struct CRL_APB {
576 SysBusDevice parent_obj;
577 MemoryRegion iomem;
578 qemu_irq irq_ir;
579 qemu_irq mon_irq_ir;
580
581 uint32_t regs[R_MAX];
582 DepRegisterInfo regs_info[R_MAX];
583} CRL_APB;
584
585static void ir_update_irq(CRL_APB *s)
586{
587 bool pending = s->regs[R_IR_STATUS] & ~s->regs[R_IR_MASK];
588 qemu_set_irq(s->irq_ir, pending);
589}
590
591static void ir_status_postw(DepRegisterInfo *reg, uint64_t val64)
592{
593 CRL_APB *s = XILINX_CRL_APB(reg->opaque);
594 ir_update_irq(s);
595}
596
597static uint64_t ir_enable_prew(DepRegisterInfo *reg, uint64_t val64)
598{
599 CRL_APB *s = XILINX_CRL_APB(reg->opaque);
600 uint32_t val = val64;
601
602 s->regs[R_IR_MASK] &= ~val;
603 ir_update_irq(s);
604 return 0;
605}
606
607static uint64_t ir_disable_prew(DepRegisterInfo *reg, uint64_t val64)
608{
609 CRL_APB *s = XILINX_CRL_APB(reg->opaque);
610 uint32_t val = val64;
611
612 s->regs[R_IR_MASK] |= val;
613 ir_update_irq(s);
614 return 0;
615}
616
617static void mon_ir_update_irq(CRL_APB *s)
618{
619 bool pending = s->regs[R_CLKMON_STATUS] & ~s->regs[R_CLKMON_MASK];
620 qemu_set_irq(s->mon_irq_ir, pending);
621}
622
623static void mon_ir_status_postw(DepRegisterInfo *reg, uint64_t val64)
624{
625 CRL_APB *s = XILINX_CRL_APB(reg->opaque);
626
627 mon_ir_update_irq(s);
628}
629
630static uint64_t mon_ir_enable_prew(DepRegisterInfo *reg, uint64_t val64)
631{
632 CRL_APB *s = XILINX_CRL_APB(reg->opaque);
633 uint32_t val = val64;
634
635 s->regs[R_CLKMON_MASK] &= ~val;
636 mon_ir_update_irq(s);
637 return 0;
638}
639
640static uint64_t mon_ir_disable_prew(DepRegisterInfo *reg, uint64_t val64)
641{
642 CRL_APB *s = XILINX_CRL_APB(reg->opaque);
643 uint32_t val = val64;
644
645 s->regs[R_CLKMON_MASK] |= val;
646 mon_ir_update_irq(s);
647 return 0;
648}
649
650static uint64_t mon_ir_trigger_prew(DepRegisterInfo *reg, uint64_t val64)
651{
652 CRL_APB *s = XILINX_CRL_APB(reg->opaque);
653 uint32_t val = val64;
654
655 s->regs[R_CLKMON_STATUS] = s->regs[R_CLKMON_STATUS] | val;
656 mon_ir_update_irq(s);
657 return 0;
658}
659
660static DepRegisterAccessInfo crl_apb_regs_info[] = {
661 { .name = "ERR_CTRL", .decode.addr = A_ERR_CTRL,
662 },{ .name = "IR_STATUS", .decode.addr = A_IR_STATUS,
663 .w1c = 0x1,
664 .post_write = ir_status_postw,
665 },{ .name = "IR_MASK", .decode.addr = A_IR_MASK,
666 .reset = 0x1,
667 .ro = 0x1,
668 },{ .name = "IR_ENABLE", .decode.addr = A_IR_ENABLE,
669 .pre_write = ir_enable_prew,
670 },{ .name = "IR_DISABLE", .decode.addr = A_IR_DISABLE,
671 .pre_write = ir_disable_prew,
672 },{ .name = "CRL_WPROT", .decode.addr = A_CRL_WPROT,
673 },{ .name = "IOPLL_CTRL", .decode.addr = A_IOPLL_CTRL,
674 .reset = 0x2809,
675 .rsvd = 0xf88c80f6L,
676 },{ .name = "IOPLL_CFG", .decode.addr = A_IOPLL_CFG,
677 .rsvd = 0x1801210,
678 },{ .name = "IOPLL_FRAC_CFG", .decode.addr = A_IOPLL_FRAC_CFG,
679 .rsvd = 0x7e330000,
680 },{ .name = "RPLL_CTRL", .decode.addr = A_RPLL_CTRL,
681 .reset = 0x2809,
682 .rsvd = 0xf88c80f6L,
683 },{ .name = "RPLL_CFG", .decode.addr = A_RPLL_CFG,
684 .rsvd = 0x1801210,
685 },{ .name = "RPLL_FRAC_CFG", .decode.addr = A_RPLL_FRAC_CFG,
686 .rsvd = 0x7e330000,
687 },{ .name = "PLL_STATUS", .decode.addr = A_PLL_STATUS,
688 .reset = 0x1b,
689 .rsvd = 0xffffffc4L,
690 .ro = 0x1b,
691 },{ .name = "IOPLL_TO_FPD_CTRL", .decode.addr = A_IOPLL_TO_FPD_CTRL,
692 .reset = 0x400,
693 .rsvd = 0xc0ff,
694 },{ .name = "RPLL_TO_FPD_CTRL", .decode.addr = A_RPLL_TO_FPD_CTRL,
695 .reset = 0x400,
696 .rsvd = 0xc0ff,
697 },{ .name = "USB3_DUAL_REF_CTRL", .decode.addr = A_USB3_DUAL_REF_CTRL,
698 .reset = 0x52000,
699 .rsvd = 0xfdc0c0f8L,
700 },{ .name = "GEM0_REF_CTRL", .decode.addr = A_GEM0_REF_CTRL,
701 .reset = 0x2500,
702 .rsvd = 0xf9c0c0f8L,
703 },{ .name = "GEM1_REF_CTRL", .decode.addr = A_GEM1_REF_CTRL,
704 .reset = 0x2500,
705 .rsvd = 0xf9c0c0f8L,
706 },{ .name = "GEM2_REF_CTRL", .decode.addr = A_GEM2_REF_CTRL,
707 .reset = 0x2500,
708 .rsvd = 0xf9c0c0f8L,
709 },{ .name = "GEM3_REF_CTRL", .decode.addr = A_GEM3_REF_CTRL,
710 .reset = 0x2500,
711 .rsvd = 0xf9c0c0f8L,
712 },{ .name = "USB0_BUS_REF_CTRL", .decode.addr = A_USB0_BUS_REF_CTRL,
713 .reset = 0x52000,
714 .rsvd = 0xfdc0c0f8L,
715 },{ .name = "USB1_BUS_REF_CTRL", .decode.addr = A_USB1_BUS_REF_CTRL,
716 .reset = 0x12200,
717 .rsvd = 0xfdc0c0f8L,
718 },{ .name = "QSPI_REF_CTRL", .decode.addr = A_QSPI_REF_CTRL,
719 .reset = 0x1000800,
720 .rsvd = 0xfec0c0f8L,
721 },{ .name = "SDIO0_REF_CTRL", .decode.addr = A_SDIO0_REF_CTRL,
722 .reset = 0x1003000,
723 .rsvd = 0xfeffc0f8L,
724 },{ .name = "SDIO1_REF_CTRL", .decode.addr = A_SDIO1_REF_CTRL,
725 .reset = 0x1003f00,
726 .rsvd = 0xfeffc0f8L,
727 },{ .name = "UART0_REF_CTRL", .decode.addr = A_UART0_REF_CTRL,
728 .reset = 0x1000500,
729 .rsvd = 0xfeffc0f8L,
730 },{ .name = "UART1_REF_CTRL", .decode.addr = A_UART1_REF_CTRL,
731 .reset = 0x1500,
732 .rsvd = 0xfeffc0f8L,
733 },{ .name = "SPI0_REF_CTRL", .decode.addr = A_SPI0_REF_CTRL,
734 .reset = 0x1000500,
735 .rsvd = 0xfeffc0f8L,
736 },{ .name = "SPI1_REF_CTRL", .decode.addr = A_SPI1_REF_CTRL,
737 .reset = 0x1500,
738 .rsvd = 0xfeffc0f8L,
739 },{ .name = "CAN0_REF_CTRL", .decode.addr = A_CAN0_REF_CTRL,
740 .reset = 0x1000500,
741 .rsvd = 0xfeffc0f8L,
742 },{ .name = "CAN1_REF_CTRL", .decode.addr = A_CAN1_REF_CTRL,
743 .reset = 0x1500,
744 .rsvd = 0xfeffc0f8L,
745 },{ .name = "CPU_R5_CTRL", .decode.addr = A_CPU_R5_CTRL,
746 .reset = 0x600,
747 .rsvd = 0xfeffc0f8L,
748 },{ .name = "IOU_SWITCH_CTRL", .decode.addr = A_IOU_SWITCH_CTRL,
749 .reset = 0x1500,
750 .rsvd = 0xfeffc0f8L,
751 },{ .name = "CSU_PLL_CTRL", .decode.addr = A_CSU_PLL_CTRL,
752 .reset = 0x1001504,
753 .rsvd = 0xfeffc0f8L,
754 },{ .name = "PCAP_CTRL", .decode.addr = A_PCAP_CTRL,
755 .reset = 0x1500,
756 .rsvd = 0xfeffc0f8L,
757 },{ .name = "LPD_SWITCH_CTRL", .decode.addr = A_LPD_SWITCH_CTRL,
758 .reset = 0x1002000,
759 .rsvd = 0xfeffc0f8L,
760 },{ .name = "LPD_LSBUS_CTRL", .decode.addr = A_LPD_LSBUS_CTRL,
761 .reset = 0x1002000,
762 .rsvd = 0xfeffc0f8L,
763 },{ .name = "DBG_LPD_CTRL", .decode.addr = A_DBG_LPD_CTRL,
764 .reset = 0x2000,
765 .rsvd = 0xfeffc0f8L,
766 },{ .name = "NAND_REF_CTRL", .decode.addr = A_NAND_REF_CTRL,
767 .reset = 0x52000,
768 .rsvd = 0xfec0c0f8L,
769 },{ .name = "ADMA_REF_CTRL", .decode.addr = A_ADMA_REF_CTRL,
770 .reset = 0x2000,
771 .rsvd = 0xfeffc0f8L,
772 },{ .name = "PL0_REF_CTRL", .decode.addr = A_PL0_REF_CTRL,
773 .reset = 0x52000,
774 .rsvd = 0xfec0c0f8L,
775 },{ .name = "PL1_REF_CTRL", .decode.addr = A_PL1_REF_CTRL,
776 .reset = 0x52000,
777 .rsvd = 0xfec0c0f8L,
778 },{ .name = "PL2_REF_CTRL", .decode.addr = A_PL2_REF_CTRL,
779 .reset = 0x52000,
780 .rsvd = 0xfec0c0f8L,
781 },{ .name = "PL3_REF_CTRL", .decode.addr = A_PL3_REF_CTRL,
782 .reset = 0x52000,
783 .rsvd = 0xfec0c0f8L,
784 },{ .name = "PL0_THR_CTRL", .decode.addr = A_PL0_THR_CTRL,
785 .reset = 0x1,
786 .rsvd = 0x7ffc,
787 .ro = 0xffff8000L,
788 },{ .name = "PL0_THR_CNT", .decode.addr = A_PL0_THR_CNT,
789 },{ .name = "PL1_THR_CTRL", .decode.addr = A_PL1_THR_CTRL,
790 .reset = 0x1,
791 .rsvd = 0x7ffc,
792 .ro = 0xffff8000L,
793 },{ .name = "PL1_THR_CNT", .decode.addr = A_PL1_THR_CNT,
794 },{ .name = "PL2_THR_CTRL", .decode.addr = A_PL2_THR_CTRL,
795 .reset = 0x1,
796 .rsvd = 0x7ffc,
797 .ro = 0xffff8000L,
798 },{ .name = "PL2_THR_CNT", .decode.addr = A_PL2_THR_CNT,
799 },{ .name = "PL3_THR_CTRL", .decode.addr = A_PL3_THR_CTRL,
800 .reset = 0x1,
801 .rsvd = 0x7ffc,
802 .ro = 0xffff8000L,
803 },{ .name = "PL3_THR_CNT", .decode.addr = A_PL3_THR_CNT,
804 },{ .name = "GEM_TSU_REF_CTRL", .decode.addr = A_GEM_TSU_REF_CTRL,
805 .reset = 0x51000,
806 .rsvd = 0xfec0c0f8L,
807 },{ .name = "DLL_REF_CTRL", .decode.addr = A_DLL_REF_CTRL,
808 .rsvd = 0xf8,
809 },{ .name = "AMS_REF_CTRL", .decode.addr = A_AMS_REF_CTRL,
810 .reset = 0x1800,
811 .rsvd = 0xfeffc0f8L,
812 },{ .name = "I2C0_REF_CTRL", .decode.addr = A_I2C0_REF_CTRL,
813 .reset = 0x01000500,
814 .rsvd = 0xfec0c0f8L,
815 },{ .name = "I2C1_REF_CTRL", .decode.addr = A_I2C1_REF_CTRL,
816 .reset = 0x01000500,
817 .rsvd = 0xfec0c0f8L,
818 },{ .name = "TIMESTAMP_REF_CTRL", .decode.addr = A_TIMESTAMP_REF_CTRL,
819 .reset = 0x01001800,
820 .rsvd = 0xfeffc0f8L,
821 },{ .name = "SAFETY_CHK", .decode.addr = A_SAFETY_CHK,
822 .reset = 0x00000000,
823 },{ .name = "CLKMON_STATUS", .decode.addr = A_CLKMON_STATUS,
824 .reset = 0x00000000,
825 .w1c = 0xFFFF,
826 .post_write = mon_ir_status_postw,
827 },{ .name = "CLKMON_MASK", .decode.addr = A_CLKMON_MASK,
828 .reset = 0x0000FFFF,
829 .ro = 0xFFFF,
830 },{ .name = "CLKMON_ENABLE", .decode.addr = A_CLKMON_ENABLE,
831 .pre_write = mon_ir_enable_prew,
832 },{ .name = "CLKMON_DISABLE", .decode.addr = A_CLKMON_DISABLE,
833 .pre_write = mon_ir_disable_prew,
834 },{ .name = "CLKMON_TRIGGER", .decode.addr = A_CLKMON_TRIGGER,
835 .pre_write = mon_ir_trigger_prew,
836 },{ .name = "CHKR0_CLKA_UPPER", .decode.addr = A_CHKR0_CLKA_UPPER,
837 },{ .name = "CHKR0_CLKA_LOWER", .decode.addr = A_CHKR0_CLKA_LOWER,
838 },{ .name = "CHKR0_CLKB_CNT", .decode.addr = A_CHKR0_CLKB_CNT,
839 },{ .name = "CHKR0_CTRL", .decode.addr = A_CHKR0_CTRL,
840 },{ .name = "CHKR1_CLKA_UPPER", .decode.addr = A_CHKR1_CLKA_UPPER,
841 },{ .name = "CHKR1_CLKA_LOWER", .decode.addr = A_CHKR1_CLKA_LOWER,
842 },{ .name = "CHKR1_CLKB_CNT", .decode.addr = A_CHKR1_CLKB_CNT,
843 },{ .name = "CHKR1_CTRL", .decode.addr = A_CHKR1_CTRL,
844 },{ .name = "CHKR2_CLKA_UPPER", .decode.addr = A_CHKR2_CLKA_UPPER,
845 },{ .name = "CHKR2_CLKA_LOWER", .decode.addr = A_CHKR2_CLKA_LOWER,
846 },{ .name = "CHKR2_CLKB_CNT", .decode.addr = A_CHKR2_CLKB_CNT,
847 },{ .name = "CHKR2_CTRL", .decode.addr = A_CHKR2_CTRL,
848 },{ .name = "CHKR3_CLKA_UPPER", .decode.addr = A_CHKR3_CLKA_UPPER,
849 },{ .name = "CHKR3_CLKA_LOWER", .decode.addr = A_CHKR3_CLKA_LOWER,
850 },{ .name = "CHKR3_CLKB_CNT", .decode.addr = A_CHKR3_CLKB_CNT,
851 },{ .name = "CHKR3_CTRL", .decode.addr = A_CHKR3_CTRL,
852 },{ .name = "CHKR4_CLKA_UPPER", .decode.addr = A_CHKR4_CLKA_UPPER,
853 },{ .name = "CHKR4_CLKA_LOWER", .decode.addr = A_CHKR4_CLKA_LOWER,
854 },{ .name = "CHKR4_CLKB_CNT", .decode.addr = A_CHKR4_CLKB_CNT,
855 },{ .name = "CHKR4_CTRL", .decode.addr = A_CHKR4_CTRL,
856 },{ .name = "CHKR5_CLKA_UPPER", .decode.addr = A_CHKR5_CLKA_UPPER,
857 },{ .name = "CHKR5_CLKA_LOWER", .decode.addr = A_CHKR5_CLKA_LOWER,
858 },{ .name = "CHKR5_CLKB_CNT", .decode.addr = A_CHKR5_CLKB_CNT,
859 },{ .name = "CHKR5_CTRL", .decode.addr = A_CHKR5_CTRL,
860 },{ .name = "CHKR6_CLKA_UPPER", .decode.addr = A_CHKR6_CLKA_UPPER,
861 },{ .name = "CHKR6_CLKA_LOWER", .decode.addr = A_CHKR6_CLKA_LOWER,
862 },{ .name = "CHKR6_CLKB_CNT", .decode.addr = A_CHKR6_CLKB_CNT,
863 },{ .name = "CHKR6_CTRL", .decode.addr = A_CHKR6_CTRL,
864 },{ .name = "CHKR7_CLKA_UPPER", .decode.addr = A_CHKR7_CLKA_UPPER,
865 },{ .name = "CHKR7_CLKA_LOWER", .decode.addr = A_CHKR7_CLKA_LOWER,
866 },{ .name = "CHKR7_CLKB_CNT", .decode.addr = A_CHKR7_CLKB_CNT,
867 },{ .name = "CHKR7_CTRL", .decode.addr = A_CHKR7_CTRL,
868 },
869 { .name = "BOOT_MODE_USER", .decode.addr = A_BOOT_MODE_USER,
870 .reset = 0x4,
871 .rsvd = 0xf0,
872 },{ .name = "BOOT_MODE_POR", .decode.addr = A_BOOT_MODE_POR,
873 .rsvd = 0xf000,
874 .ro = 0xfff,
875 },{ .name = "RESET_CTRL", .decode.addr = A_RESET_CTRL,
876 .reset = 0x40,
877 .rsvd = 0xff8c,
878 .gpios = (DepRegisterGPIOMapping[]) {
879 { .name = "SRST_B", .bit_pos = 4, .width = 1 },
880 {},
881 },
882 },{ .name = "BLOCKONLY_RST", .decode.addr = A_BLOCKONLY_RST,
883 .rsvd = 0x7dcc,
884 .ro = 0x7dcc,
885 .w1c = 0x8233,
886 },{ .name = "RESET_REASON", .decode.addr = A_RESET_REASON,
887 .rsvd = 0x7e0c,
888 .ro = 0x7e0c,
889 .w1c = 0x81f3,
890 .reset = 0x1,
891 },{ .name = "RST_LPD_IOU0", .decode.addr = A_RST_LPD_IOU0,
892 .reset = 0xf,
893 .rsvd = 0xfff0,
894 },{ .name = "RST_LPD_IOU1", .decode.addr = A_RST_LPD_IOU1,
895 .rsvd = 0xff,
896 },{ .name = "RST_LPD_IOU2", .decode.addr = A_RST_LPD_IOU2,
897 .reset = 0x7ffff,
898 .rsvd = 0xfff00000L,
899 },{ .name = "RST_LPD_TOP", .decode.addr = A_RST_LPD_TOP,
900 .reset = 0x188fdf,
901 .rsvd = 0x643020,
902 .gpios = (DepRegisterGPIOMapping[]) {
903 { .name = "RST_R5", .bit_pos = 0, .num = 2 },
904 {},
905 },
906 .inhibit_reset = 1u << 31,
907 },{ .name = "RST_LPD_DBG", .decode.addr = A_RST_LPD_DBG,
908 .reset = 0x33,
909 .rsvd = 0xffcc,
910 },{ .name = "BANK3_CTRL0", .decode.addr = A_BANK3_CTRL0,
911 .reset = 0x3ff,
912 },{ .name = "BANK3_CTRL1", .decode.addr = A_BANK3_CTRL1,
913 .reset = 0x3ff,
914 },{ .name = "BANK3_CTRL2", .decode.addr = A_BANK3_CTRL2,
915 .reset = 0x3ff,
916 },{ .name = "BANK3_CTRL3", .decode.addr = A_BANK3_CTRL3,
917 .reset = 0x3ff,
918 },{ .name = "BANK3_CTRL4", .decode.addr = A_BANK3_CTRL4,
919 .reset = 0x3ff,
920 },{ .name = "BANK3_CTRL5", .decode.addr = A_BANK3_CTRL5,
921 .reset = 0x3ff,
922 },{ .name = "BANK3_STATUS", .decode.addr = A_BANK3_STATUS,
923 .reset = 0,
924 .ro = 1
925 }
926};
927
928static void crl_apb_reset(DeviceState *dev)
929{
930 CRL_APB *s = XILINX_CRL_APB(dev);
931 unsigned int i;
932 QemuOpts *opts = qemu_find_opts_singleton("boot-opts");
933 uint32_t boot_mode = qemu_opt_get_number(opts, "mode", 0);
934
935 assert(boot_mode < (1 << R_BOOT_MODE_USER_BOOT_MODE_LENGTH));
936
937 for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
938 dep_register_reset(&s->regs_info[i]);
939 }
940
941 s->regs[R_BOOT_MODE_POR] = deposit32(s->regs[R_BOOT_MODE_POR],
942 R_BOOT_MODE_POR_BOOT_MODE0_SHIFT,
943 R_BOOT_MODE_POR_BOOT_MODE0_LENGTH,
944 boot_mode);
945
946 s->regs[R_BOOT_MODE_USER] = deposit32(s->regs[R_BOOT_MODE_USER],
947 R_BOOT_MODE_USER_BOOT_MODE_SHIFT,
948 R_BOOT_MODE_USER_BOOT_MODE_LENGTH,
949 boot_mode);
950 ir_update_irq(s);
951}
952
953static uint64_t crl_apb_read(void *opaque, hwaddr addr, unsigned size)
954{
955 CRL_APB *s = XILINX_CRL_APB(opaque);
956 DepRegisterInfo *r = &s->regs_info[addr / 4];
957
958 if (!r->data) {
959 qemu_log_mask(LOG_GUEST_ERROR,
960 "%s: Decode error: read from 0x%" HWADDR_PRIx "\n",
961 object_get_canonical_path(OBJECT(s)),
962 addr);
963 return 0;
964 }
965 return dep_register_read(r);
966}
967
968static void crl_apb_write(void *opaque, hwaddr addr, uint64_t value,
969 unsigned size)
970{
971 CRL_APB *s = XILINX_CRL_APB(opaque);
972 DepRegisterInfo *r = &s->regs_info[addr / 4];
973
974 if (!r->data) {
975 qemu_log_mask(LOG_GUEST_ERROR,
976 "%s: Decode error: write from 0x%" HWADDR_PRIx "=0x%" PRIx64 "\n",
977 object_get_canonical_path(OBJECT(s)),
978 addr, value);
979 return;
980 }
981 dep_register_write(r, value, ~0);
982}
983
984static const MemoryRegionOps crl_apb_ops = {
985 .read = crl_apb_read,
986 .write = crl_apb_write,
987 .endianness = DEVICE_LITTLE_ENDIAN,
988 .valid = {
989 .min_access_size = 4,
990 .max_access_size = 4,
991 },
992};
993
994static void crl_apb_realize(DeviceState *dev, Error **errp)
995{
996 CRL_APB *s = XILINX_CRL_APB(dev);
997 const char *prefix = object_get_canonical_path(OBJECT(dev));
998 unsigned int i;
999
1000 for (i = 0; i < ARRAY_SIZE(crl_apb_regs_info); ++i) {
1001 DepRegisterInfo *r = &s->regs_info[crl_apb_regs_info[i].decode.addr/4];
1002
1003 *r = (DepRegisterInfo) {
1004 .data = (uint8_t *)&s->regs[
1005 crl_apb_regs_info[i].decode.addr/4],
1006 .data_size = sizeof(uint32_t),
1007 .access = &crl_apb_regs_info[i],
1008 .debug = XILINX_CRL_APB_ERR_DEBUG,
1009 .prefix = prefix,
1010 .opaque = s,
1011 };
1012 dep_register_init(r);
1013 qdev_pass_all_gpios(DEVICE(r), dev);
1014 }
1015}
1016
1017static void crl_apb_init(Object *obj)
1018{
1019 CRL_APB *s = XILINX_CRL_APB(obj);
1020 SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
1021
1022 memory_region_init_io(&s->iomem, obj, &crl_apb_ops, s,
1023 TYPE_XILINX_CRL_APB, R_MAX * 4);
1024 sysbus_init_mmio(sbd, &s->iomem);
1025 sysbus_init_irq(sbd, &s->irq_ir);
1026 qdev_init_gpio_out_named(DEVICE(obj), &s->mon_irq_ir, "clkmon_error_out",
1027 1);
1028}
1029
1030static const VMStateDescription vmstate_crl_apb = {
1031 .name = TYPE_XILINX_CRL_APB,
1032 .version_id = 1,
1033 .minimum_version_id = 1,
1034 .minimum_version_id_old = 1,
1035 .fields = (VMStateField[]) {
1036 VMSTATE_UINT32_ARRAY(regs, CRL_APB, R_MAX),
1037 VMSTATE_END_OF_LIST(),
1038 }
1039};
1040
1041static const FDTGenericGPIOSet crl_gpios[] = {
1042 {
1043 .names = &fdt_generic_gpio_name_set_gpio,
1044 .gpios = (FDTGenericGPIOConnection[]) {
1045 { .name = "RST_R5", .fdt_index = 0, .range = 2 },
1046 { .name = "SRST_B", .fdt_index = 2 },
1047 { },
1048 }
1049 },
1050 { },
1051};
1052
1053static const FDTGenericGPIOSet crl_client_gpios [] = {
1054 {
1055 .names = &fdt_generic_gpio_name_set_gpio,
1056 .gpios = (FDTGenericGPIOConnection []) {
1057 { .name = "clkmon_error_out", .fdt_index = 0, .range = 1 },
1058 { },
1059 },
1060 },
1061 { },
1062};
1063
1064static void crl_apb_class_init(ObjectClass *klass, void *data)
1065{
1066 DeviceClass *dc = DEVICE_CLASS(klass);
1067 FDTGenericGPIOClass *fggc = FDT_GENERIC_GPIO_CLASS(klass);
1068
1069 dc->reset = crl_apb_reset;
1070 dc->realize = crl_apb_realize;
1071 dc->vmsd = &vmstate_crl_apb;
1072 fggc->controller_gpios = crl_gpios;
1073 fggc->client_gpios = crl_client_gpios;
1074}
1075
1076static const TypeInfo crl_apb_info = {
1077 .name = TYPE_XILINX_CRL_APB,
1078 .parent = TYPE_SYS_BUS_DEVICE,
1079 .instance_size = sizeof(CRL_APB),
1080 .class_init = crl_apb_class_init,
1081 .instance_init = crl_apb_init,
1082 .interfaces = (InterfaceInfo[]) {
1083 { TYPE_FDT_GENERIC_GPIO },
1084 { }
1085 },
1086};
1087
1088static void crl_apb_register_types(void)
1089{
1090 type_register_static(&crl_apb_info);
1091}
1092
1093type_init(crl_apb_register_types)
1094