/* * 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 #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; }