2 * SMC FDC37C669 Super I/O controller
4 * Copyright (c) 2018 Philippe Mathieu-Daudé
6 * This code is licensed under the GNU GPLv2 and later.
7 * See the COPYING file in the top-level directory.
8 * SPDX-License-Identifier: GPL-2.0-or-later
11 #include "qemu/osdep.h"
12 #include "hw/isa/superio.h"
13 #include "qemu/module.h"
15 /* UARTs (compatible with NS16450 or PC16550) */
17 static bool is_serial_enabled(ISASuperIODevice
*sio
, uint8_t index
)
22 static uint16_t get_serial_iobase(ISASuperIODevice
*sio
, uint8_t index
)
24 return index
? 0x2f8 : 0x3f8;
27 static unsigned int get_serial_irq(ISASuperIODevice
*sio
, uint8_t index
)
34 static bool is_parallel_enabled(ISASuperIODevice
*sio
, uint8_t index
)
39 static uint16_t get_parallel_iobase(ISASuperIODevice
*sio
, uint8_t index
)
44 static unsigned int get_parallel_irq(ISASuperIODevice
*sio
, uint8_t index
)
49 static unsigned int get_parallel_dma(ISASuperIODevice
*sio
, uint8_t index
)
54 /* Diskette controller (Software compatible with the Intel PC8477) */
56 static bool is_fdc_enabled(ISASuperIODevice
*sio
, uint8_t index
)
61 static uint16_t get_fdc_iobase(ISASuperIODevice
*sio
, uint8_t index
)
66 static unsigned int get_fdc_irq(ISASuperIODevice
*sio
, uint8_t index
)
71 static unsigned int get_fdc_dma(ISASuperIODevice
*sio
, uint8_t index
)
76 static void smc37c669_class_init(ObjectClass
*klass
, void *data
)
78 ISASuperIOClass
*sc
= ISA_SUPERIO_CLASS(klass
);
80 sc
->parallel
= (ISASuperIOFuncs
){
82 .is_enabled
= is_parallel_enabled
,
83 .get_iobase
= get_parallel_iobase
,
84 .get_irq
= get_parallel_irq
,
85 .get_dma
= get_parallel_dma
,
87 sc
->serial
= (ISASuperIOFuncs
){
89 .is_enabled
= is_serial_enabled
,
90 .get_iobase
= get_serial_iobase
,
91 .get_irq
= get_serial_irq
,
93 sc
->floppy
= (ISASuperIOFuncs
){
95 .is_enabled
= is_fdc_enabled
,
96 .get_iobase
= get_fdc_iobase
,
97 .get_irq
= get_fdc_irq
,
98 .get_dma
= get_fdc_dma
,
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
,
111 static void smc37c669_register_types(void)
113 type_register_static(&smc37c669_type_info
);
116 type_init(smc37c669_register_types
)