/*
 * Copyright (c) 2017 - 2019, Nordic Semiconductor ASA
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef NRFX_POWER_H__
#define NRFX_POWER_H__

#include <nrfx.h>
#include <hal/nrf_power.h>
#include <nrfx_power_clock.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup nrfx_power POWER driver
 * @{
 * @ingroup nrf_power
 * @brief   POWER peripheral driver.
 */

/**
 * @brief Power mode possible configurations
 */
typedef enum
{
    NRFX_POWER_MODE_CONSTLAT, /**< Constant latency mode */
    NRFX_POWER_MODE_LOWPWR    /**< Low power mode        */
}nrfx_power_mode_t;

#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__)
/**
 * @brief Events from power system
 */
typedef enum
{
    NRFX_POWER_SLEEP_EVT_ENTER, /**< CPU entered WFI/WFE sleep
                                 *
                                 * Keep in mind that if this interrupt is enabled,
                                 * it means that CPU was waken up just after WFI by this interrupt.
                                 */
    NRFX_POWER_SLEEP_EVT_EXIT   /**< CPU exited WFI/WFE sleep */
}nrfx_power_sleep_evt_t;
#endif /* NRF_POWER_HAS_SLEEPEVT */

#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__)
/**
 * @brief Events from USB power system
 */
typedef enum
{
    NRFX_POWER_USB_EVT_DETECTED, /**< USB power detected on the connector (plugged in). */
    NRFX_POWER_USB_EVT_REMOVED,  /**< USB power removed from the connector. */
    NRFX_POWER_USB_EVT_READY     /**< USB power regulator ready. */
}nrfx_power_usb_evt_t;

/**
 * @brief USB power state
 *
 * The single enumerator that holds all data about current state of USB
 * related POWER.
 *
 * Organized this way that higher power state has higher numeric value
 */
typedef enum
{
    NRFX_POWER_USB_STATE_DISCONNECTED, /**< No power on USB lines detected */
    NRFX_POWER_USB_STATE_CONNECTED,    /**< The USB power is detected, but USB power regulator is not ready */
    NRFX_POWER_USB_STATE_READY         /**< From the power point of view USB is ready for working */
}nrfx_power_usb_state_t;
#endif /* NRF_POWER_HAS_USBREG */

/**
 * @name Callback types
 *
 * Defined types of callback functions
 * @{
 */
/**
 * @brief Event handler for power failure warning
 */
typedef void (*nrfx_power_pofwarn_event_handler_t)(void);

#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__)
/**
 * @brief Event handler for entering/exiting sleep
 *
 * @param event Event type
 */
typedef void (*nrfx_power_sleep_event_handler_t)(nrfx_power_sleep_evt_t event);
#endif

#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__)
/**
 * @brief Event handler for USB related power events
 *
 * @param event Event type
 */
typedef void (*nrfx_power_usb_event_handler_t)(nrfx_power_usb_evt_t event);
#endif
/** @} */

/**
 * @brief General power configuration
 *
 * Parameters required to initialize power driver.
 */
typedef struct
{
    /**
     * @brief Enable main DCDC regulator
     *
     * This bit only informs the driver that elements for DCDC regulator
     * are installed and regulator can be used.
     * The regulator would be enabled or disabled automatically
     * by the hardware, basing on current power requirement.
     */
    bool dcdcen:1;

#if NRF_POWER_HAS_VDDH || defined(__NRFX_DOXYGEN__)
    /**
     * @brief Enable HV DCDC regulator
     *
     * This bit only informs the driver that elements for DCDC regulator
     * are installed and regulator can be used.
     * The regulator would be enabled or disabled automatically
     * by the hardware, basing on current power requirement.
     */
    bool dcdcenhv: 1;
#endif
}nrfx_power_config_t;

/**
 * @brief The configuration for power failure comparator
 *
 * Configuration used to enable and configure power failure comparator
 */
typedef struct
{
    nrfx_power_pofwarn_event_handler_t handler; //!< Event handler
#if NRF_POWER_HAS_POFCON || defined(__NRFX_DOXYGEN__)
    nrf_power_pof_thr_t                thr;     //!< Threshold for power failure detection
#endif
#if NRF_POWER_HAS_VDDH || defined(__NRFX_DOXYGEN__)
    nrf_power_pof_thrvddh_t            thrvddh; //!< Threshold for power failure detection on VDDH pin
#endif
}nrfx_power_pofwarn_config_t;

#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__)
/**
 * @brief The configuration of sleep event processing
 *
 * Configuration used to enable and configure sleep event handling
 */
typedef struct
{
    nrfx_power_sleep_event_handler_t handler;    //!< Event handler
    bool                             en_enter:1; //!< Enable event on sleep entering
    bool                             en_exit :1; //!< Enable event on sleep exiting
}nrfx_power_sleepevt_config_t;
#endif

#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__)
/**
 * @brief The configuration of USB related power events
 *
 * Configuration used to enable and configure USB power event handling
 */
typedef struct
{
    nrfx_power_usb_event_handler_t handler; //!< Event processing
}nrfx_power_usbevt_config_t;
#endif /* NRF_POWER_HAS_USBREG */

/**
 * @brief Function for getting the handler of the power failure comparator.
 * @return Handler of the power failure comparator.
 */
nrfx_power_pofwarn_event_handler_t nrfx_power_pof_handler_get(void);

#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__)
/**
 * @brief Function for getting the handler of the USB power.
 * @return Handler of the USB power.
 */
nrfx_power_usb_event_handler_t nrfx_power_usb_handler_get(void);
#endif

/**
 * @brief Initialize power module driver
 *
 * Enabled power module driver would process all the interrupts from power system.
 *
 * @param[in] p_config Pointer to the structure with initial configuration.
 *
 * @retval NRFX_SUCCESS                   Successfully initialized.
 * @retval NRFX_ERROR_ALREADY_INITIALIZED Module was already initialized.
 */
nrfx_err_t nrfx_power_init(nrfx_power_config_t const * p_config);

/**
 * @brief Unintialize power module driver
 *
 * Disables all the interrupt handling in the module.
 *
 * @sa nrfx_power_init
 */
void nrfx_power_uninit(void);

#if NRF_POWER_HAS_POFCON || defined(__NRFX_DOXYGEN__)
/**
 * @brief Initialize power failure comparator
 *
 * Configures the power failure comparator. This function does not setup and enable it.
 * Those steps can be done with functions @ref nrfx_power_pof_enable and @ref nrfx_power_pof_disable
 * or with Softdevice API (when Softdevice is using).
 *
 * @param[in] p_config Configuration with values and event handler.
 *                     If event handler is set to NULL, interrupt would be disabled.
 */
void nrfx_power_pof_init(nrfx_power_pofwarn_config_t const * p_config);

/**
 * @brief Enable power failure comparator
 * Sets and enables interrupt of the power failure comparator. This functions cannot be using
 * when Softdevice is enabled. If event handler set in init function is set to NULL, interrupt
 * would be disabled.
 *
 * @param[in] p_config Configuration with values and event handler.
 */
void nrfx_power_pof_enable(nrfx_power_pofwarn_config_t const * p_config);

/**
 * @brief Disable the power failure comparator
 *
 * Disables the power failure comparator interrupt.
 */
void nrfx_power_pof_disable(void);

/**
 * @brief Clear the power failure comparator settings
 *
 * Clears the settings of the power failure comparator.
 */
void nrfx_power_pof_uninit(void);
#endif // NRF_POWER_HAS_POFCON || defined(__NRFX_DOXYGEN__)

#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__)
/**
 * @brief Initialize sleep entering and exiting events processing
 *
 * Configures and setups the sleep event processing.
 *
 * @param[in] p_config Configuration with values and event handler.
 *
 * @sa nrfx_power_sleepevt_uninit
 *
 */
void nrfx_power_sleepevt_init(nrfx_power_sleepevt_config_t const * p_config);

/**
 * @brief Enable sleep entering and exiting events processing
 *
 * @param[in] p_config Configuration with values and event handler.
 */
void nrfx_power_sleepevt_enable(nrfx_power_sleepevt_config_t const * p_config);

/**
 * @brief Disable sleep entering and exiting events processing
 */
void nrfx_power_sleepevt_disable(void);

/**
 * @brief Uninitialize sleep entering and exiting events processing
 *
 * @sa nrfx_power_sleepevt_init
 */
void nrfx_power_sleepevt_uninit(void);
#endif /* NRF_POWER_HAS_SLEEPEVT */

#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__)
/**
 * @brief Initialize USB power event processing
 *
 * Configures and setups the USB power event processing.
 *
 * @param[in] p_config Configuration with values and event handler.
 *
 * @sa nrfx_power_usbevt_uninit
 */
void nrfx_power_usbevt_init(nrfx_power_usbevt_config_t const * p_config);

/**
 * @brief Enable USB power event processing
 */
void nrfx_power_usbevt_enable(void);

/**
 * @brief Disable USB power event processing
 */
void nrfx_power_usbevt_disable(void);

/**
 * @brief Uninitalize USB power event processing
 *
 * @sa nrfx_power_usbevt_init
 */
void nrfx_power_usbevt_uninit(void);

/**
 *  @brief Get the status of USB power
 *
 *  @return Current USB power status
 */
__STATIC_INLINE nrfx_power_usb_state_t nrfx_power_usbstatus_get(void);

#endif /* NRF_POWER_HAS_USBREG */

#ifndef SUPPRESS_INLINE_IMPLEMENTATION

#if NRF_POWER_HAS_USBREG
__STATIC_INLINE nrfx_power_usb_state_t nrfx_power_usbstatus_get(void)
{
    uint32_t status = nrf_power_usbregstatus_get();
    if(0 == (status & NRF_POWER_USBREGSTATUS_VBUSDETECT_MASK))
    {
        return NRFX_POWER_USB_STATE_DISCONNECTED;
    }
    if(0 == (status & NRF_POWER_USBREGSTATUS_OUTPUTRDY_MASK))
    {
        return NRFX_POWER_USB_STATE_CONNECTED;
    }
    return NRFX_POWER_USB_STATE_READY;
}
#endif /* NRF_POWER_HAS_USBREG */

#endif /* SUPPRESS_INLINE_IMPLEMENTATION */


void nrfx_power_irq_handler(void);


/** @} */

#ifdef __cplusplus
}
#endif

#endif /* NRFX_POWER_H__ */
