| /* |
| * 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) |