]>
Commit | Line | Data |
---|---|---|
7bea0dd4 PMD |
1 | /* |
2 | * SMC FDC37C669 Super I/O controller | |
3 | * | |
4 | * Copyright (c) 2018 Philippe Mathieu-Daudé | |
5 | * | |
b822dfae | 6 | * This work is licensed under the terms of the GNU GPL, version 2 or later. |
7bea0dd4 PMD |
7 | * See the COPYING file in the top-level directory. |
8 | * SPDX-License-Identifier: GPL-2.0-or-later | |
9 | */ | |
10 | ||
11 | #include "qemu/osdep.h" | |
12 | #include "hw/isa/superio.h" | |
0b8fa32f | 13 | #include "qemu/module.h" |
7bea0dd4 PMD |
14 | |
15 | /* UARTs (compatible with NS16450 or PC16550) */ | |
16 | ||
17 | static bool is_serial_enabled(ISASuperIODevice *sio, uint8_t index) | |
18 | { | |
19 | return index < 2; | |
20 | } | |
21 | ||
22 | static uint16_t get_serial_iobase(ISASuperIODevice *sio, uint8_t index) | |
23 | { | |
24 | return index ? 0x2f8 : 0x3f8; | |
25 | } | |
26 | ||
27 | static unsigned int get_serial_irq(ISASuperIODevice *sio, uint8_t index) | |
28 | { | |
29 | return index ? 3 : 4; | |
30 | } | |
31 | ||
32 | /* Parallel port */ | |
33 | ||
34 | static bool is_parallel_enabled(ISASuperIODevice *sio, uint8_t index) | |
35 | { | |
36 | return index < 1; | |
37 | } | |
38 | ||
39 | static uint16_t get_parallel_iobase(ISASuperIODevice *sio, uint8_t index) | |
40 | { | |
75cacb12 | 41 | return 0x378; |
7bea0dd4 PMD |
42 | } |
43 | ||
44 | static unsigned int get_parallel_irq(ISASuperIODevice *sio, uint8_t index) | |
45 | { | |
46 | return 7; | |
47 | } | |
48 | ||
49 | static unsigned int get_parallel_dma(ISASuperIODevice *sio, uint8_t index) | |
50 | { | |
51 | return 3; | |
52 | } | |
53 | ||
54 | /* Diskette controller (Software compatible with the Intel PC8477) */ | |
55 | ||
56 | static bool is_fdc_enabled(ISASuperIODevice *sio, uint8_t index) | |
57 | { | |
58 | return index < 1; | |
59 | } | |
60 | ||
61 | static uint16_t get_fdc_iobase(ISASuperIODevice *sio, uint8_t index) | |
62 | { | |
63 | return 0x3f0; | |
64 | } | |
65 | ||
66 | static unsigned int get_fdc_irq(ISASuperIODevice *sio, uint8_t index) | |
67 | { | |
68 | return 6; | |
69 | } | |
70 | ||
71 | static unsigned int get_fdc_dma(ISASuperIODevice *sio, uint8_t index) | |
72 | { | |
73 | return 2; | |
74 | } | |
75 | ||
76 | static void smc37c669_class_init(ObjectClass *klass, void *data) | |
77 | { | |
78 | ISASuperIOClass *sc = ISA_SUPERIO_CLASS(klass); | |
79 | ||
80 | sc->parallel = (ISASuperIOFuncs){ | |
81 | .count = 1, | |
82 | .is_enabled = is_parallel_enabled, | |
83 | .get_iobase = get_parallel_iobase, | |
84 | .get_irq = get_parallel_irq, | |
85 | .get_dma = get_parallel_dma, | |
86 | }; | |
87 | sc->serial = (ISASuperIOFuncs){ | |
88 | .count = 2, | |
89 | .is_enabled = is_serial_enabled, | |
90 | .get_iobase = get_serial_iobase, | |
91 | .get_irq = get_serial_irq, | |
92 | }; | |
93 | sc->floppy = (ISASuperIOFuncs){ | |
94 | .count = 1, | |
95 | .is_enabled = is_fdc_enabled, | |
96 | .get_iobase = get_fdc_iobase, | |
97 | .get_irq = get_fdc_irq, | |
98 | .get_dma = get_fdc_dma, | |
99 | }; | |
100 | sc->ide.count = 0; | |
101 | } | |
102 | ||
103 | static const TypeInfo smc37c669_type_info = { | |
104 | .name = TYPE_SMC37C669_SUPERIO, | |
105 | .parent = TYPE_ISA_SUPERIO, | |
106 | .instance_size = sizeof(ISASuperIODevice), | |
107 | .class_size = sizeof(ISASuperIOClass), | |
108 | .class_init = smc37c669_class_init, | |
109 | }; | |
110 | ||
111 | static void smc37c669_register_types(void) | |
112 | { | |
113 | type_register_static(&smc37c669_type_info); | |
114 | } | |
115 | ||
116 | type_init(smc37c669_register_types) |