/**
 * \addtogroup BSP
 * \{
 * \addtogroup DEVICES
 * \{
 * \addtogroup Timer0
 * \{
 */

/**
 ****************************************************************************************
 *
 * @file hw_timer0.c
 *
 * @brief Implementation of the Timer0 Low Level Driver.
 *
 * Copyright (c) 2016, Dialog Semiconductor
 * 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.
 *
 *
 ****************************************************************************************
 */

#if dg_configUSE_HW_TIMER0


#include <stdio.h>
#include <sdk_defs.h>
#include <hw_timer0.h>

#if (dg_configSYSTEMVIEW)
#  include "SEGGER_SYSVIEW_FreeRTOS.h"
#else
#  define SEGGER_SYSTEMVIEW_ISR_ENTER()
#  define SEGGER_SYSTEMVIEW_ISR_EXIT()
#endif

static hw_timer0_interrupt_cb intr_cb;

void hw_timer0_init(const timer0_config *cfg)
{
    /* Enable clock for peripheral */
    uint32_t clk_tmr_reg = CRG_TOP->CLK_TMR_REG;
    clk_tmr_reg &= ~CRG_TOP_CLK_TMR_REG_TMR0_DIV_Msk;
    clk_tmr_reg &= ~CRG_TOP_CLK_TMR_REG_TMR0_CLK_SEL_Msk;
    clk_tmr_reg |= CRG_TOP_CLK_TMR_REG_TMR0_ENABLE_Msk;
    CRG_TOP->CLK_TMR_REG = clk_tmr_reg ;

    /* Reset control register, i.e. disable timer */
    GP_TIMERS->TIMER0_CTRL_REG = 0x0;

    /* Disable NVIC interrupt */
    NVIC_DisableIRQ(SWTIM0_IRQn);

    intr_cb = NULL;

    hw_timer0_configure(cfg);
}

void hw_timer0_configure(const timer0_config *cfg)
{
    if (cfg)
    {
        hw_timer0_set_clock_source(cfg->clk_src);
        hw_timer0_set_fast_clock_div(cfg->fast_clk_div);
        hw_timer0_set_on_clock_div(cfg->on_clock_div);
        hw_timer0_set_on_reload(cfg->on_reload);
        hw_timer0_set_t0_reload(cfg->t0_reload_m, cfg->t0_reload_n);
    }
}

void hw_timer0_register_int(hw_timer0_interrupt_cb handler)
{
    intr_cb = handler;
    NVIC_EnableIRQ(SWTIM0_IRQn);
}

void hw_timer0_unregister_int(void)
{
    NVIC_DisableIRQ(SWTIM0_IRQn);
    intr_cb = NULL;
}

void SWTIM0_Handler(void)
{
    SEGGER_SYSTEMVIEW_ISR_ENTER();

    if (intr_cb)
    {
        intr_cb();
    }

    SEGGER_SYSTEMVIEW_ISR_EXIT();
}

#endif /* dg_configUSE_HW_TIMER0 */
/**
 * \}
 * \}
 * \}
 */
