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

#include <ztest.h>
#include <gpio.h>
#include <pinmux.h>
#include <aio_comparator.h>

#define AIO_CMP_DEV_NAME	CONFIG_AIO_COMPARATOR_0_NAME
#define PINMUX_NAME		CONFIG_PINMUX_NAME

#ifdef CONFIG_ARC
#define GPIO_DEV_NAME		CONFIG_GPIO_QMSI_SS_0_NAME
#else
#define GPIO_DEV_NAME		CONFIG_GPIO_QMSI_0_NAME
#endif

#if defined(CONFIG_BOARD_QUARK_SE_C1000_DEVBOARD)
#define PIN_OUT 15	/* GPIO15 */
#define PIN_IN 10	/* GPIO_SS_AIN_10 */
#elif defined(CONFIG_BOARD_QUARK_SE_C1000_DEVBOARD_SS)
#define PIN_OUT 3	/* GPIO_SS_3 */
#define PIN_IN 10	/* GPIO_SS_AIN_10 */
#elif defined(CONFIG_BOARD_QUARK_D2000_CRB)
#define PIN_OUT 8	/* GPIO_8 */
#define PIN_IN 10	/* AIN_10 */
#elif defined(CONFIG_BOARD_ARDUINO_101)
#define PIN_OUT 16	/* GPIO_16 */
#define PIN_IN 10	/* AIN_10 */
#elif defined(CONFIG_BOARD_ARDUINO_101_SSS)
#define PIN_OUT 3	/* GPIO_SS_3 */
#define PIN_IN 10	/* AIN_10 */
#endif

volatile int cb_cnt;
static struct device *aio_dev;
static struct device *gpio_dev;

static void callback(void *param)
{
	int polarity = *(int *)param;

	cb_cnt++;
	TC_PRINT("*** callback triggered %s\n",
		(polarity == AIO_CMP_POL_RISE) ? "rising" : "falling"
	);

	if (polarity == AIO_CMP_POL_FALL) {
		gpio_pin_write(gpio_dev, PIN_OUT, 1);
	} else {
		gpio_pin_write(gpio_dev, PIN_OUT, 0);
	}

	if (aio_cmp_get_pending_int(aio_dev)) {
		TC_PRINT("Catch aio_cmp pending interrupt\n");
	} else {
		TC_PRINT("Fail to catch aio_cmp pending interrupt\n");
	}

	aio_cmp_disable(aio_dev, PIN_IN);
}

static int set_aio_callback(int polarity, int disable)
{
	struct device *pinmux = device_get_binding(PINMUX_NAME);

	if (!pinmux) {
		TC_PRINT("Cannot get PINMUX\n");
		return TC_FAIL;
	}

	aio_dev = device_get_binding(AIO_CMP_DEV_NAME);
	if (!aio_dev) {
		TC_PRINT("AIO Device binding failed\n");
		return TC_FAIL;
	}

	gpio_dev = device_get_binding(GPIO_DEV_NAME);
	if (!gpio_dev) {
		TC_PRINT("GPIO Device binding failed\n");
		return TC_FAIL;
	}

	if (gpio_pin_configure(gpio_dev, PIN_OUT, GPIO_DIR_OUT)) {
		TC_PRINT("Fail to configure GPIO Pin %d\n", PIN_OUT);
		return TC_FAIL;
	}

	if (pinmux_pin_set(pinmux, PIN_IN, PINMUX_FUNC_B)) {
		TC_PRINT("Fail to set pin func, %u\n", PIN_IN);
		return TC_FAIL;
	}

	gpio_pin_write(gpio_dev, PIN_OUT,
			(polarity == AIO_CMP_POL_RISE) ? 0 : 1);

	/* config AIN callback */
	zassert_true(aio_cmp_configure(aio_dev, PIN_IN,
				      polarity, AIO_CMP_REF_B,
				      callback, (void *)aio_dev) == 0,
		    "ERROR registering callback");
	if (disable == 1) {
		if (aio_cmp_disable(aio_dev, PIN_IN)) {
			TC_PRINT("Fail to disable callback\n");
			return TC_FAIL;
		}
	}

	k_sleep(100);
	cb_cnt = 0;
	k_sleep(100);

	gpio_pin_write(gpio_dev, PIN_OUT,
		(polarity == AIO_CMP_POL_RISE) ? 1 : 0);

	k_sleep(1000);
	TC_PRINT("... cb_cnt = %d\n", cb_cnt);

	return TC_PASS;
}

void test_aio_callback_rise(void)
{
	set_aio_callback(AIO_CMP_POL_RISE, 0);
	zassert_true(cb_cnt == 1, "callback is not invoked correctly");
}

void test_aio_callback_fall(void)
{
	set_aio_callback(AIO_CMP_POL_FALL, 0);
	zassert_true(cb_cnt == 1, "callback is not invoked correctly");
}

void test_aio_callback_rise_disable(void)
{
	set_aio_callback(AIO_CMP_POL_RISE, 1);
	zassert_true(cb_cnt == 0, "callback is not invoked correctly");
}
