1
2
3
4
5
6
7#include <common.h>
8#include <fdtdec.h>
9#include <log.h>
10#include <asm/gpio.h>
11#include <asm/io.h>
12#include <asm/arch/pinmux.h>
13#include <linux/bitops.h>
14
15struct hi6220_pinmux0_regs *pmx0 =
16 (struct hi6220_pinmux0_regs *)HI6220_PINMUX0_BASE;
17
18struct hi6220_pinmux1_regs *pmx1 =
19 (struct hi6220_pinmux1_regs *)HI6220_PINMUX1_BASE;
20
21static void hi6220_uart_config(int peripheral)
22{
23 switch (peripheral) {
24 case PERIPH_ID_UART0:
25 writel(MUX_M0, &pmx0->iomg[48]);
26 writel(MUX_M0, &pmx0->iomg[49]);
27
28 writel(DRIVE1_02MA | PULL_UP, &pmx1->iocfg[49]);
29 writel(DRIVE1_02MA | PULL_UP, &pmx1->iocfg[50]);
30 break;
31
32 case PERIPH_ID_UART1:
33 writel(MUX_M0, &pmx0->iomg[50]);
34 writel(MUX_M0, &pmx0->iomg[51]);
35 writel(MUX_M0, &pmx0->iomg[52]);
36 writel(MUX_M0, &pmx0->iomg[53]);
37
38 writel(DRIVE1_02MA | PULL_UP, &pmx1->iocfg[51]);
39 writel(DRIVE1_02MA | PULL_UP, &pmx1->iocfg[53]);
40 writel(DRIVE1_02MA, &pmx1->iocfg[52]);
41 writel(DRIVE1_02MA, &pmx1->iocfg[54]);
42 break;
43
44 case PERIPH_ID_UART2:
45 writel(MUX_M0, &pmx0->iomg[54]);
46 writel(MUX_M0, &pmx0->iomg[55]);
47 writel(MUX_M0, &pmx0->iomg[56]);
48 writel(MUX_M0, &pmx0->iomg[57]);
49
50 writel(DRIVE1_02MA, &pmx1->iocfg[55]);
51 writel(DRIVE1_02MA, &pmx1->iocfg[56]);
52 writel(DRIVE1_02MA, &pmx1->iocfg[57]);
53 writel(DRIVE1_02MA, &pmx1->iocfg[58]);
54 break;
55
56 case PERIPH_ID_UART3:
57 writel(MUX_M1, &pmx0->iomg[96]);
58 writel(MUX_M1, &pmx0->iomg[97]);
59 writel(MUX_M1, &pmx0->iomg[98]);
60 writel(MUX_M1, &pmx0->iomg[99]);
61
62
63 writel(DRIVE1_02MA | PULL_DOWN, &pmx1->iocfg[100]);
64
65 writel(DRIVE1_02MA | PULL_DOWN, &pmx1->iocfg[101]);
66
67 writel(DRIVE1_02MA | PULL_DOWN, &pmx1->iocfg[102]);
68
69 writel(DRIVE1_02MA | PULL_DOWN, &pmx1->iocfg[103]);
70 break;
71
72 case PERIPH_ID_UART4:
73 writel(MUX_M1, &pmx0->iomg[116]);
74 writel(MUX_M1, &pmx0->iomg[117]);
75 writel(MUX_M1, &pmx0->iomg[118]);
76 writel(MUX_M1, &pmx0->iomg[119]);
77
78
79 writel(DRIVE1_02MA | PULL_DOWN, &pmx1->iocfg[120]);
80
81 writel(DRIVE1_02MA | PULL_DOWN, &pmx1->iocfg[121]);
82
83 writel(DRIVE1_02MA | PULL_DOWN, &pmx1->iocfg[122]);
84
85 writel(DRIVE1_02MA | PULL_DOWN, &pmx1->iocfg[123]);
86 break;
87 case PERIPH_ID_UART5:
88 writel(MUX_M1, &pmx0->iomg[114]);
89 writel(MUX_M1, &pmx0->iomg[115]);
90
91
92 writel(DRIVE1_02MA | PULL_DOWN, &pmx1->iocfg[118]);
93
94 writel(DRIVE1_02MA | PULL_DOWN, &pmx1->iocfg[119]);
95
96 break;
97
98 default:
99 debug("%s: invalid peripheral %d", __func__, peripheral);
100 return;
101 }
102}
103
104static int hi6220_mmc_config(int peripheral)
105{
106 u32 tmp;
107
108 switch (peripheral) {
109 case PERIPH_ID_SDMMC0:
110
111
112 writel(MUX_M0, &pmx0->iomg[64]);
113 writel(MUX_M0, &pmx0->iomg[65]);
114 writel(MUX_M0, &pmx0->iomg[66]);
115 writel(MUX_M0, &pmx0->iomg[67]);
116 writel(MUX_M0, &pmx0->iomg[68]);
117 writel(MUX_M0, &pmx0->iomg[69]);
118 writel(MUX_M0, &pmx0->iomg[70]);
119 writel(MUX_M0, &pmx0->iomg[71]);
120 writel(MUX_M0, &pmx0->iomg[72]);
121 writel(MUX_M0, &pmx0->iomg[73]);
122
123
124 writel(DRIVE1_08MA, &pmx1->iocfg[65]);
125
126 tmp = DRIVE1_04MA | PULL_UP;
127 writel(tmp, &pmx1->iocfg[65]);
128 writel(tmp, &pmx1->iocfg[66]);
129 writel(tmp, &pmx1->iocfg[67]);
130 writel(tmp, &pmx1->iocfg[68]);
131 writel(tmp, &pmx1->iocfg[69]);
132 writel(tmp, &pmx1->iocfg[70]);
133 writel(tmp, &pmx1->iocfg[71]);
134 writel(tmp, &pmx1->iocfg[72]);
135 writel(tmp, &pmx1->iocfg[73]);
136
137 writel(DRIVE1_04MA, &pmx1->iocfg[73]);
138 break;
139
140 case PERIPH_ID_SDMMC1:
141
142 writel(MUX_M0, &pmx0->iomg[3]);
143 writel(MUX_M0, &pmx0->iomg[4]);
144 writel(MUX_M0, &pmx0->iomg[5]);
145 writel(MUX_M0, &pmx0->iomg[6]);
146 writel(MUX_M0, &pmx0->iomg[7]);
147 writel(MUX_M0, &pmx0->iomg[8]);
148
149 writel(DRIVE1_10MA | BIT(2), &pmx1->iocfg[3]);
150 writel(DRIVE1_08MA | BIT(2), &pmx1->iocfg[4]);
151 writel(DRIVE1_08MA | BIT(2), &pmx1->iocfg[5]);
152 writel(DRIVE1_08MA | BIT(2), &pmx1->iocfg[6]);
153 writel(DRIVE1_08MA | BIT(2), &pmx1->iocfg[7]);
154 writel(DRIVE1_08MA | BIT(2), &pmx1->iocfg[8]);
155 break;
156
157 default:
158 debug("%s: invalid peripheral %d", __func__, peripheral);
159 return -1;
160 }
161
162 return 0;
163}
164
165int hi6220_pinmux_config(int peripheral)
166{
167 switch (peripheral) {
168 case PERIPH_ID_UART0:
169 case PERIPH_ID_UART1:
170 case PERIPH_ID_UART2:
171 case PERIPH_ID_UART3:
172 hi6220_uart_config(peripheral);
173 break;
174 case PERIPH_ID_SDMMC0:
175 case PERIPH_ID_SDMMC1:
176 return hi6220_mmc_config(peripheral);
177 default:
178 debug("%s: invalid peripheral %d", __func__, peripheral);
179 return -1;
180 }
181
182 return 0;
183}
184