1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * DENX M28 Boot setup
4  *
5  * Copyright (C) 2019 DENX Software Engineering
6  * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
7  *
8  * Copyright (C) 2018 DENX Software Engineering
9  * Måns Rullgård, DENX Software Engineering, mans@mansr.com
10  *
11  * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
12  * on behalf of DENX Software Engineering GmbH
13  */
14 
15 #include <common.h>
16 #include <config.h>
17 #include <asm/io.h>
18 #include <asm/arch/iomux-mx28.h>
19 #include <asm/arch/imx-regs.h>
20 #include <asm/arch/sys_proto.h>
21 
22 #define	MUX_CONFIG_LCD	(MXS_PAD_3V3 | MXS_PAD_4MA | MXS_PAD_NOPULL)
23 #define	MUX_CONFIG_BOOT	(MXS_PAD_3V3)
24 #define	MUX_CONFIG_TSC	(MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP)
25 #define	MUX_CONFIG_SSP0	(MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_PULLUP)
26 #define	MUX_CONFIG_SSP2	(MXS_PAD_3V3 | MXS_PAD_4MA | MXS_PAD_PULLUP)
27 #define	MUX_CONFIG_ENET	(MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_NOPULL)
28 #define	MUX_CONFIG_EMI	(MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_NOPULL)
29 
30 const iomux_cfg_t iomux_setup[] = {
31 	/* AUART0 IRDA */
32 	MX28_PAD_AUART0_RX__AUART0_RX,
33 	MX28_PAD_AUART0_TX__AUART0_TX,
34 
35 	/* AUART 4 RS422 */
36 	MX28_PAD_AUART0_CTS__AUART4_RX,
37 	MX28_PAD_AUART0_RTS__AUART4_TX,
38 
39 	/* USB0 */
40 	MX28_PAD_AUART1_CTS__USB0_OVERCURRENT,
41 	MX28_PAD_AUART1_RTS__USB0_ID,
42 	MX28_PAD_LCD_VSYNC__GPIO_1_28, /* PRW_On */
43 
44 	/* USB1 */
45 	MX28_PAD_PWM2__USB1_OVERCURRENT,
46 
47 	/* eMMC */
48 	MX28_PAD_SSP0_CMD__SSP0_CMD | MUX_CONFIG_SSP0,
49 	MX28_PAD_SSP0_DATA0__SSP0_D0 | MUX_CONFIG_SSP0,
50 	MX28_PAD_SSP0_DATA1__SSP0_D1 | MUX_CONFIG_SSP0,
51 	MX28_PAD_SSP0_DATA2__SSP0_D2 | MUX_CONFIG_SSP0,
52 	MX28_PAD_SSP0_DATA3__SSP0_D3 | MUX_CONFIG_SSP0,
53 	MX28_PAD_SSP0_DATA4__SSP0_D4 | MUX_CONFIG_SSP0,
54 	MX28_PAD_SSP0_DATA5__SSP0_D5 | MUX_CONFIG_SSP0,
55 	MX28_PAD_SSP0_DATA6__SSP0_D6 | MUX_CONFIG_SSP0,
56 	MX28_PAD_SSP0_DATA7__SSP0_D7 | MUX_CONFIG_SSP0,
57 	MX28_PAD_SSP0_DETECT__GPIO_2_9, /* Reset for eMMC */
58 	MX28_PAD_SSP0_SCK__SSP0_SCK | MUX_CONFIG_SSP0,
59 
60 	/* DIG Keys */
61 	MX28_PAD_GPMI_D00__GPIO_0_0,
62 	MX28_PAD_GPMI_D01__GPIO_0_1,
63 	MX28_PAD_GPMI_D02__GPIO_0_2,
64 	MX28_PAD_GPMI_D03__GPIO_0_3,
65 	MX28_PAD_GPMI_D04__GPIO_0_4,
66 	MX28_PAD_GPMI_D05__GPIO_0_5,
67 	MX28_PAD_GPMI_D06__GPIO_0_6,
68 	MX28_PAD_GPMI_D07__GPIO_0_7,
69 
70 	/* ADR_0-2 */
71 	MX28_PAD_GPMI_CE1N__GPIO_0_17,
72 	MX28_PAD_GPMI_CE2N__GPIO_0_18,
73 	MX28_PAD_GPMI_CE3N__GPIO_0_19,
74 
75 	/* Read Keys */
76 	MX28_PAD_GPMI_RDY0__GPIO_0_20,
77 
78 	/* LATCH_EN */
79 	MX28_PAD_GPMI_RDY1__GPIO_0_21,
80 
81 	/* Power off */
82 	MX28_PAD_GPMI_RDN__GPIO_0_24,
83 
84 	/* I2C1 Touch */
85 	MX28_PAD_AUART2_CTS__GPIO_3_10,
86 	MX28_PAD_AUART2_RTS__GPIO_3_11,
87 	MX28_PAD_GPMI_RDY2__GPIO_0_22, /* Touch Reset */
88 
89 	/* TIVA */
90 	MX28_PAD_AUART1_RX__SSP2_CARD_DETECT,
91 	MX28_PAD_SSP2_MISO__SSP2_D0,
92 	MX28_PAD_SSP2_MOSI__SSP2_CMD,
93 	MX28_PAD_SSP2_SCK__SSP2_SCK,
94 	MX28_PAD_SSP2_SS0__SSP2_D3,
95 	MX28_PAD_SSP2_SS1__GPIO_2_20,
96 	MX28_PAD_SSP2_SS2__GPIO_2_21,
97 
98 	/* SPI3 NOR-Flash */
99 	MX28_PAD_AUART1_TX__SSP3_CARD_DETECT,
100 	MX28_PAD_AUART2_RX__SSP3_D1,
101 	MX28_PAD_AUART2_TX__SSP3_D2,
102 	MX28_PAD_SSP3_MISO__SSP3_D0,
103 	MX28_PAD_SSP3_MOSI__SSP3_CMD,
104 	MX28_PAD_SSP3_SCK__SSP3_SCK,
105 	MX28_PAD_SSP3_SS0__SSP3_D3,
106 
107 	/* NOR-Flash CMD */
108 	MX28_PAD_LCD_RS__GPIO_1_26, /* Hold */
109 	MX28_PAD_LCD_WR_RWN__GPIO_1_25, /* write protect */
110 
111 	/* I2C0 Codec */
112 	MX28_PAD_I2C0_SCL__I2C0_SCL,
113 	MX28_PAD_I2C0_SDA__I2C0_SDA,
114 
115 	/* I2S Codec */
116 	MX28_PAD_SAIF0_BITCLK__SAIF0_BITCLK,
117 	MX28_PAD_SAIF0_LRCLK__SAIF0_LRCLK,
118 	MX28_PAD_SAIF0_MCLK__SAIF0_MCLK,
119 	MX28_PAD_SAIF0_SDATA0__SAIF0_SDATA0,
120 	MX28_PAD_SAIF1_SDATA0__SAIF1_SDATA0,
121 
122 	/* PWR-Hold */
123 	MX28_PAD_SPDIF__GPIO_3_27,
124 
125 	/* EMI */
126 	MX28_PAD_EMI_D00__EMI_DATA0 | MUX_CONFIG_EMI,
127 	MX28_PAD_EMI_D01__EMI_DATA1 | MUX_CONFIG_EMI,
128 	MX28_PAD_EMI_D02__EMI_DATA2 | MUX_CONFIG_EMI,
129 	MX28_PAD_EMI_D03__EMI_DATA3 | MUX_CONFIG_EMI,
130 	MX28_PAD_EMI_D04__EMI_DATA4 | MUX_CONFIG_EMI,
131 	MX28_PAD_EMI_D05__EMI_DATA5 | MUX_CONFIG_EMI,
132 	MX28_PAD_EMI_D06__EMI_DATA6 | MUX_CONFIG_EMI,
133 	MX28_PAD_EMI_D07__EMI_DATA7 | MUX_CONFIG_EMI,
134 	MX28_PAD_EMI_D08__EMI_DATA8 | MUX_CONFIG_EMI,
135 	MX28_PAD_EMI_D09__EMI_DATA9 | MUX_CONFIG_EMI,
136 	MX28_PAD_EMI_D10__EMI_DATA10 | MUX_CONFIG_EMI,
137 	MX28_PAD_EMI_D11__EMI_DATA11 | MUX_CONFIG_EMI,
138 	MX28_PAD_EMI_D12__EMI_DATA12 | MUX_CONFIG_EMI,
139 	MX28_PAD_EMI_D13__EMI_DATA13 | MUX_CONFIG_EMI,
140 	MX28_PAD_EMI_D14__EMI_DATA14 | MUX_CONFIG_EMI,
141 	MX28_PAD_EMI_D15__EMI_DATA15 | MUX_CONFIG_EMI,
142 	MX28_PAD_EMI_ODT0__EMI_ODT0 | MUX_CONFIG_EMI,
143 	MX28_PAD_EMI_DQM0__EMI_DQM0 | MUX_CONFIG_EMI,
144 	MX28_PAD_EMI_ODT1__EMI_ODT1 | MUX_CONFIG_EMI,
145 	MX28_PAD_EMI_DQM1__EMI_DQM1 | MUX_CONFIG_EMI,
146 	MX28_PAD_EMI_DDR_OPEN_FB__EMI_DDR_OPEN_FEEDBACK | MUX_CONFIG_EMI,
147 	MX28_PAD_EMI_CLK__EMI_CLK | MUX_CONFIG_EMI,
148 	MX28_PAD_EMI_DQS0__EMI_DQS0 | MUX_CONFIG_EMI,
149 	MX28_PAD_EMI_DQS1__EMI_DQS1 | MUX_CONFIG_EMI,
150 	MX28_PAD_EMI_DDR_OPEN__EMI_DDR_OPEN | MUX_CONFIG_EMI,
151 
152 	MX28_PAD_EMI_A00__EMI_ADDR0 | MUX_CONFIG_EMI,
153 	MX28_PAD_EMI_A01__EMI_ADDR1 | MUX_CONFIG_EMI,
154 	MX28_PAD_EMI_A02__EMI_ADDR2 | MUX_CONFIG_EMI,
155 	MX28_PAD_EMI_A03__EMI_ADDR3 | MUX_CONFIG_EMI,
156 	MX28_PAD_EMI_A04__EMI_ADDR4 | MUX_CONFIG_EMI,
157 	MX28_PAD_EMI_A05__EMI_ADDR5 | MUX_CONFIG_EMI,
158 	MX28_PAD_EMI_A06__EMI_ADDR6 | MUX_CONFIG_EMI,
159 	MX28_PAD_EMI_A07__EMI_ADDR7 | MUX_CONFIG_EMI,
160 	MX28_PAD_EMI_A08__EMI_ADDR8 | MUX_CONFIG_EMI,
161 	MX28_PAD_EMI_A09__EMI_ADDR9 | MUX_CONFIG_EMI,
162 	MX28_PAD_EMI_A10__EMI_ADDR10 | MUX_CONFIG_EMI,
163 	MX28_PAD_EMI_A11__EMI_ADDR11 | MUX_CONFIG_EMI,
164 	MX28_PAD_EMI_A12__EMI_ADDR12 | MUX_CONFIG_EMI,
165 	MX28_PAD_EMI_A13__EMI_ADDR13 | MUX_CONFIG_EMI,
166 	MX28_PAD_EMI_A14__EMI_ADDR14 | MUX_CONFIG_EMI,
167 	MX28_PAD_EMI_BA0__EMI_BA0 | MUX_CONFIG_EMI,
168 	MX28_PAD_EMI_BA1__EMI_BA1 | MUX_CONFIG_EMI,
169 	MX28_PAD_EMI_BA2__EMI_BA2 | MUX_CONFIG_EMI,
170 	MX28_PAD_EMI_CASN__EMI_CASN | MUX_CONFIG_EMI,
171 	MX28_PAD_EMI_RASN__EMI_RASN | MUX_CONFIG_EMI,
172 	MX28_PAD_EMI_WEN__EMI_WEN | MUX_CONFIG_EMI,
173 	MX28_PAD_EMI_CE0N__EMI_CE0N | MUX_CONFIG_EMI,
174 	MX28_PAD_EMI_CE1N__EMI_CE1N | MUX_CONFIG_EMI,
175 	MX28_PAD_EMI_CKE__EMI_CKE | MUX_CONFIG_EMI,
176 
177 	/* Uart3 Bluetooth-Interface */
178 	MX28_PAD_AUART3_CTS__AUART3_CTS,
179 	MX28_PAD_AUART3_RTS__AUART3_RTS,
180 	MX28_PAD_AUART3_RX__AUART3_RX,
181 	MX28_PAD_AUART3_TX__AUART3_TX,
182 
183 	/* framebuffer */
184 	MX28_PAD_LCD_CS__LCD_CS | MUX_CONFIG_LCD,
185 	MX28_PAD_LCD_D00__LCD_D0 | MUX_CONFIG_LCD,
186 	MX28_PAD_LCD_D01__LCD_D1 | MUX_CONFIG_LCD,
187 	MX28_PAD_LCD_D02__LCD_D2 | MUX_CONFIG_LCD,
188 	MX28_PAD_LCD_D03__LCD_D3 | MUX_CONFIG_LCD,
189 	MX28_PAD_LCD_D04__LCD_D4 | MUX_CONFIG_LCD,
190 	MX28_PAD_LCD_D05__LCD_D5 | MUX_CONFIG_LCD,
191 	MX28_PAD_LCD_D06__LCD_D6 | MUX_CONFIG_LCD,
192 	MX28_PAD_LCD_D07__LCD_D7 | MUX_CONFIG_LCD,
193 	MX28_PAD_LCD_D08__LCD_D8 | MUX_CONFIG_LCD,
194 	MX28_PAD_LCD_D09__LCD_D9 | MUX_CONFIG_LCD,
195 	MX28_PAD_LCD_D10__LCD_D10 | MUX_CONFIG_LCD,
196 	MX28_PAD_LCD_D11__LCD_D11 | MUX_CONFIG_LCD,
197 	MX28_PAD_LCD_D12__LCD_D12 | MUX_CONFIG_LCD,
198 	MX28_PAD_LCD_D13__LCD_D13 | MUX_CONFIG_LCD,
199 	MX28_PAD_LCD_D14__LCD_D14 | MUX_CONFIG_LCD,
200 	MX28_PAD_LCD_D15__LCD_D15 | MUX_CONFIG_LCD,
201 	MX28_PAD_LCD_D16__LCD_D16 | MUX_CONFIG_LCD,
202 	MX28_PAD_LCD_D17__LCD_D17 | MUX_CONFIG_LCD,
203 	MX28_PAD_LCD_D18__LCD_D18 | MUX_CONFIG_LCD,
204 	MX28_PAD_LCD_D19__LCD_D19 | MUX_CONFIG_LCD,
205 	MX28_PAD_LCD_D20__LCD_D20 | MUX_CONFIG_LCD,
206 	MX28_PAD_LCD_D21__LCD_D21 | MUX_CONFIG_LCD,
207 	MX28_PAD_LCD_D22__LCD_D22 | MUX_CONFIG_LCD,
208 	MX28_PAD_LCD_D23__LCD_D23 | MUX_CONFIG_LCD,
209 	MX28_PAD_LCD_DOTCLK__LCD_DOTCLK | MUX_CONFIG_LCD,
210 	MX28_PAD_LCD_ENABLE__LCD_ENABLE | MUX_CONFIG_LCD,
211 	MX28_PAD_LCD_HSYNC__LCD_HSYNC | MUX_CONFIG_LCD,
212 	MX28_PAD_LCD_RD_E__LCD_VSYNC | MUX_CONFIG_LCD,
213 	MX28_PAD_LCD_RESET__LCD_RESET | MUX_CONFIG_LCD,
214 
215 	/* DUART RS232 */
216 	MX28_PAD_PWM0__DUART_RX,
217 	MX28_PAD_PWM1__DUART_TX,
218 
219 	/* FEC Ethernet */
220 	MX28_PAD_ENET_CLK__CLKCTRL_ENET | MUX_CONFIG_ENET,
221 	MX28_PAD_ENET0_COL__ENET1_TX_EN | MUX_CONFIG_ENET,
222 	MX28_PAD_ENET0_CRS__ENET1_RX_EN | MUX_CONFIG_ENET,
223 	MX28_PAD_ENET0_MDC__ENET0_MDC | MUX_CONFIG_ENET,
224 	MX28_PAD_ENET0_MDIO__ENET0_MDIO | MUX_CONFIG_ENET,
225 	MX28_PAD_ENET0_RX_CLK__GPIO_4_13, /* Phy Interrupt */
226 	MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | MUX_CONFIG_ENET,
227 	MX28_PAD_ENET0_RXD0__ENET0_RXD0 | MUX_CONFIG_ENET,
228 	MX28_PAD_ENET0_RXD1__ENET0_RXD1 | MUX_CONFIG_ENET,
229 	MX28_PAD_ENET0_RXD3__ENET1_RXD1 | MUX_CONFIG_ENET,
230 	MX28_PAD_ENET0_TX_CLK__GPIO_4_5, /* n.c. */
231 	MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | MUX_CONFIG_ENET,
232 	MX28_PAD_ENET0_TXD0__ENET0_TXD0 | MUX_CONFIG_ENET,
233 	MX28_PAD_ENET0_TXD1__ENET0_TXD1 | MUX_CONFIG_ENET,
234 	MX28_PAD_ENET0_TXD3__ENET1_TXD1 | MUX_CONFIG_ENET,
235 	MX28_PAD_SSP1_CMD__GPIO_2_13, /* PHY reset */
236 
237 	/* TIVA boot control */
238 	MX28_PAD_GPMI_RDY3__GPIO_0_23 | MUX_CONFIG_BOOT, /* TIVA0 */
239 	MX28_PAD_GPMI_WRN__GPIO_0_25 | MUX_CONFIG_BOOT, /* TIVA1 */
240 };
241 
242 u32 mxs_dram_vals[] = {
243 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
244 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
245 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
246 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
247 	0x00000000, 0x00000100, 0x00000000, 0x00000000,
248 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
249 	0x00000000, 0x00000000, 0x00010101, 0x01010101,
250 	0x000f0f01, 0x0f02010a, 0x00000000, 0x00010101,
251 	0x00000100, 0x00000100, 0x00000000, 0x00000002,
252 	0x01010000, 0x07080403, 0x07005303, 0x0b0000c8,
253 	0x0200a0c1, 0x0002040c, 0x0038430a, 0x04290322,
254 	0x02040203, 0x00c8002b, 0x00000000, 0x00000000,
255 	0x00012100, 0xffff0303, 0x00012100, 0xffff0303,
256 	0x00012100, 0xffff0303, 0x00012100, 0xffff0303,
257 	0x00000003, 0x00000000, 0x00000000, 0x00000000,
258 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
259 	0x00000000, 0x00000000, 0x00000612, 0x01000102,
260 	0x06120612, 0x00000200, 0x00020007, 0xf4004a27,
261 	0xf4004a27, 0xf4004a27, 0xf4004a27, 0x07400300,
262 	0x07400300, 0x07400300, 0x07400300, 0x00000005,
263 	0x00000000, 0x00000000, 0x01000000, 0x00000000,
264 	0x00000001, 0x000f1133, 0x00000000, 0x00001f04,
265 	0x00001f04, 0x00001f04, 0x00001f04, 0x00001f04,
266 	0x00001f04, 0x00001f04, 0x00001f04, 0x00000000,
267 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
268 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
269 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
270 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
271 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
272 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
273 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
274 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
275 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
276 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
277 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
278 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
279 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
280 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
281 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
282 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
283 	0x00000000, 0x00000000, 0x00010000, 0x00030404,
284 	0x00000002, 0x00000000, 0x00000000, 0x00000000,
285 	0x00000000, 0x00000000, 0x00000000, 0x01010000,
286 	0x01000000, 0x03030000, 0x00010303, 0x01020202,
287 	0x00000000, 0x02040101, 0x21002103, 0x00061200,
288 	0x06120612, 0x00000642, 0x00000000, 0x00000004,
289 	0x00000000, 0x00000080, 0x00000000, 0x00000000,
290 	0x00000000, 0xffffffff
291 };
292 
lowlevel_init(void)293 void lowlevel_init(void)
294 {
295 	struct mxs_pinctrl_regs *pinctrl_regs =
296 		(struct mxs_pinctrl_regs *)MXS_PINCTRL_BASE;
297 
298 	/* Set EMI drive strength */
299 	writel(0x00003fff, &pinctrl_regs->hw_pinctrl_emi_ds_ctrl_clr);
300 	writel(0x00002aaa, &pinctrl_regs->hw_pinctrl_emi_ds_ctrl_set);
301 
302 	mxs_common_spl_init(0, NULL, iomux_setup, ARRAY_SIZE(iomux_setup));
303 }
304