Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> --- include/hw/isa/superio.h | 17 +++++++++++++++++ hw/isa/isa-superio.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ MAINTAINERS | 2 ++ hw/isa/Makefile.objs | 1 + 4 files changed, 65 insertions(+) create mode 100644 include/hw/isa/superio.h create mode 100644 hw/isa/isa-superio.c
diff --git a/include/hw/isa/superio.h b/include/hw/isa/superio.h new file mode 100644 index 0000000000..e685b96653 --- /dev/null +++ b/include/hw/isa/superio.h @@ -0,0 +1,17 @@ +/* + * Generic ISA Super I/O + * + * 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. + */ +#ifndef HW_ISA_SUPERIO_H +#define HW_ISA_SUPERIO_H + +#include "hw/isa/isa.h" + +ISADevice *isa_superio_init(ISABus *isa_bus, int serial_count, + int parallel_count, int drive_count); + +#endif diff --git a/hw/isa/isa-superio.c b/hw/isa/isa-superio.c new file mode 100644 index 0000000000..93d8457c6b --- /dev/null +++ b/hw/isa/isa-superio.c @@ -0,0 +1,45 @@ +/* + * Generic ISA Super I/O + * + * 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. + */ +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "sysemu/blockdev.h" +#include "hw/isa/superio.h" +#include "hw/char/serial.h" +#include "hw/char/parallel.h" +#include "hw/block/fdc.h" +#include "hw/input/i8042.h" + +ISADevice *isa_superio_init(ISABus *isa_bus, int serial_count, + int parallel_count, int drive_count) +{ + serial_hds_isa_init(isa_bus, 0, serial_count); + + parallel_hds_isa_init(isa_bus, parallel_count); + + if (drive_count) { + DriveInfo **fd; + int i; + + if (drive_count > MAX_FD) { + warn_report("superio: ignoring %d floppy controllers", + drive_count - MAX_FD); + drive_count = MAX_FD; + } + fd = g_new(DriveInfo *, drive_count); + + for (i = 0; i < drive_count; i++) { + fd[i] = drive_get(IF_FLOPPY, 0, i); + } + fdctrl_init_isa(isa_bus, fd); + + g_free(fd); /* FIXME */ + } + + return isa_create_simple(isa_bus, TYPE_I8042); +} diff --git a/MAINTAINERS b/MAINTAINERS index 7f9e98a046..6f867da743 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -875,6 +875,7 @@ F: hw/input/pckbd.c F: hw/intc/apic* F: hw/intc/ioapic* F: hw/intc/i8259* +F: hw/isa/isa-superio.c F: hw/misc/debugexit.c F: hw/misc/pc-testdev.c F: hw/timer/hpet* @@ -885,6 +886,7 @@ F: include/hw/display/vga.h F: include/hw/char/parallel.h F: include/hw/dma/i8257.h F: include/hw/i2c/pm_smbus.h +F: include/hw/isa/superio.h F: include/hw/input/i8042.h F: include/hw/timer/hpet.h F: include/hw/timer/i8254* diff --git a/hw/isa/Makefile.objs b/hw/isa/Makefile.objs index fb37c55cf2..cac655ba58 100644 --- a/hw/isa/Makefile.objs +++ b/hw/isa/Makefile.objs @@ -1,4 +1,5 @@ common-obj-$(CONFIG_ISA_BUS) += isa-bus.o +common-obj-$(CONFIG_ISA_BUS) += isa-superio.o common-obj-$(CONFIG_APM) += apm.o common-obj-$(CONFIG_I82378) += i82378.o common-obj-$(CONFIG_PC87312) += pc87312.o -- 2.15.1