/*
 * Copyright 2018, Data61, CSIRO (ABN 41 687 119 230)
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */
#include <stdio.h>
#include <stdint.h>

#include <camkes.h>
#include <camkes/io.h>
#include <sel4/sel4.h>
#include <utils/attribute.h>
#include <utils/ansi.h>

#include "plat.h"

struct ps_chardevice serial_device;
struct ps_chardevice *serial = NULL;

ssize_t plat_serial_write(void *buf, size_t buf_size, chardev_callback_t cb, void *token)
{
    ssize_t res = ps_cdev_write(serial, buf, buf_size, cb, token);
    return res;
}

ssize_t plat_serial_read(void *buf, size_t buf_size, chardev_callback_t cb, void *token)
{
    ssize_t res = ps_cdev_read(serial, buf, buf_size, cb, token);
    return res;
}

void plat_serial_interrupt(handle_char_fn handle_char)
{
    if (serial) {
        int data = 0;
        ps_cdev_handle_irq(serial, 0);
        while (data !=  EOF) {
            data = ps_cdev_getchar(serial);
            if (data != EOF) {
                handle_char((uint8_t)data);
            }
        }
    }
}

void plat_serial_putchar(int c)
{
    if (serial) {
        ps_cdev_putchar(serial, c);
    }
}

void plat_pre_init(ps_io_ops_t *io_ops)
{
    ZF_LOGF_IF(io_ops == NULL, "Was passed an empty IO ops struct");

#ifdef CONFIG_PLAT_EXYNOS5
    io_ops->clock_sys.priv = NULL;
    io_ops->mux_sys.priv = NULL;
#endif

    serial = ps_cdev_init(PS_SERIAL_DEFAULT, io_ops, &serial_device);
    if (serial == NULL) {
        ZF_LOGE("Failed to initialise character device");
    }
}
