]>
Commit | Line | Data |
---|---|---|
3475187d FB |
1 | /* |
2 | * QEMU Sparc SLAVIO aux io port emulation | |
5fafdf24 | 3 | * |
3475187d | 4 | * Copyright (c) 2005 Fabrice Bellard |
5fafdf24 | 5 | * |
3475187d FB |
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
7 | * of this software and associated documentation files (the "Software"), to deal | |
8 | * in the Software without restriction, including without limitation the rights | |
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | * copies of the Software, and to permit persons to whom the Software is | |
11 | * furnished to do so, subject to the following conditions: | |
12 | * | |
13 | * The above copyright notice and this permission notice shall be included in | |
14 | * all copies or substantial portions of the Software. | |
15 | * | |
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
19 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
22 | * THE SOFTWARE. | |
23 | */ | |
2582cfa0 | 24 | |
9c17d615 | 25 | #include "sysemu/sysemu.h" |
2582cfa0 | 26 | #include "sysbus.h" |
97bf4851 | 27 | #include "trace.h" |
3475187d FB |
28 | |
29 | /* | |
30 | * This is the auxio port, chip control and system control part of | |
31 | * chip STP2001 (Slave I/O), also produced as NCR89C105. See | |
32 | * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt | |
33 | * | |
34 | * This also includes the PMC CPU idle controller. | |
35 | */ | |
36 | ||
3475187d | 37 | typedef struct MiscState { |
2582cfa0 | 38 | SysBusDevice busdev; |
dd703aae | 39 | MemoryRegion cfg_iomem; |
96891e59 | 40 | MemoryRegion diag_iomem; |
2e66ac3d | 41 | MemoryRegion mdm_iomem; |
aca23c71 | 42 | MemoryRegion led_iomem; |
cd64a524 | 43 | MemoryRegion sysctrl_iomem; |
cccd43c5 | 44 | MemoryRegion aux1_iomem; |
40ce02fc | 45 | MemoryRegion aux2_iomem; |
d537cf6c | 46 | qemu_irq irq; |
97bbb109 | 47 | qemu_irq fdc_tc; |
d37adb09 | 48 | uint32_t dummy; |
3475187d FB |
49 | uint8_t config; |
50 | uint8_t aux1, aux2; | |
bfa30a38 | 51 | uint8_t diag, mctrl; |
d37adb09 | 52 | uint8_t sysctrl; |
6a3b9cc9 | 53 | uint16_t leds; |
3475187d FB |
54 | } MiscState; |
55 | ||
2582cfa0 BS |
56 | typedef struct APCState { |
57 | SysBusDevice busdev; | |
9c48dee6 | 58 | MemoryRegion iomem; |
2582cfa0 BS |
59 | qemu_irq cpu_halt; |
60 | } APCState; | |
61 | ||
5aca8c3b | 62 | #define MISC_SIZE 1 |
a8f48dcc | 63 | #define SYSCTRL_SIZE 4 |
3475187d | 64 | |
2be17ebd BS |
65 | #define AUX1_TC 0x02 |
66 | ||
7debeb82 BS |
67 | #define AUX2_PWROFF 0x01 |
68 | #define AUX2_PWRINTCLR 0x02 | |
69 | #define AUX2_PWRFAIL 0x20 | |
70 | ||
71 | #define CFG_PWRINTEN 0x08 | |
72 | ||
73 | #define SYS_RESET 0x01 | |
74 | #define SYS_RESETSTAT 0x02 | |
75 | ||
3475187d FB |
76 | static void slavio_misc_update_irq(void *opaque) |
77 | { | |
78 | MiscState *s = opaque; | |
79 | ||
7debeb82 | 80 | if ((s->aux2 & AUX2_PWRFAIL) && (s->config & CFG_PWRINTEN)) { |
97bf4851 | 81 | trace_slavio_misc_update_irq_raise(); |
d537cf6c | 82 | qemu_irq_raise(s->irq); |
3475187d | 83 | } else { |
97bf4851 | 84 | trace_slavio_misc_update_irq_lower(); |
d537cf6c | 85 | qemu_irq_lower(s->irq); |
3475187d FB |
86 | } |
87 | } | |
88 | ||
1795057a | 89 | static void slavio_misc_reset(DeviceState *d) |
3475187d | 90 | { |
1795057a | 91 | MiscState *s = container_of(d, MiscState, busdev.qdev); |
3475187d | 92 | |
4e3b1ea1 | 93 | // Diagnostic and system control registers not cleared in reset |
3475187d FB |
94 | s->config = s->aux1 = s->aux2 = s->mctrl = 0; |
95 | } | |
96 | ||
b2b6f6ec | 97 | static void slavio_set_power_fail(void *opaque, int irq, int power_failing) |
3475187d FB |
98 | { |
99 | MiscState *s = opaque; | |
100 | ||
97bf4851 | 101 | trace_slavio_set_power_fail(power_failing, s->config); |
7debeb82 BS |
102 | if (power_failing && (s->config & CFG_PWRINTEN)) { |
103 | s->aux2 |= AUX2_PWRFAIL; | |
3475187d | 104 | } else { |
7debeb82 | 105 | s->aux2 &= ~AUX2_PWRFAIL; |
3475187d FB |
106 | } |
107 | slavio_misc_update_irq(s); | |
108 | } | |
109 | ||
a8170e5e | 110 | static void slavio_cfg_mem_writeb(void *opaque, hwaddr addr, |
dd703aae | 111 | uint64_t val, unsigned size) |
a8f48dcc BS |
112 | { |
113 | MiscState *s = opaque; | |
114 | ||
97bf4851 | 115 | trace_slavio_cfg_mem_writeb(val & 0xff); |
a8f48dcc BS |
116 | s->config = val & 0xff; |
117 | slavio_misc_update_irq(s); | |
118 | } | |
119 | ||
a8170e5e | 120 | static uint64_t slavio_cfg_mem_readb(void *opaque, hwaddr addr, |
dd703aae | 121 | unsigned size) |
a8f48dcc BS |
122 | { |
123 | MiscState *s = opaque; | |
124 | uint32_t ret = 0; | |
125 | ||
126 | ret = s->config; | |
97bf4851 | 127 | trace_slavio_cfg_mem_readb(ret); |
a8f48dcc BS |
128 | return ret; |
129 | } | |
130 | ||
dd703aae BC |
131 | static const MemoryRegionOps slavio_cfg_mem_ops = { |
132 | .read = slavio_cfg_mem_readb, | |
133 | .write = slavio_cfg_mem_writeb, | |
134 | .endianness = DEVICE_NATIVE_ENDIAN, | |
135 | .valid = { | |
136 | .min_access_size = 1, | |
137 | .max_access_size = 1, | |
138 | }, | |
a8f48dcc BS |
139 | }; |
140 | ||
a8170e5e | 141 | static void slavio_diag_mem_writeb(void *opaque, hwaddr addr, |
96891e59 | 142 | uint64_t val, unsigned size) |
3475187d FB |
143 | { |
144 | MiscState *s = opaque; | |
145 | ||
97bf4851 | 146 | trace_slavio_diag_mem_writeb(val & 0xff); |
a8f48dcc | 147 | s->diag = val & 0xff; |
3475187d FB |
148 | } |
149 | ||
a8170e5e | 150 | static uint64_t slavio_diag_mem_readb(void *opaque, hwaddr addr, |
96891e59 | 151 | unsigned size) |
3475187d FB |
152 | { |
153 | MiscState *s = opaque; | |
154 | uint32_t ret = 0; | |
155 | ||
a8f48dcc | 156 | ret = s->diag; |
97bf4851 | 157 | trace_slavio_diag_mem_readb(ret); |
a8f48dcc BS |
158 | return ret; |
159 | } | |
160 | ||
96891e59 BC |
161 | static const MemoryRegionOps slavio_diag_mem_ops = { |
162 | .read = slavio_diag_mem_readb, | |
163 | .write = slavio_diag_mem_writeb, | |
164 | .endianness = DEVICE_NATIVE_ENDIAN, | |
165 | .valid = { | |
166 | .min_access_size = 1, | |
167 | .max_access_size = 1, | |
168 | }, | |
a8f48dcc BS |
169 | }; |
170 | ||
a8170e5e | 171 | static void slavio_mdm_mem_writeb(void *opaque, hwaddr addr, |
2e66ac3d | 172 | uint64_t val, unsigned size) |
a8f48dcc BS |
173 | { |
174 | MiscState *s = opaque; | |
175 | ||
97bf4851 | 176 | trace_slavio_mdm_mem_writeb(val & 0xff); |
a8f48dcc BS |
177 | s->mctrl = val & 0xff; |
178 | } | |
179 | ||
a8170e5e | 180 | static uint64_t slavio_mdm_mem_readb(void *opaque, hwaddr addr, |
2e66ac3d | 181 | unsigned size) |
a8f48dcc BS |
182 | { |
183 | MiscState *s = opaque; | |
184 | uint32_t ret = 0; | |
185 | ||
186 | ret = s->mctrl; | |
97bf4851 | 187 | trace_slavio_mdm_mem_readb(ret); |
3475187d FB |
188 | return ret; |
189 | } | |
190 | ||
2e66ac3d BC |
191 | static const MemoryRegionOps slavio_mdm_mem_ops = { |
192 | .read = slavio_mdm_mem_readb, | |
193 | .write = slavio_mdm_mem_writeb, | |
194 | .endianness = DEVICE_NATIVE_ENDIAN, | |
195 | .valid = { | |
196 | .min_access_size = 1, | |
197 | .max_access_size = 1, | |
198 | }, | |
3475187d FB |
199 | }; |
200 | ||
a8170e5e | 201 | static void slavio_aux1_mem_writeb(void *opaque, hwaddr addr, |
cccd43c5 | 202 | uint64_t val, unsigned size) |
0019ad53 BS |
203 | { |
204 | MiscState *s = opaque; | |
205 | ||
97bf4851 | 206 | trace_slavio_aux1_mem_writeb(val & 0xff); |
2be17ebd BS |
207 | if (val & AUX1_TC) { |
208 | // Send a pulse to floppy terminal count line | |
209 | if (s->fdc_tc) { | |
210 | qemu_irq_raise(s->fdc_tc); | |
211 | qemu_irq_lower(s->fdc_tc); | |
212 | } | |
213 | val &= ~AUX1_TC; | |
214 | } | |
0019ad53 BS |
215 | s->aux1 = val & 0xff; |
216 | } | |
217 | ||
a8170e5e | 218 | static uint64_t slavio_aux1_mem_readb(void *opaque, hwaddr addr, |
cccd43c5 | 219 | unsigned size) |
0019ad53 BS |
220 | { |
221 | MiscState *s = opaque; | |
222 | uint32_t ret = 0; | |
223 | ||
224 | ret = s->aux1; | |
97bf4851 | 225 | trace_slavio_aux1_mem_readb(ret); |
0019ad53 BS |
226 | return ret; |
227 | } | |
228 | ||
cccd43c5 BC |
229 | static const MemoryRegionOps slavio_aux1_mem_ops = { |
230 | .read = slavio_aux1_mem_readb, | |
231 | .write = slavio_aux1_mem_writeb, | |
232 | .endianness = DEVICE_NATIVE_ENDIAN, | |
233 | .valid = { | |
234 | .min_access_size = 1, | |
235 | .max_access_size = 1, | |
236 | }, | |
0019ad53 BS |
237 | }; |
238 | ||
a8170e5e | 239 | static void slavio_aux2_mem_writeb(void *opaque, hwaddr addr, |
40ce02fc | 240 | uint64_t val, unsigned size) |
0019ad53 BS |
241 | { |
242 | MiscState *s = opaque; | |
243 | ||
244 | val &= AUX2_PWRINTCLR | AUX2_PWROFF; | |
97bf4851 | 245 | trace_slavio_aux2_mem_writeb(val & 0xff); |
0019ad53 BS |
246 | val |= s->aux2 & AUX2_PWRFAIL; |
247 | if (val & AUX2_PWRINTCLR) // Clear Power Fail int | |
248 | val &= AUX2_PWROFF; | |
249 | s->aux2 = val; | |
250 | if (val & AUX2_PWROFF) | |
251 | qemu_system_shutdown_request(); | |
252 | slavio_misc_update_irq(s); | |
253 | } | |
254 | ||
a8170e5e | 255 | static uint64_t slavio_aux2_mem_readb(void *opaque, hwaddr addr, |
40ce02fc | 256 | unsigned size) |
0019ad53 BS |
257 | { |
258 | MiscState *s = opaque; | |
259 | uint32_t ret = 0; | |
260 | ||
261 | ret = s->aux2; | |
97bf4851 | 262 | trace_slavio_aux2_mem_readb(ret); |
0019ad53 BS |
263 | return ret; |
264 | } | |
265 | ||
40ce02fc BC |
266 | static const MemoryRegionOps slavio_aux2_mem_ops = { |
267 | .read = slavio_aux2_mem_readb, | |
268 | .write = slavio_aux2_mem_writeb, | |
269 | .endianness = DEVICE_NATIVE_ENDIAN, | |
270 | .valid = { | |
271 | .min_access_size = 1, | |
272 | .max_access_size = 1, | |
273 | }, | |
0019ad53 BS |
274 | }; |
275 | ||
a8170e5e | 276 | static void apc_mem_writeb(void *opaque, hwaddr addr, |
9c48dee6 | 277 | uint64_t val, unsigned size) |
0019ad53 | 278 | { |
2582cfa0 | 279 | APCState *s = opaque; |
0019ad53 | 280 | |
97bf4851 | 281 | trace_apc_mem_writeb(val & 0xff); |
6d0c293d | 282 | qemu_irq_raise(s->cpu_halt); |
0019ad53 BS |
283 | } |
284 | ||
a8170e5e | 285 | static uint64_t apc_mem_readb(void *opaque, hwaddr addr, |
9c48dee6 | 286 | unsigned size) |
0019ad53 BS |
287 | { |
288 | uint32_t ret = 0; | |
289 | ||
97bf4851 | 290 | trace_apc_mem_readb(ret); |
0019ad53 BS |
291 | return ret; |
292 | } | |
293 | ||
9c48dee6 BC |
294 | static const MemoryRegionOps apc_mem_ops = { |
295 | .read = apc_mem_readb, | |
296 | .write = apc_mem_writeb, | |
297 | .endianness = DEVICE_NATIVE_ENDIAN, | |
298 | .valid = { | |
299 | .min_access_size = 1, | |
300 | .max_access_size = 1, | |
301 | } | |
0019ad53 BS |
302 | }; |
303 | ||
a8170e5e | 304 | static uint64_t slavio_sysctrl_mem_readl(void *opaque, hwaddr addr, |
cd64a524 | 305 | unsigned size) |
bfa30a38 BS |
306 | { |
307 | MiscState *s = opaque; | |
a8f48dcc | 308 | uint32_t ret = 0; |
bfa30a38 | 309 | |
a8f48dcc | 310 | switch (addr) { |
bfa30a38 BS |
311 | case 0: |
312 | ret = s->sysctrl; | |
313 | break; | |
314 | default: | |
315 | break; | |
316 | } | |
97bf4851 | 317 | trace_slavio_sysctrl_mem_readl(ret); |
bfa30a38 BS |
318 | return ret; |
319 | } | |
320 | ||
a8170e5e | 321 | static void slavio_sysctrl_mem_writel(void *opaque, hwaddr addr, |
cd64a524 | 322 | uint64_t val, unsigned size) |
bfa30a38 BS |
323 | { |
324 | MiscState *s = opaque; | |
bfa30a38 | 325 | |
97bf4851 | 326 | trace_slavio_sysctrl_mem_writel(val); |
a8f48dcc | 327 | switch (addr) { |
bfa30a38 | 328 | case 0: |
7debeb82 BS |
329 | if (val & SYS_RESET) { |
330 | s->sysctrl = SYS_RESETSTAT; | |
bfa30a38 BS |
331 | qemu_system_reset_request(); |
332 | } | |
333 | break; | |
334 | default: | |
335 | break; | |
336 | } | |
337 | } | |
338 | ||
cd64a524 BC |
339 | static const MemoryRegionOps slavio_sysctrl_mem_ops = { |
340 | .read = slavio_sysctrl_mem_readl, | |
341 | .write = slavio_sysctrl_mem_writel, | |
342 | .endianness = DEVICE_NATIVE_ENDIAN, | |
343 | .valid = { | |
344 | .min_access_size = 4, | |
345 | .max_access_size = 4, | |
346 | }, | |
bfa30a38 BS |
347 | }; |
348 | ||
a8170e5e | 349 | static uint64_t slavio_led_mem_readw(void *opaque, hwaddr addr, |
aca23c71 | 350 | unsigned size) |
6a3b9cc9 BS |
351 | { |
352 | MiscState *s = opaque; | |
a8f48dcc | 353 | uint32_t ret = 0; |
6a3b9cc9 | 354 | |
a8f48dcc | 355 | switch (addr) { |
6a3b9cc9 BS |
356 | case 0: |
357 | ret = s->leds; | |
358 | break; | |
359 | default: | |
360 | break; | |
361 | } | |
97bf4851 | 362 | trace_slavio_led_mem_readw(ret); |
6a3b9cc9 BS |
363 | return ret; |
364 | } | |
365 | ||
a8170e5e | 366 | static void slavio_led_mem_writew(void *opaque, hwaddr addr, |
aca23c71 | 367 | uint64_t val, unsigned size) |
6a3b9cc9 BS |
368 | { |
369 | MiscState *s = opaque; | |
6a3b9cc9 | 370 | |
97bf4851 | 371 | trace_slavio_led_mem_readw(val & 0xffff); |
a8f48dcc | 372 | switch (addr) { |
6a3b9cc9 | 373 | case 0: |
d5296cb5 | 374 | s->leds = val; |
6a3b9cc9 BS |
375 | break; |
376 | default: | |
377 | break; | |
378 | } | |
379 | } | |
380 | ||
aca23c71 BC |
381 | static const MemoryRegionOps slavio_led_mem_ops = { |
382 | .read = slavio_led_mem_readw, | |
383 | .write = slavio_led_mem_writew, | |
384 | .endianness = DEVICE_NATIVE_ENDIAN, | |
385 | .valid = { | |
386 | .min_access_size = 2, | |
387 | .max_access_size = 2, | |
388 | }, | |
6a3b9cc9 BS |
389 | }; |
390 | ||
d37adb09 BS |
391 | static const VMStateDescription vmstate_misc = { |
392 | .name ="slavio_misc", | |
393 | .version_id = 1, | |
394 | .minimum_version_id = 1, | |
395 | .minimum_version_id_old = 1, | |
396 | .fields = (VMStateField []) { | |
397 | VMSTATE_UINT32(dummy, MiscState), | |
398 | VMSTATE_UINT8(config, MiscState), | |
399 | VMSTATE_UINT8(aux1, MiscState), | |
400 | VMSTATE_UINT8(aux2, MiscState), | |
401 | VMSTATE_UINT8(diag, MiscState), | |
402 | VMSTATE_UINT8(mctrl, MiscState), | |
403 | VMSTATE_UINT8(sysctrl, MiscState), | |
404 | VMSTATE_END_OF_LIST() | |
405 | } | |
406 | }; | |
3475187d | 407 | |
81a322d4 | 408 | static int apc_init1(SysBusDevice *dev) |
2582cfa0 BS |
409 | { |
410 | APCState *s = FROM_SYSBUS(APCState, dev); | |
3475187d | 411 | |
2582cfa0 BS |
412 | sysbus_init_irq(dev, &s->cpu_halt); |
413 | ||
414 | /* Power management (APC) XXX: not a Slavio device */ | |
9c48dee6 BC |
415 | memory_region_init_io(&s->iomem, &apc_mem_ops, s, |
416 | "apc", MISC_SIZE); | |
750ecd44 | 417 | sysbus_init_mmio(dev, &s->iomem); |
81a322d4 | 418 | return 0; |
2582cfa0 BS |
419 | } |
420 | ||
81a322d4 | 421 | static int slavio_misc_init1(SysBusDevice *dev) |
2582cfa0 BS |
422 | { |
423 | MiscState *s = FROM_SYSBUS(MiscState, dev); | |
2582cfa0 BS |
424 | |
425 | sysbus_init_irq(dev, &s->irq); | |
426 | sysbus_init_irq(dev, &s->fdc_tc); | |
427 | ||
428 | /* 8 bit registers */ | |
429 | /* Slavio control */ | |
dd703aae BC |
430 | memory_region_init_io(&s->cfg_iomem, &slavio_cfg_mem_ops, s, |
431 | "configuration", MISC_SIZE); | |
750ecd44 | 432 | sysbus_init_mmio(dev, &s->cfg_iomem); |
2582cfa0 BS |
433 | |
434 | /* Diagnostics */ | |
96891e59 BC |
435 | memory_region_init_io(&s->diag_iomem, &slavio_diag_mem_ops, s, |
436 | "diagnostic", MISC_SIZE); | |
750ecd44 | 437 | sysbus_init_mmio(dev, &s->diag_iomem); |
2582cfa0 BS |
438 | |
439 | /* Modem control */ | |
2e66ac3d BC |
440 | memory_region_init_io(&s->mdm_iomem, &slavio_mdm_mem_ops, s, |
441 | "modem", MISC_SIZE); | |
750ecd44 | 442 | sysbus_init_mmio(dev, &s->mdm_iomem); |
2582cfa0 BS |
443 | |
444 | /* 16 bit registers */ | |
445 | /* ss600mp diag LEDs */ | |
aca23c71 BC |
446 | memory_region_init_io(&s->led_iomem, &slavio_led_mem_ops, s, |
447 | "leds", MISC_SIZE); | |
750ecd44 | 448 | sysbus_init_mmio(dev, &s->led_iomem); |
2582cfa0 BS |
449 | |
450 | /* 32 bit registers */ | |
451 | /* System control */ | |
cd64a524 BC |
452 | memory_region_init_io(&s->sysctrl_iomem, &slavio_sysctrl_mem_ops, s, |
453 | "system-control", MISC_SIZE); | |
750ecd44 | 454 | sysbus_init_mmio(dev, &s->sysctrl_iomem); |
2582cfa0 BS |
455 | |
456 | /* AUX 1 (Misc System Functions) */ | |
cccd43c5 BC |
457 | memory_region_init_io(&s->aux1_iomem, &slavio_aux1_mem_ops, s, |
458 | "misc-system-functions", MISC_SIZE); | |
750ecd44 | 459 | sysbus_init_mmio(dev, &s->aux1_iomem); |
2582cfa0 BS |
460 | |
461 | /* AUX 2 (Software Powerdown Control) */ | |
40ce02fc BC |
462 | memory_region_init_io(&s->aux2_iomem, &slavio_aux2_mem_ops, s, |
463 | "software-powerdown-control", MISC_SIZE); | |
750ecd44 | 464 | sysbus_init_mmio(dev, &s->aux2_iomem); |
2582cfa0 | 465 | |
b2b6f6ec BS |
466 | qdev_init_gpio_in(&dev->qdev, slavio_set_power_fail, 1); |
467 | ||
81a322d4 | 468 | return 0; |
2582cfa0 | 469 | } |
0019ad53 | 470 | |
999e12bb AL |
471 | static void slavio_misc_class_init(ObjectClass *klass, void *data) |
472 | { | |
39bffca2 | 473 | DeviceClass *dc = DEVICE_CLASS(klass); |
999e12bb AL |
474 | SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); |
475 | ||
476 | k->init = slavio_misc_init1; | |
39bffca2 AL |
477 | dc->reset = slavio_misc_reset; |
478 | dc->vmsd = &vmstate_misc; | |
999e12bb AL |
479 | } |
480 | ||
8c43a6f0 | 481 | static const TypeInfo slavio_misc_info = { |
39bffca2 AL |
482 | .name = "slavio_misc", |
483 | .parent = TYPE_SYS_BUS_DEVICE, | |
484 | .instance_size = sizeof(MiscState), | |
485 | .class_init = slavio_misc_class_init, | |
2582cfa0 BS |
486 | }; |
487 | ||
999e12bb AL |
488 | static void apc_class_init(ObjectClass *klass, void *data) |
489 | { | |
490 | SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); | |
491 | ||
492 | k->init = apc_init1; | |
493 | } | |
494 | ||
8c43a6f0 | 495 | static const TypeInfo apc_info = { |
39bffca2 AL |
496 | .name = "apc", |
497 | .parent = TYPE_SYS_BUS_DEVICE, | |
498 | .instance_size = sizeof(MiscState), | |
499 | .class_init = apc_class_init, | |
2582cfa0 BS |
500 | }; |
501 | ||
83f7d43a | 502 | static void slavio_misc_register_types(void) |
2582cfa0 | 503 | { |
39bffca2 AL |
504 | type_register_static(&slavio_misc_info); |
505 | type_register_static(&apc_info); | |
3475187d | 506 | } |
2582cfa0 | 507 | |
83f7d43a | 508 | type_init(slavio_misc_register_types) |