| /* | 
 |  * SMC FDC37C669 Super I/O controller | 
 |  * | 
 |  * Copyright (c) 2018 Philippe Mathieu-Daudé | 
 |  * | 
 |  * This work is licensed under the terms of the GNU GPL, version 2 or later. | 
 |  * See the COPYING file in the top-level directory. | 
 |  * SPDX-License-Identifier: GPL-2.0-or-later | 
 |  */ | 
 |  | 
 | #include "qemu/osdep.h" | 
 | #include "hw/isa/superio.h" | 
 | #include "qemu/module.h" | 
 |  | 
 | /* UARTs (compatible with NS16450 or PC16550) */ | 
 |  | 
 | static bool is_serial_enabled(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return index < 2; | 
 | } | 
 |  | 
 | static uint16_t get_serial_iobase(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return index ? 0x2f8 : 0x3f8; | 
 | } | 
 |  | 
 | static unsigned int get_serial_irq(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return index ? 3 : 4; | 
 | } | 
 |  | 
 | /* Parallel port */ | 
 |  | 
 | static bool is_parallel_enabled(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return index < 1; | 
 | } | 
 |  | 
 | static uint16_t get_parallel_iobase(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return 0x378; | 
 | } | 
 |  | 
 | static unsigned int get_parallel_irq(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return 7; | 
 | } | 
 |  | 
 | static unsigned int get_parallel_dma(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return 3; | 
 | } | 
 |  | 
 | /* Diskette controller (Software compatible with the Intel PC8477) */ | 
 |  | 
 | static bool is_fdc_enabled(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return index < 1; | 
 | } | 
 |  | 
 | static uint16_t get_fdc_iobase(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return 0x3f0; | 
 | } | 
 |  | 
 | static unsigned int get_fdc_irq(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return 6; | 
 | } | 
 |  | 
 | static unsigned int get_fdc_dma(ISASuperIODevice *sio, uint8_t index) | 
 | { | 
 |     return 2; | 
 | } | 
 |  | 
 | static void smc37c669_class_init(ObjectClass *klass, void *data) | 
 | { | 
 |     ISASuperIOClass *sc = ISA_SUPERIO_CLASS(klass); | 
 |  | 
 |     sc->parallel = (ISASuperIOFuncs){ | 
 |         .count = 1, | 
 |         .is_enabled = is_parallel_enabled, | 
 |         .get_iobase = get_parallel_iobase, | 
 |         .get_irq    = get_parallel_irq, | 
 |         .get_dma    = get_parallel_dma, | 
 |     }; | 
 |     sc->serial = (ISASuperIOFuncs){ | 
 |         .count = 2, | 
 |         .is_enabled = is_serial_enabled, | 
 |         .get_iobase = get_serial_iobase, | 
 |         .get_irq    = get_serial_irq, | 
 |     }; | 
 |     sc->floppy = (ISASuperIOFuncs){ | 
 |         .count = 1, | 
 |         .is_enabled = is_fdc_enabled, | 
 |         .get_iobase = get_fdc_iobase, | 
 |         .get_irq    = get_fdc_irq, | 
 |         .get_dma    = get_fdc_dma, | 
 |     }; | 
 |     sc->ide.count = 0; | 
 | } | 
 |  | 
 | static const TypeInfo smc37c669_type_info = { | 
 |     .name          = TYPE_SMC37C669_SUPERIO, | 
 |     .parent        = TYPE_ISA_SUPERIO, | 
 |     .instance_size = sizeof(ISASuperIODevice), | 
 |     .class_size    = sizeof(ISASuperIOClass), | 
 |     .class_init    = smc37c669_class_init, | 
 | }; | 
 |  | 
 | static void smc37c669_register_types(void) | 
 | { | 
 |     type_register_static(&smc37c669_type_info); | 
 | } | 
 |  | 
 | type_init(smc37c669_register_types) |