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