1 /*
2  * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /******************************************************************************
18  * @file     pinmux.c
19  * @brief    source file for the pinmux
20  * @version  V1.0
21  * @date     02. June 2017
22  ******************************************************************************/
23 #include <stdint.h>
24 #include "pinmux.h"
25 #include "pin_name.h"
26 
27 #define readl(addr) \
28     ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
29 
30 #define writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
31 
32 /*******************************************************************************
33  * function: phobos_ioreuse_inital
34  *
35  * description:
36  *   initial phobos_pinmux
37  *******************************************************************************/
38 
phobos_ioreuse_initial(void)39 void phobos_ioreuse_initial(void)
40 {
41     unsigned int value;
42 
43     /* gpio data source select */
44     value = readl(PHOBOS_GIPO0_PORTCTL_REG);
45     value |= GPIO0_REUSE_EN;
46     writel(value, PHOBOS_GIPO0_PORTCTL_REG);
47 
48     value = readl(PHOBOS_GIPO1_PORTCTL_REG);
49     value |= GPIO1_REUSE_EN;
50     writel(value, PHOBOS_GIPO1_PORTCTL_REG);
51 
52     /* reuse function select */
53     value = readl(PHOBOS_IOMUX0L_REG);
54     value |= IOMUX0L_FUNCTION_SEL;
55     writel(value, PHOBOS_IOMUX0L_REG);
56 
57     value = readl(PHOBOS_IOMUX0H_REG);
58     value |= IOMUX1L_FUNCTION_SEL;
59     writel(value, PHOBOS_IOMUX0H_REG);
60 
61     value = readl(PHOBOS_IOMUX1L_REG);
62     value |= IOMUX1L_FUNCTION_SEL;
63     writel(value, PHOBOS_IOMUX1L_REG);
64 }
65 
phobos_pwm_ioreuse(void)66 void phobos_pwm_ioreuse(void)
67 {
68     unsigned int value;
69 
70     /* gpio data source select */
71     value = readl(PHOBOS_GIPO0_PORTCTL_REG);
72     value |= PWM_GPIO0_REUSE_EN;
73     writel(value, PHOBOS_GIPO0_PORTCTL_REG);
74 
75     /* reuse function select */
76     value = readl(PHOBOS_IOMUX0L_REG);
77     value |= PWM_IOMUX0L_FUNCTION_SEL;
78     writel(value, PHOBOS_IOMUX0L_REG);
79 }
80 
81 
pin_mux(pin_name_t pin,uint16_t function)82 int32_t pin_mux(pin_name_t pin, uint16_t function)
83 {
84     unsigned int val = 0;
85     unsigned int reg_val = 0;
86 
87     uint8_t offset;
88 
89     if (function > 3)
90     {
91         if (pin < PB0_ADC0_SDA0_PWM5_XX)
92         {
93             offset = pin;
94             /* gpio data source select */
95             val = readl(PHOBOS_GIPO0_PORTCTL_REG);
96             val &= ~(1 << offset);
97             writel(val, PHOBOS_GIPO0_PORTCTL_REG);
98             return 0;
99         }
100         else if (pin >= PB0_ADC0_SDA0_PWM5_XX)
101         {
102             offset = pin - 32;
103             /* gpio data source select */
104             val = readl(PHOBOS_GIPO1_PORTCTL_REG);
105             val &= ~(1 << offset);
106             writel(val, PHOBOS_GIPO1_PORTCTL_REG);
107             return 0;
108         }
109         else
110         {
111             return -1;
112         }
113     }
114 
115     if (pin >= PB0_ADC0_SDA0_PWM5_XX)
116     {
117         offset = pin - 32;
118 
119         /* gpio data source select */
120         val = readl(PHOBOS_GIPO1_PORTCTL_REG);
121         val |= (1 << offset);
122         writel(val, PHOBOS_GIPO1_PORTCTL_REG);
123 
124         reg_val = (0x3 << (offset * 2));
125         /* reuse function select */
126         val = readl(PHOBOS_IOMUX1L_REG);
127         val &= ~(reg_val);
128         val |= (function << (2 * offset));
129         writel(val, PHOBOS_IOMUX1L_REG);
130         return 0;
131     }
132 
133     offset = pin;
134     /* gpio data source select */
135     val = readl(PHOBOS_GIPO0_PORTCTL_REG);
136     val |= (1 << offset);
137     writel(val, PHOBOS_GIPO0_PORTCTL_REG);
138 
139     if (pin >= PA16_SPI1CLK_PWMTRIG1_XX_XX)
140     {
141         offset = pin - 16;
142         reg_val = (0x3 << (offset * 2));
143         /* reuse function select */
144         val = readl(PHOBOS_IOMUX0H_REG);
145         val &= ~(reg_val);
146         val |= (function << (2 * offset));
147         writel(val, PHOBOS_IOMUX0H_REG);
148         return 0;
149     }
150 
151     reg_val = (0x3 << (offset * 2));
152     /* reuse function select */
153     val = readl(PHOBOS_IOMUX0L_REG);
154     val &= ~(reg_val);
155     val |= (function << (2 * offset));
156     writel(val, PHOBOS_IOMUX0L_REG);
157     return 0;
158 }
159