--- /dev/null
+/*
+ * 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;
+}