/* ------------------------------------------
 * Copyright (c) 2016, Synopsys, Inc. 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 Synopsys, Inc., 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.
 *
 * \version 2016.05
 * \date 2014-07-31
 * \author Wayne Ren(Wei.Ren@synopsys.com)
--------------------------------------------- */
/**
 * \defgroup    BOARD_EMSK_COMMON_INIT  EMSK Common Init Module
 * \ingroup BOARD_EMSK_COMMON
 * \brief   EMSK Board Common Init Module
 * \details
 *      EMSK timer/gpio/interrupt init process. Device-driver installation is done while
 *  getting the device object for the first time.
 */

/**
 * \file
 * \ingroup BOARD_EMSK_COMMON_INIT
 * \brief   common emsk init module
 */

/**
 * \addtogroup  BOARD_EMSK_COMMON_INIT
 * @{
 */
#include "inc/arc/arc_builtin.h"
#include "inc/arc/arc.h"
#include "inc/arc/arc_timer.h"

#include "board/emsk/emsk.h"
#include "board/emsk/common/emsk_timer.h"
#include "board/emsk/common/mux.h"

#ifdef ARC_FEATURE_DMP_PERIPHERAL
#define PERIPHERAL_BASE     ARC_FEATURE_DMP_PERIPHERAL
#else
#define PERIPHERAL_BASE     _arc_aux_read(AUX_DMP_PERIPHERAL)
#endif

/**
 * \brief   emsk-related mux io init
 */
static void emsk_mux_init(void)
{
    MUX_REG *mux_regs;

    mux_regs = (MUX_REG *)(PERIPHERAL_BASE | REL_REGBASE_PINMUX);
    mux_init(mux_regs);

    /**
     * + Please refer to corresponding EMSK User Guide for detailed information
     *   -> Appendix: A  Hardware Functional Description
     *      -> Pmods Configuration summary
     * + Set up pin-multiplexer of all PMOD connections
     *   - PM1 J1: Upper row as UART 0, lower row as SPI Slave
     *   - PM2 J2: IIC 0 and run/halt signals
     *   - PM3 J3: GPIO Port A and Port C
     *   - PM4 J4: IIC 1 and Port D
     *   - PM5 J5: Upper row as SPI Master, lower row as Port A
     *   - PM6 J6: Upper row as SPI Master, lower row as Port A
     */
    set_pmod_mux(mux_regs, PM1_UR_UART_0 | PM1_LR_SPI_S \
                 | PM2_I2C_HRI           \
                 | PM3_GPIO_AC           \
                 | PM4_I2C_GPIO_D        \
                 | PM5_UR_SPI_M1 | PM5_LR_GPIO_A \
                 | PM6_UR_SPI_M0 | PM6_LR_GPIO_A);

    /**
     * PM1 upper row as UART
     * UM4:RXD, UM3:TXD
     * UM2:RTS_N, UM1:CTS_N
     */
    set_uart_map(mux_regs, 0x9c);
}

/**
 * \brief   Board init routine MUST be called in each application
 * \note    It is better to disable interrupts when calling this function
 *  remember to enable interrupt when you want to use them
 */
void board_init(void)
{
    timer_init();
    emsk_mux_init();
    emsk_gpio_init();
    emsk_timer_init();
}

/** @} end of group BOARD_EMSK_COMMON_INIT */
