/*
 * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/******************************************************************************
 * @file     pinmux.c
 * @brief    source file for the pinmux
 * @version  V1.0
 * @date     02. June 2017
 ******************************************************************************/
#include <stdint.h>
#include "pinmux.h"
#include "pin_name.h"

#define readl(addr) \
    ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })

#define writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))

/*******************************************************************************
 * function: phobos_ioreuse_inital
 *
 * description:
 *   initial phobos_pinmux
 *******************************************************************************/

void phobos_ioreuse_initial(void)
{
    unsigned int value;

    /* gpio data source select */
    value = readl(PHOBOS_GIPO0_PORTCTL_REG);
    value |= GPIO0_REUSE_EN;
    writel(value, PHOBOS_GIPO0_PORTCTL_REG);

    value = readl(PHOBOS_GIPO1_PORTCTL_REG);
    value |= GPIO1_REUSE_EN;
    writel(value, PHOBOS_GIPO1_PORTCTL_REG);

    /* reuse function select */
    value = readl(PHOBOS_IOMUX0L_REG);
    value |= IOMUX0L_FUNCTION_SEL;
    writel(value, PHOBOS_IOMUX0L_REG);

    value = readl(PHOBOS_IOMUX0H_REG);
    value |= IOMUX1L_FUNCTION_SEL;
    writel(value, PHOBOS_IOMUX0H_REG);

    value = readl(PHOBOS_IOMUX1L_REG);
    value |= IOMUX1L_FUNCTION_SEL;
    writel(value, PHOBOS_IOMUX1L_REG);
}

void phobos_pwm_ioreuse(void)
{
    unsigned int value;

    /* gpio data source select */
    value = readl(PHOBOS_GIPO0_PORTCTL_REG);
    value |= PWM_GPIO0_REUSE_EN;
    writel(value, PHOBOS_GIPO0_PORTCTL_REG);

    /* reuse function select */
    value = readl(PHOBOS_IOMUX0L_REG);
    value |= PWM_IOMUX0L_FUNCTION_SEL;
    writel(value, PHOBOS_IOMUX0L_REG);
}


int32_t pin_mux(pin_name_t pin, uint16_t function)
{
    unsigned int val = 0;
    unsigned int reg_val = 0;

    uint8_t offset;

    if (function > 3) {
        if (pin < PB0_ADC0_SDA0_PWM5_XX) {
            offset = pin;
            /* gpio data source select */
            val = readl(PHOBOS_GIPO0_PORTCTL_REG);
            val &= ~(1 << offset);
            writel(val, PHOBOS_GIPO0_PORTCTL_REG);
            return 0;
        } else if (pin >= PB0_ADC0_SDA0_PWM5_XX) {
            offset = pin - 32;
            /* gpio data source select */
            val = readl(PHOBOS_GIPO1_PORTCTL_REG);
            val &= ~(1 << offset);
            writel(val, PHOBOS_GIPO1_PORTCTL_REG);
            return 0;
        } else {
            return -1;
        }
    }

    if (pin >= PB0_ADC0_SDA0_PWM5_XX) {
        offset = pin - 32;

        /* gpio data source select */
        val = readl(PHOBOS_GIPO1_PORTCTL_REG);
        val |= (1 << offset);
        writel(val, PHOBOS_GIPO1_PORTCTL_REG);

        reg_val = (0x3 << (offset * 2));
        /* reuse function select */
        val = readl(PHOBOS_IOMUX1L_REG);
        val &= ~(reg_val);
        val |= (function << (2 * offset));
        writel(val, PHOBOS_IOMUX1L_REG);
        return 0;
    }

    offset = pin;
    /* gpio data source select */
    val = readl(PHOBOS_GIPO0_PORTCTL_REG);
    val |= (1 << offset);
    writel(val, PHOBOS_GIPO0_PORTCTL_REG);

    if (pin >= PA16_SPI1CLK_PWMTRIG1_XX_XX) {
        offset = pin - 16;
        reg_val = (0x3 << (offset * 2));
        /* reuse function select */
        val = readl(PHOBOS_IOMUX0H_REG);
        val &= ~(reg_val);
        val |= (function << (2 * offset));
        writel(val, PHOBOS_IOMUX0H_REG);
        return 0;
    }

    reg_val = (0x3 << (offset * 2));
    /* reuse function select */
    val = readl(PHOBOS_IOMUX0L_REG);
    val &= ~(reg_val);
    val |= (function << (2 * offset));
    writel(val, PHOBOS_IOMUX0L_REG);
    return 0;
}
