/*
 * ARM CMSDK APB UART emulation
 *
 * Copyright (c) 2017 Linaro Limited
 * Written by Peter Maydell
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 or
 *  (at your option) any later version.
 */

#ifndef CMSDK_APB_UART_H
#define CMSDK_APB_UART_H

#include "hw/sysbus.h"
#include "chardev/char-fe.h"

#define TYPE_CMSDK_APB_UART "cmsdk-apb-uart"
#define CMSDK_APB_UART(obj) OBJECT_CHECK(CMSDKAPBUART, (obj), \
                                         TYPE_CMSDK_APB_UART)

typedef struct {
    /*< private >*/
    SysBusDevice parent_obj;

    /*< public >*/
    MemoryRegion iomem;
    CharBackend chr;
    qemu_irq txint;
    qemu_irq rxint;
    qemu_irq txovrint;
    qemu_irq rxovrint;
    qemu_irq uartint;
    guint watch_tag;
    uint32_t pclk_frq;

    uint32_t state;
    uint32_t ctrl;
    uint32_t intstatus;
    uint32_t bauddiv;
    /* This UART has no FIFO, only a 1-character buffer for each of Tx and Rx */
    uint8_t txbuf;
    uint8_t rxbuf;
} CMSDKAPBUART;

/**
 * cmsdk_apb_uart_create - convenience function to create TYPE_CMSDK_APB_UART
 * @addr: location in system memory to map registers
 * @chr: Chardev backend to connect UART to, or NULL if no backend
 * @pclk_frq: frequency in Hz of the PCLK clock (used for calculating baud rate)
 */
static inline DeviceState *cmsdk_apb_uart_create(hwaddr addr,
                                                 qemu_irq txint,
                                                 qemu_irq rxint,
                                                 qemu_irq txovrint,
                                                 qemu_irq rxovrint,
                                                 qemu_irq uartint,
                                                 Chardev *chr,
                                                 uint32_t pclk_frq)
{
    DeviceState *dev;
    SysBusDevice *s;

    dev = qdev_create(NULL, TYPE_CMSDK_APB_UART);
    s = SYS_BUS_DEVICE(dev);
    qdev_prop_set_chr(dev, "chardev", chr);
    qdev_prop_set_uint32(dev, "pclk-frq", pclk_frq);
    qdev_init_nofail(dev);
    sysbus_mmio_map(s, 0, addr);
    sysbus_connect_irq(s, 0, txint);
    sysbus_connect_irq(s, 1, rxint);
    sysbus_connect_irq(s, 2, txovrint);
    sysbus_connect_irq(s, 3, rxovrint);
    sysbus_connect_irq(s, 4, uartint);
    return dev;
}

#endif
