/*
 * Copyright (c) 2020 Vestas Wind Systems A/S
 * Copyright 2022 NXP
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Extended public API for the NXP MCUX Analog Comparator (ACMP)
 */

#ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_MCUX_ACMP_H_
#define ZEPHYR_INCLUDE_DRIVERS_SENSOR_MCUX_ACMP_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <zephyr/drivers/sensor.h>

#if defined(FSL_FEATURE_ACMP_HAS_C1_INPSEL_BIT) && (FSL_FEATURE_ACMP_HAS_C1_INPSEL_BIT == 1U)
#define MCUX_ACMP_HAS_INPSEL 1
#else
#define MCUX_ACMP_HAS_INPSEL 0
#endif

#if defined(FSL_FEATURE_ACMP_HAS_C1_INNSEL_BIT) && (FSL_FEATURE_ACMP_HAS_C1_INNSEL_BIT == 1U)
#define MCUX_ACMP_HAS_INNSEL 1
#else
#define MCUX_ACMP_HAS_INNSEL 0
#endif

#if defined(FSL_FEATURE_ACMP_HAS_C0_OFFSET_BIT) && (FSL_FEATURE_ACMP_HAS_C0_OFFSET_BIT == 1U)
#define MCUX_ACMP_HAS_OFFSET 1
#else
#define MCUX_ACMP_HAS_OFFSET 0
#endif

#if defined(FSL_FEATURE_ACMP_HAS_C3_REG) && (FSL_FEATURE_ACMP_HAS_C3_REG != 0U)
#define MCUX_ACMP_HAS_DISCRETE_MODE 1
#else
#define MCUX_ACMP_HAS_DISCRETE_MODE 0
#endif

enum sensor_channel_mcux_acmp {
	/** Analog Comparator Output. */
	SENSOR_CHAN_MCUX_ACMP_OUTPUT = SENSOR_CHAN_PRIV_START,
};

enum sensor_trigger_type_mcux_acmp {
	/** Analog Comparator Output rising event trigger. */
	SENSOR_TRIG_MCUX_ACMP_OUTPUT_RISING = SENSOR_TRIG_PRIV_START,
	/** Analog Comparator Output falling event trigger. */
	SENSOR_TRIG_MCUX_ACMP_OUTPUT_FALLING,
};

enum sensor_attribute_mcux_acmp {
	/** Analog Comparator hard block offset. */
	SENSOR_ATTR_MCUX_ACMP_OFFSET_LEVEL = SENSOR_ATTR_COMMON_COUNT,
	/** Analog Comparator hysteresis level. */
	SENSOR_ATTR_MCUX_ACMP_HYSTERESIS_LEVEL,
	/**
	 * Analog Comparator Digital-to-Analog Converter voltage
	 * reference source.
	 */
	SENSOR_ATTR_MCUX_ACMP_DAC_VOLTAGE_REFERENCE,
	/** Analog Comparator Digital-to-Analog Converter value. */
	SENSOR_ATTR_MCUX_ACMP_DAC_VALUE,
	/** Analog Comparator positive port input. */
	SENSOR_ATTR_MCUX_ACMP_POSITIVE_PORT_INPUT,
	/** Analog Comparator positive mux input. */
	SENSOR_ATTR_MCUX_ACMP_POSITIVE_MUX_INPUT,
	/** Analog Comparator negative port input. */
	SENSOR_ATTR_MCUX_ACMP_NEGATIVE_PORT_INPUT,
	/** Analog Comparator negative mux input. */
	SENSOR_ATTR_MCUX_ACMP_NEGATIVE_MUX_INPUT,
#if MCUX_ACMP_HAS_DISCRETE_MODE
	/** Analog Comparator Positive Channel Discrete Mode Enable. */
	SENSOR_ATTR_MCUX_ACMP_POSITIVE_DISCRETE_MODE,
	/** Analog Comparator Negative Channel Discrete Mode Enable. */
	SENSOR_ATTR_MCUX_ACMP_NEGATIVE_DISCRETE_MODE,
	/** Analog Comparator discrete mode clock selection. */
	SENSOR_ATTR_MCUX_ACMP_DISCRETE_CLOCK,
	/** Analog Comparator resistor divider enable. */
	SENSOR_ATTR_MCUX_ACMP_DISCRETE_ENABLE_RESISTOR_DIVIDER,
	/** Analog Comparator discrete sample selection. */
	SENSOR_ATTR_MCUX_ACMP_DISCRETE_SAMPLE_TIME,
	/** Analog Comparator discrete phase1 sampling time selection. */
	SENSOR_ATTR_MCUX_ACMP_DISCRETE_PHASE1_TIME,
	/** Analog Comparator discrete phase2 sampling time selection. */
	SENSOR_ATTR_MCUX_ACMP_DISCRETE_PHASE2_TIME,
#endif
};

#ifdef __cplusplus
}
#endif

#endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_MCUX_ACMP_H_ */
