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

#ifndef ZEPHYR_INCLUDE_AIO_COMPARATOR_H_
#define ZEPHYR_INCLUDE_AIO_COMPARATOR_H_

#ifdef __cplusplus
extern "C" {
#endif

enum aio_cmp_ref {
	AIO_CMP_REF_A,		/**< Use reference A. */
	AIO_CMP_REF_B,		/**< Use reference B. */
};

enum aio_cmp_polarity {
	AIO_CMP_POL_RISE,	/**< Match on rising edge. */
	AIO_CMP_POL_FALL,	/**< Match on falling edge. */
};

typedef void (*aio_cmp_cb)(void *);

typedef int (*aio_cmp_api_disable)(struct device *dev, u8_t index);

typedef int (*aio_cmp_api_configure)(struct device *dev, u8_t index,
    enum aio_cmp_polarity polarity, enum aio_cmp_ref refsel,
    aio_cmp_cb cb, void *param);
typedef u32_t (*aio_cmp_api_get_pending_int)(struct device *dev);

struct aio_cmp_driver_api {
	aio_cmp_api_disable disable;
	aio_cmp_api_configure configure;
	aio_cmp_api_get_pending_int get_pending_int;
};

/**
 * @brief Disable a particular comparator.
 *
 * This disables a comparator so that it no longer triggers interrupts.
 *
 * @param dev Device struct
 * @param index The index of the comparator to disable
 *
 * @return 0 if successful, otherwise failed.
 */
__syscall int aio_cmp_disable(struct device *dev, u8_t index);

static inline int z_impl_aio_cmp_disable(struct device *dev, u8_t index)
{
	const struct aio_cmp_driver_api *api = dev->driver_api;

	return api->disable(dev, index);
}

/**
 * @brief Configure and enable a particular comparator.
 *
 * This performs configuration and enable a comparator, so that it will
 * generate interrupts when conditions are met.
 *
 * @param dev Device struct
 * @param index The index of the comparator to disable
 * @param polarity Match polarity (e.g. rising or falling)
 * @param refsel Reference for trigger
 * @param cb Function callback (aio_cmp_cb)
 * @param param Parameters to be passed to callback
 *
 * @return 0 if successful, otherwise failed.
 */
static inline int aio_cmp_configure(struct device *dev, u8_t index,
				    enum aio_cmp_polarity polarity,
				    enum aio_cmp_ref refsel,
				    aio_cmp_cb cb, void *param)
{
	const struct aio_cmp_driver_api *api = dev->driver_api;

	return api->configure(dev, index, polarity, refsel, cb, param);
}

/**
 * @brief Function to get pending interrupts
 *
 * The purpose of this function is to return the interrupt
 * status register for the device.
 * This is especially useful when waking up from
 * low power states to check the wake up source.
 *
 * @param dev Pointer to the device structure for the driver instance.
 *
 * @retval status != 0 if at least one aio_cmp interrupt is pending.
 * @retval 0 if no aio_cmp interrupt is pending.
 */
__syscall int aio_cmp_get_pending_int(struct device *dev);

static inline int z_impl_aio_cmp_get_pending_int(struct device *dev)
{
	struct aio_cmp_driver_api *api;

	api = (struct aio_cmp_driver_api *)dev->driver_api;
	return api->get_pending_int(dev);
}

#ifdef __cplusplus
}
#endif

#include <syscalls/aio_comparator.h>

#endif /* ZEPHYR_INCLUDE_AIO_COMPARATOR_H_ */
