/*
 * Copyright (c) 2017 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <uart.h>
#include <syscall_handler.h>

#define UART_SIMPLE(op_) \
	Z_SYSCALL_HANDLER(uart_ ## op_, dev) { \
		Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, op_)); \
		return z_impl_uart_ ## op_((struct device *)dev); \
	}

#define UART_SIMPLE_VOID(op_) \
	Z_SYSCALL_HANDLER(uart_ ## op_, dev) { \
		Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, op_)); \
		z_impl_uart_ ## op_((struct device *)dev); \
		return 0; \
	}

UART_SIMPLE(err_check)

Z_SYSCALL_HANDLER(uart_poll_in, dev, p_char)
{
	Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, poll_in));
	Z_OOPS(Z_SYSCALL_MEMORY_WRITE(p_char, sizeof(unsigned char)));
	return z_impl_uart_poll_in((struct device *)dev,
				  (unsigned char *)p_char);
}

Z_SYSCALL_HANDLER(uart_poll_out, dev, out_char)
{
	Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, poll_out));
	z_impl_uart_poll_out((struct device *)dev, out_char);

	return 0;
}

#ifdef CONFIG_UART_ASYNC_API
/* callback_set() excluded as we don't allow ISR callback installation from
 * user mode
 *
 * rx_buf_rsp() excluded as it's designed to be called from ISR callbacks
 */
Z_SYSCALL_HANDLER(uart_tx, dev, buf, len, timeout)
{
	Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, tx));
	Z_OOPS(Z_SYSCALL_MEMORY_READ(buf, len));
	return z_impl_uart_tx((struct device *)dev, (u8_t *)buf, len, timeout);
}

UART_SIMPLE(tx_abort);

Z_SYSCALL_HANDLER(uart_rx_enable, dev, buf, len, timeout)
{
	Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, rx_enable));
	Z_OOPS(Z_SYSCALL_MEMORY_WRITE(buf, len));
	return z_impl_uart_rx_enable((struct device *)dev, (u8_t *)buf, len,
				     timeout);
}

UART_SIMPLE(rx_disable);
#endif /* CONFIG_UART_ASYNC_API */

#ifdef CONFIG_UART_INTERRUPT_DRIVEN
UART_SIMPLE_VOID(irq_tx_enable)
UART_SIMPLE_VOID(irq_tx_disable)
UART_SIMPLE_VOID(irq_rx_enable)
UART_SIMPLE_VOID(irq_rx_disable)
UART_SIMPLE_VOID(irq_err_enable)
UART_SIMPLE_VOID(irq_err_disable)
UART_SIMPLE(irq_is_pending)
UART_SIMPLE(irq_update)
#endif /* CONFIG_UART_INTERRUPT_DRIVEN */

#ifdef CONFIG_UART_LINE_CTRL
Z_SYSCALL_HANDLER(uart_line_ctrl_set, dev, ctrl, val)
{
	Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, line_ctrl_set));
	return z_impl_uart_line_ctrl_set((struct device *)dev, ctrl, val);
}

Z_SYSCALL_HANDLER(uart_line_ctrl_get, dev, ctrl, val)
{
	Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, line_ctrl_get));
	Z_OOPS(Z_SYSCALL_MEMORY_WRITE(val, sizeof(u32_t)));
	return z_impl_uart_line_ctrl_get((struct device *)dev, ctrl,
					(u32_t *)val);
}
#endif /* CONFIG_UART_LINE_CTRL */

#ifdef CONFIG_UART_DRV_CMD
Z_SYSCALL_HANDLER(uart_drv_cmd, dev, cmd, p)
{
	Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, drv_cmd));
	return z_impl_uart_drv_cmd((struct device *)dev, cmd, p);
}
#endif /* CONFIG_UART_DRV_CMD */
