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