1 /*
2  * Copyright (c) 2019-2022, Intel Corporation. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <lib/mmio.h>
8 
9 #include "agilex_pinmux.h"
10 #include "agilex_system_manager.h"
11 
12 const uint32_t sysmgr_pinmux_array_sel[] = {
13 	0x00000000, 0x00000001, /* usb */
14 	0x00000004, 0x00000001,
15 	0x00000008, 0x00000001,
16 	0x0000000c, 0x00000001,
17 	0x00000010, 0x00000001,
18 	0x00000014, 0x00000001,
19 	0x00000018, 0x00000001,
20 	0x0000001c, 0x00000001,
21 	0x00000020, 0x00000001,
22 	0x00000024, 0x00000001,
23 	0x00000028, 0x00000001,
24 	0x0000002c, 0x00000001,
25 	0x00000030, 0x00000000, /* emac0 */
26 	0x00000034, 0x00000000,
27 	0x00000038, 0x00000000,
28 	0x0000003c, 0x00000000,
29 	0x00000040, 0x00000000,
30 	0x00000044, 0x00000000,
31 	0x00000048, 0x00000000,
32 	0x0000004c, 0x00000000,
33 	0x00000050, 0x00000000,
34 	0x00000054, 0x00000000,
35 	0x00000058, 0x00000000,
36 	0x0000005c, 0x00000000,
37 	0x00000060, 0x00000008, /* gpio1 */
38 	0x00000064, 0x00000008,
39 	0x00000068, 0x00000005,  /* uart0 tx */
40 	0x0000006c, 0x00000005,  /*  uart 0 rx */
41 	0x00000070, 0x00000008,  /*  gpio */
42 	0x00000074, 0x00000008,
43 	0x00000078, 0x00000004, /* i2c1 */
44 	0x0000007c, 0x00000004,
45 	0x00000080, 0x00000007,  /* jtag */
46 	0x00000084, 0x00000007,
47 	0x00000088, 0x00000007,
48 	0x0000008c, 0x00000007,
49 	0x00000090, 0x00000001,  /* sdmmc data0 */
50 	0x00000094, 0x00000001,
51 	0x00000098, 0x00000001,
52 	0x0000009c, 0x00000001,
53 	0x00000100, 0x00000001,
54 	0x00000104, 0x00000001,  /* sdmmc.data3 */
55 	0x00000108, 0x00000008,  /* loan */
56 	0x0000010c, 0x00000008,   /* gpio */
57 	0x00000110, 0x00000008,
58 	0x00000114, 0x00000008,  /* gpio1.io21 */
59 	0x00000118, 0x00000005,  /* mdio0.mdio */
60 	0x0000011c, 0x00000005  /* mdio0.mdc */
61 };
62 
63 const uint32_t sysmgr_pinmux_array_ctrl[] = {
64 	0x00000000, 0x00502c38, /* Q1_1 */
65 	0x00000004, 0x00102c38,
66 	0x00000008, 0x00502c38,
67 	0x0000000c, 0x00502c38,
68 	0x00000010, 0x00502c38,
69 	0x00000014, 0x00502c38,
70 	0x00000018, 0x00502c38,
71 	0x0000001c, 0x00502c38,
72 	0x00000020, 0x00502c38,
73 	0x00000024, 0x00502c38,
74 	0x00000028, 0x00502c38,
75 	0x0000002c, 0x00502c38,
76 	0x00000030, 0x00102c38, /* Q2_1 */
77 	0x00000034, 0x00102c38,
78 	0x00000038, 0x00502c38,
79 	0x0000003c, 0x00502c38,
80 	0x00000040, 0x00102c38,
81 	0x00000044, 0x00102c38,
82 	0x00000048, 0x00502c38,
83 	0x0000004c, 0x00502c38,
84 	0x00000050, 0x00102c38,
85 	0x00000054, 0x00102c38,
86 	0x00000058, 0x00502c38,
87 	0x0000005c, 0x00502c38,
88 	0x00000060, 0x00502c38, /* Q3_1 */
89 	0x00000064, 0x00502c38,
90 	0x00000068, 0x00102c38,
91 	0x0000006c, 0x00502c38,
92 	0x000000d0, 0x00502c38,
93 	0x000000d4, 0x00502c38,
94 	0x000000d8, 0x00542c38,
95 	0x000000dc, 0x00542c38,
96 	0x000000e0, 0x00502c38,
97 	0x000000e4, 0x00502c38,
98 	0x000000e8, 0x00102c38,
99 	0x000000ec, 0x00502c38,
100 	0x000000f0, 0x00502c38, /* Q4_1 */
101 	0x000000f4, 0x00502c38,
102 	0x000000f8, 0x00102c38,
103 	0x000000fc, 0x00502c38,
104 	0x00000100, 0x00502c38,
105 	0x00000104, 0x00502c38,
106 	0x00000108, 0x00102c38,
107 	0x0000010c, 0x00502c38,
108 	0x00000110, 0x00502c38,
109 	0x00000114, 0x00502c38,
110 	0x00000118, 0x00542c38,
111 	0x0000011c, 0x00102c38
112 };
113 
114 const uint32_t sysmgr_pinmux_array_fpga[] = {
115 	0x00000000, 0x00000000,
116 	0x00000004, 0x00000000,
117 	0x00000008, 0x00000000,
118 	0x0000000c, 0x00000000,
119 	0x00000010, 0x00000000,
120 	0x00000014, 0x00000000,
121 	0x00000018, 0x00000000,
122 	0x0000001c, 0x00000000,
123 	0x00000020, 0x00000000,
124 	0x00000028, 0x00000000,
125 	0x0000002c, 0x00000000,
126 	0x00000030, 0x00000000,
127 	0x00000034, 0x00000000,
128 	0x00000038, 0x00000000,
129 	0x0000003c, 0x00000000,
130 	0x00000040, 0x00000000,
131 	0x00000044, 0x00000000,
132 	0x00000048, 0x00000000,
133 	0x00000050, 0x00000000,
134 	0x00000054, 0x00000000,
135 	0x00000058, 0x0000002a
136 };
137 
138 const uint32_t sysmgr_pinmux_array_iodelay[] = {
139 	0x00000000, 0x00000000,
140 	0x00000004, 0x00000000,
141 	0x00000008, 0x00000000,
142 	0x0000000c, 0x00000000,
143 	0x00000010, 0x00000000,
144 	0x00000014, 0x00000000,
145 	0x00000018, 0x00000000,
146 	0x0000001c, 0x00000000,
147 	0x00000020, 0x00000000,
148 	0x00000024, 0x00000000,
149 	0x00000028, 0x00000000,
150 	0x0000002c, 0x00000000,
151 	0x00000030, 0x00000000,
152 	0x00000034, 0x00000000,
153 	0x00000038, 0x00000000,
154 	0x0000003c, 0x00000000,
155 	0x00000040, 0x00000000,
156 	0x00000044, 0x00000000,
157 	0x00000048, 0x00000000,
158 	0x0000004c, 0x00000000,
159 	0x00000050, 0x00000000,
160 	0x00000054, 0x00000000,
161 	0x00000058, 0x00000000,
162 	0x0000005c, 0x00000000,
163 	0x00000060, 0x00000000,
164 	0x00000064, 0x00000000,
165 	0x00000068, 0x00000000,
166 	0x0000006c, 0x00000000,
167 	0x00000070, 0x00000000,
168 	0x00000074, 0x00000000,
169 	0x00000078, 0x00000000,
170 	0x0000007c, 0x00000000,
171 	0x00000080, 0x00000000,
172 	0x00000084, 0x00000000,
173 	0x00000088, 0x00000000,
174 	0x0000008c, 0x00000000,
175 	0x00000090, 0x00000000,
176 	0x00000094, 0x00000000,
177 	0x00000098, 0x00000000,
178 	0x0000009c, 0x00000000,
179 	0x00000100, 0x00000000,
180 	0x00000104, 0x00000000,
181 	0x00000108, 0x00000000,
182 	0x0000010c, 0x00000000,
183 	0x00000110, 0x00000000,
184 	0x00000114, 0x00000000,
185 	0x00000118, 0x00000000,
186 	0x0000011c, 0x00000000
187 };
188 
config_fpgaintf_mod(void)189 void config_fpgaintf_mod(void)
190 {
191 	uint32_t val;
192 
193 	val = 0;
194 	if (mmio_read_32(AGX_PINMUX_NAND_USEFPGA) & 1)
195 		val |= AGX_PINMUX_NAND_USEFPGA_VAL;
196 	if (mmio_read_32(AGX_PINMUX_SDMMC_USEFPGA) & 1)
197 		val |= AGX_PINMUX_SDMMC_USEFPGA_VAL;
198 	if (mmio_read_32(AGX_PINMUX_SPIM0_USEFPGA) & 1)
199 		val |= AGX_PINMUX_SPIM0_USEFPGA_VAL;
200 	if (mmio_read_32(AGX_PINMUX_SPIM1_USEFPGA) & 1)
201 		val |= AGX_PINMUX_SPIM1_USEFPGA_VAL;
202 	mmio_write_32(SOCFPGA_SYSMGR(FPGAINTF_EN_2), val);
203 
204 	val = 0;
205 	if (mmio_read_32(AGX_PINMUX_EMAC0_USEFPGA) & 1)
206 		val |= AGX_PINMUX_EMAC0_USEFPGA_VAL;
207 	if (mmio_read_32(AGX_PINMUX_EMAC1_USEFPGA) & 1)
208 		val |= AGX_PINMUX_EMAC1_USEFPGA_VAL;
209 	if (mmio_read_32(AGX_PINMUX_EMAC2_USEFPGA) & 1)
210 		val |= AGX_PINMUX_EMAC2_USEFPGA_VAL;
211 	mmio_write_32(SOCFPGA_SYSMGR(FPGAINTF_EN_3), val);
212 }
213 
214 
config_pinmux(handoff * hoff_ptr)215 void config_pinmux(handoff *hoff_ptr)
216 {
217 	unsigned int i;
218 
219 	for (i = 0; i < 96; i += 2) {
220 		mmio_write_32(AGX_PINMUX_PIN0SEL +
221 			hoff_ptr->pinmux_sel_array[i],
222 			hoff_ptr->pinmux_sel_array[i+1]);
223 	}
224 
225 	for (i = 0; i < 96; i += 2) {
226 		mmio_write_32(AGX_PINMUX_IO0CTRL +
227 			hoff_ptr->pinmux_io_array[i],
228 			hoff_ptr->pinmux_io_array[i+1]);
229 	}
230 
231 	for (i = 0; i < 40; i += 2) {
232 		mmio_write_32(AGX_PINMUX_EMAC0_USEFPGA +
233 			hoff_ptr->pinmux_fpga_array[i],
234 			hoff_ptr->pinmux_fpga_array[i+1]);
235 	}
236 
237 	for (i = 0; i < 96; i += 2) {
238 		mmio_write_32(AGX_PINMUX_IO0_DELAY +
239 			hoff_ptr->pinmux_iodelay_array[i],
240 			hoff_ptr->pinmux_iodelay_array[i+1]);
241 	}
242 
243 	config_fpgaintf_mod();
244 }
245 
246