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