]>
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) | |
cf83f140 | 261 | qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); |
0019ad53 BS |
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; | |
cf83f140 | 341 | qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); |
bfa30a38 BS |
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 | |
46eedc0e | 417 | static void apc_init(Object *obj) |
2582cfa0 | 418 | { |
46eedc0e XZ |
419 | APCState *s = APC(obj); |
420 | SysBusDevice *dev = SYS_BUS_DEVICE(obj); | |
3475187d | 421 | |
2582cfa0 BS |
422 | sysbus_init_irq(dev, &s->cpu_halt); |
423 | ||
424 | /* Power management (APC) XXX: not a Slavio device */ | |
46eedc0e | 425 | memory_region_init_io(&s->iomem, obj, &apc_mem_ops, s, |
9c48dee6 | 426 | "apc", MISC_SIZE); |
750ecd44 | 427 | sysbus_init_mmio(dev, &s->iomem); |
2582cfa0 BS |
428 | } |
429 | ||
46eedc0e | 430 | static void slavio_misc_init(Object *obj) |
2582cfa0 | 431 | { |
46eedc0e XZ |
432 | DeviceState *dev = DEVICE(obj); |
433 | MiscState *s = SLAVIO_MISC(obj); | |
434 | SysBusDevice *sbd = SYS_BUS_DEVICE(obj); | |
2582cfa0 | 435 | |
95eb2084 AF |
436 | sysbus_init_irq(sbd, &s->irq); |
437 | sysbus_init_irq(sbd, &s->fdc_tc); | |
2582cfa0 BS |
438 | |
439 | /* 8 bit registers */ | |
440 | /* Slavio control */ | |
46eedc0e | 441 | memory_region_init_io(&s->cfg_iomem, obj, &slavio_cfg_mem_ops, s, |
dd703aae | 442 | "configuration", MISC_SIZE); |
95eb2084 | 443 | sysbus_init_mmio(sbd, &s->cfg_iomem); |
2582cfa0 BS |
444 | |
445 | /* Diagnostics */ | |
46eedc0e | 446 | memory_region_init_io(&s->diag_iomem, obj, &slavio_diag_mem_ops, s, |
96891e59 | 447 | "diagnostic", MISC_SIZE); |
95eb2084 | 448 | sysbus_init_mmio(sbd, &s->diag_iomem); |
2582cfa0 BS |
449 | |
450 | /* Modem control */ | |
46eedc0e | 451 | memory_region_init_io(&s->mdm_iomem, obj, &slavio_mdm_mem_ops, s, |
2e66ac3d | 452 | "modem", MISC_SIZE); |
95eb2084 | 453 | sysbus_init_mmio(sbd, &s->mdm_iomem); |
2582cfa0 BS |
454 | |
455 | /* 16 bit registers */ | |
456 | /* ss600mp diag LEDs */ | |
46eedc0e | 457 | memory_region_init_io(&s->led_iomem, obj, &slavio_led_mem_ops, s, |
0e1cd657 | 458 | "leds", LED_SIZE); |
95eb2084 | 459 | sysbus_init_mmio(sbd, &s->led_iomem); |
2582cfa0 BS |
460 | |
461 | /* 32 bit registers */ | |
462 | /* System control */ | |
46eedc0e | 463 | memory_region_init_io(&s->sysctrl_iomem, obj, &slavio_sysctrl_mem_ops, s, |
0e1cd657 | 464 | "system-control", SYSCTRL_SIZE); |
95eb2084 | 465 | sysbus_init_mmio(sbd, &s->sysctrl_iomem); |
2582cfa0 BS |
466 | |
467 | /* AUX 1 (Misc System Functions) */ | |
46eedc0e | 468 | memory_region_init_io(&s->aux1_iomem, obj, &slavio_aux1_mem_ops, s, |
cccd43c5 | 469 | "misc-system-functions", MISC_SIZE); |
95eb2084 | 470 | sysbus_init_mmio(sbd, &s->aux1_iomem); |
2582cfa0 BS |
471 | |
472 | /* AUX 2 (Software Powerdown Control) */ | |
46eedc0e | 473 | memory_region_init_io(&s->aux2_iomem, obj, &slavio_aux2_mem_ops, s, |
40ce02fc | 474 | "software-powerdown-control", MISC_SIZE); |
95eb2084 | 475 | sysbus_init_mmio(sbd, &s->aux2_iomem); |
2582cfa0 | 476 | |
95eb2084 | 477 | qdev_init_gpio_in(dev, slavio_set_power_fail, 1); |
2582cfa0 | 478 | } |
0019ad53 | 479 | |
999e12bb AL |
480 | static void slavio_misc_class_init(ObjectClass *klass, void *data) |
481 | { | |
39bffca2 | 482 | DeviceClass *dc = DEVICE_CLASS(klass); |
999e12bb | 483 | |
39bffca2 AL |
484 | dc->reset = slavio_misc_reset; |
485 | dc->vmsd = &vmstate_misc; | |
999e12bb AL |
486 | } |
487 | ||
8c43a6f0 | 488 | static const TypeInfo slavio_misc_info = { |
95eb2084 | 489 | .name = TYPE_SLAVIO_MISC, |
39bffca2 AL |
490 | .parent = TYPE_SYS_BUS_DEVICE, |
491 | .instance_size = sizeof(MiscState), | |
46eedc0e | 492 | .instance_init = slavio_misc_init, |
39bffca2 | 493 | .class_init = slavio_misc_class_init, |
2582cfa0 BS |
494 | }; |
495 | ||
8c43a6f0 | 496 | static const TypeInfo apc_info = { |
f1a0a79f | 497 | .name = TYPE_APC, |
39bffca2 AL |
498 | .parent = TYPE_SYS_BUS_DEVICE, |
499 | .instance_size = sizeof(MiscState), | |
46eedc0e | 500 | .instance_init = apc_init, |
2582cfa0 BS |
501 | }; |
502 | ||
83f7d43a | 503 | static void slavio_misc_register_types(void) |
2582cfa0 | 504 | { |
39bffca2 AL |
505 | type_register_static(&slavio_misc_info); |
506 | type_register_static(&apc_info); | |
3475187d | 507 | } |
2582cfa0 | 508 | |
83f7d43a | 509 | type_init(slavio_misc_register_types) |