]>
Commit | Line | Data |
---|---|---|
a3921eef AG |
1 | /* |
2 | * (C) Copyright 2009, 2010 Wolfgang Denk <wd@denx.de> | |
3 | * | |
4 | * (C) Copyright 2009-2010 | |
5 | * Michael Weiß, ifm ecomatic gmbh, michael.weiss@ifm.com | |
6 | * | |
1a459660 | 7 | * SPDX-License-Identifier: GPL-2.0+ |
a3921eef AG |
8 | */ |
9 | ||
10 | #include <common.h> | |
11 | #include <asm/bitops.h> | |
12 | #include <command.h> | |
13 | #include <asm/io.h> | |
14 | #include <asm/processor.h> | |
15 | #include <asm/mpc512x.h> | |
16 | #include <fdt_support.h> | |
17 | #include <flash.h> | |
18 | #ifdef CONFIG_MISC_INIT_R | |
19 | #include <i2c.h> | |
20 | #endif | |
21 | #include <serial.h> | |
22 | #include <jffs2/load_kernel.h> | |
23 | #include <mtd_node.h> | |
24 | ||
25 | DECLARE_GLOBAL_DATA_PTR; | |
26 | ||
27 | extern flash_info_t flash_info[]; | |
28 | ulong flash_get_size (phys_addr_t base, int banknum); | |
29 | ||
a3921eef AG |
30 | sdram_conf_t mddrc_config[] = { |
31 | { | |
32 | (512 << 20), /* 512 MB RAM configuration */ | |
33 | { | |
34 | CONFIG_SYS_MDDRC_SYS_CFG, | |
35 | CONFIG_SYS_MDDRC_TIME_CFG0, | |
36 | CONFIG_SYS_MDDRC_TIME_CFG1, | |
37 | CONFIG_SYS_MDDRC_TIME_CFG2 | |
38 | } | |
39 | }, | |
40 | { | |
41 | (128 << 20), /* 128 MB RAM configuration */ | |
42 | { | |
43 | CONFIG_SYS_MDDRC_SYS_CFG_ALT1, | |
44 | CONFIG_SYS_MDDRC_TIME_CFG0_ALT1, | |
45 | CONFIG_SYS_MDDRC_TIME_CFG1_ALT1, | |
46 | CONFIG_SYS_MDDRC_TIME_CFG2_ALT1 | |
47 | } | |
48 | }, | |
49 | }; | |
50 | ||
088454cd | 51 | int initdram(void) |
a3921eef AG |
52 | { |
53 | int i; | |
54 | u32 msize = 0; | |
55 | u32 pdm360ng_init_seq[] = { | |
56 | CONFIG_SYS_DDRCMD_NOP, | |
57 | CONFIG_SYS_DDRCMD_NOP, | |
58 | CONFIG_SYS_DDRCMD_NOP, | |
59 | CONFIG_SYS_DDRCMD_NOP, | |
60 | CONFIG_SYS_DDRCMD_NOP, | |
61 | CONFIG_SYS_DDRCMD_NOP, | |
62 | CONFIG_SYS_DDRCMD_NOP, | |
63 | CONFIG_SYS_DDRCMD_NOP, | |
64 | CONFIG_SYS_DDRCMD_NOP, | |
65 | CONFIG_SYS_DDRCMD_NOP, | |
66 | CONFIG_SYS_DDRCMD_PCHG_ALL, | |
67 | CONFIG_SYS_DDRCMD_NOP, | |
68 | CONFIG_SYS_DDRCMD_RFSH, | |
69 | CONFIG_SYS_DDRCMD_NOP, | |
70 | CONFIG_SYS_DDRCMD_RFSH, | |
71 | CONFIG_SYS_DDRCMD_NOP, | |
72 | CONFIG_SYS_MICRON_INIT_DEV_OP, | |
73 | CONFIG_SYS_DDRCMD_NOP, | |
74 | CONFIG_SYS_DDRCMD_EM2, | |
75 | CONFIG_SYS_DDRCMD_NOP, | |
76 | CONFIG_SYS_DDRCMD_PCHG_ALL, | |
77 | CONFIG_SYS_DDRCMD_EM2, | |
78 | CONFIG_SYS_DDRCMD_EM3, | |
79 | CONFIG_SYS_DDRCMD_EN_DLL, | |
80 | CONFIG_SYS_DDRCMD_RES_DLL, | |
81 | CONFIG_SYS_DDRCMD_PCHG_ALL, | |
82 | CONFIG_SYS_DDRCMD_RFSH, | |
83 | CONFIG_SYS_DDRCMD_RFSH, | |
84 | CONFIG_SYS_MICRON_INIT_DEV_OP, | |
85 | CONFIG_SYS_DDRCMD_OCD_DEFAULT, | |
86 | CONFIG_SYS_DDRCMD_OCD_EXIT, | |
87 | CONFIG_SYS_DDRCMD_PCHG_ALL, | |
88 | CONFIG_SYS_DDRCMD_NOP | |
89 | }; | |
90 | ||
91 | for (i = 0; i < ARRAY_SIZE(mddrc_config); i++) { | |
92 | msize = fixed_sdram(&mddrc_config[i].cfg, pdm360ng_init_seq, | |
93 | ARRAY_SIZE(pdm360ng_init_seq)); | |
94 | if (msize == mddrc_config[i].size) | |
95 | break; | |
96 | } | |
97 | ||
088454cd SG |
98 | gd->ram_size = msize; |
99 | ||
100 | return 0; | |
a3921eef AG |
101 | } |
102 | ||
a3921eef | 103 | static int set_lcd_brightness(char *); |
a3921eef AG |
104 | |
105 | int misc_init_r(void) | |
106 | { | |
107 | volatile immap_t *im = (immap_t *)CONFIG_SYS_IMMR; | |
108 | ||
109 | /* | |
110 | * Re-configure flash setup using auto-detected info | |
111 | */ | |
112 | if (flash_info[1].size > 0) { | |
113 | out_be32(&im->sysconf.lpcs1aw, | |
114 | CSAW_START(gd->bd->bi_flashstart + flash_info[1].size) | | |
115 | CSAW_STOP(gd->bd->bi_flashstart + flash_info[1].size, | |
116 | flash_info[1].size)); | |
117 | sync_law(&im->sysconf.lpcs1aw); | |
118 | /* | |
119 | * Re-check to get correct base address | |
120 | */ | |
121 | flash_get_size (gd->bd->bi_flashstart + flash_info[1].size, 1); | |
122 | } else { | |
123 | /* Disable Bank 1 */ | |
124 | out_be32(&im->sysconf.lpcs1aw, 0x01000100); | |
125 | sync_law(&im->sysconf.lpcs1aw); | |
126 | } | |
127 | ||
128 | out_be32(&im->sysconf.lpcs0aw, | |
129 | CSAW_START(gd->bd->bi_flashstart) | | |
130 | CSAW_STOP(gd->bd->bi_flashstart, flash_info[0].size)); | |
131 | sync_law(&im->sysconf.lpcs0aw); | |
132 | ||
133 | /* | |
134 | * Re-check to get correct base address | |
135 | */ | |
136 | flash_get_size (gd->bd->bi_flashstart, 0); | |
137 | ||
138 | /* | |
139 | * Re-do flash protection upon new addresses | |
140 | */ | |
141 | flash_protect (FLAG_PROTECT_CLEAR, | |
142 | gd->bd->bi_flashstart, 0xffffffff, | |
143 | &flash_info[0]); | |
144 | ||
145 | /* Monitor protection ON by default */ | |
146 | flash_protect (FLAG_PROTECT_SET, | |
147 | CONFIG_SYS_MONITOR_BASE, | |
148 | CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN - 1, | |
149 | &flash_info[0]); | |
150 | ||
151 | /* Environment protection ON by default */ | |
152 | flash_protect (FLAG_PROTECT_SET, | |
153 | CONFIG_ENV_ADDR, | |
154 | CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1, | |
155 | &flash_info[0]); | |
156 | ||
157 | #ifdef CONFIG_ENV_ADDR_REDUND | |
158 | /* Redundant environment protection ON by default */ | |
159 | flash_protect (FLAG_PROTECT_SET, | |
160 | CONFIG_ENV_ADDR_REDUND, | |
161 | CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SECT_SIZE - 1, | |
162 | &flash_info[0]); | |
163 | #endif | |
164 | ||
165 | #ifdef CONFIG_FSL_DIU_FB | |
a3921eef | 166 | set_lcd_brightness(0); |
a3921eef AG |
167 | /* Switch LCD-Backlight and LVDS-Interface on */ |
168 | setbits_be32(&im->gpio.gpdir, 0x01040000); | |
169 | clrsetbits_be32(&im->gpio.gpdat, 0x01000000, 0x00040000); | |
170 | #endif | |
171 | ||
172 | #if defined(CONFIG_HARD_I2C) | |
173 | if (!getenv("ethaddr")) { | |
174 | uchar buf[6]; | |
175 | uchar ifm_oui[3] = { 0, 2, 1, }; | |
176 | int ret; | |
177 | ||
178 | /* I2C-0 for on-board eeprom */ | |
179 | i2c_set_bus_num(CONFIG_SYS_I2C_EEPROM_BUS_NUM); | |
180 | ||
181 | /* Read ethaddr from EEPROM */ | |
182 | ret = i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, | |
183 | CONFIG_SYS_I2C_EEPROM_MAC_OFFSET, 1, buf, 6); | |
184 | if (ret != 0) { | |
185 | printf("Error: Unable to read MAC from I2C" | |
186 | " EEPROM at address %02X:%02X\n", | |
187 | CONFIG_SYS_I2C_EEPROM_ADDR, | |
188 | CONFIG_SYS_I2C_EEPROM_MAC_OFFSET); | |
189 | return 1; | |
190 | } | |
191 | ||
192 | /* Owned by IFM ? */ | |
193 | if (memcmp(buf, ifm_oui, sizeof(ifm_oui))) { | |
194 | printf("Illegal MAC address in EEPROM: %pM\n", buf); | |
195 | return 1; | |
196 | } | |
197 | ||
198 | eth_setenv_enetaddr("ethaddr", buf); | |
199 | } | |
200 | #endif /* defined(CONFIG_HARD_I2C) */ | |
201 | ||
202 | return 0; | |
203 | } | |
204 | ||
205 | static iopin_t ioregs_init[] = { | |
206 | /* FUNC1=LPC_CS4 */ | |
207 | { | |
208 | offsetof(struct ioctrl512x, io_control_pata_ce1), 1, 0, | |
209 | IO_PIN_FMUX(1) | IO_PIN_HOLD(0) | IO_PIN_PUD(1) | | |
210 | IO_PIN_PUE(1) | IO_PIN_ST(0) | IO_PIN_DS(3) | |
211 | }, | |
212 | /* FUNC3=GPIO10 */ | |
213 | { | |
214 | offsetof(struct ioctrl512x, io_control_pata_ce2), 1, 0, | |
215 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
216 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
217 | }, | |
218 | /* FUNC1=CAN3_TX */ | |
219 | { | |
220 | offsetof(struct ioctrl512x, io_control_pata_isolate), 1, 0, | |
221 | IO_PIN_FMUX(1) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
222 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
223 | }, | |
224 | /* FUNC3=GPIO14 */ | |
225 | { | |
226 | offsetof(struct ioctrl512x, io_control_pata_iochrdy), 1, 0, | |
227 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
228 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
229 | }, | |
230 | /* FUNC2=DIU_LD22 Sets Next 2 to DIU_LD pads */ | |
231 | /* DIU_LD22-DIU_LD23 */ | |
232 | { | |
233 | offsetof(struct ioctrl512x, io_control_pci_ad31), 2, 0, | |
234 | IO_PIN_FMUX(2) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
235 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(1) | |
236 | }, | |
237 | /* FUNC2=USB1_DATA7 Sets Next 12 to USB1 pads */ | |
238 | /* USB1_DATA7-USB1_DATA0, USB1_STOP, USB1_NEXT, USB1_CLK, USB1_DIR */ | |
239 | { | |
240 | offsetof(struct ioctrl512x, io_control_pci_ad29), 12, 0, | |
241 | IO_PIN_FMUX(2) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
242 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(1) | |
243 | }, | |
244 | /* FUNC1=VIU_DATA0 Sets Next 3 to VIU_DATA pads */ | |
245 | /* VIU_DATA0-VIU_DATA2 */ | |
246 | { | |
247 | offsetof(struct ioctrl512x, io_control_pci_ad17), 3, 0, | |
248 | IO_PIN_FMUX(1) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
249 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(1) | |
250 | }, | |
251 | /* FUNC2=FEC_TXD_0 */ | |
252 | { | |
253 | offsetof(struct ioctrl512x, io_control_pci_ad14), 1, 0, | |
254 | IO_PIN_FMUX(2) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
255 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(1) | |
256 | }, | |
257 | /* FUNC1=VIU_DATA3 Sets Next 2 to VIU_DATA pads */ | |
258 | /* VIU_DATA3, VIU_DATA4 */ | |
259 | { | |
260 | offsetof(struct ioctrl512x, io_control_pci_ad13), 2, 0, | |
261 | IO_PIN_FMUX(1) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
262 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(1) | |
263 | }, | |
264 | /* FUNC2=FEC_RXD_1 Sets Next 12 to FEC pads */ | |
265 | /* FEC_RXD_1, FEC_RXD_0, FEC_RX_CLK, FEC_TX_CLK, FEC_RX_ER, FEC_RX_DV */ | |
266 | /* FEC_TX_EN, FEC_TX_ER, FEC_CRS, FEC_MDC, FEC_MDIO, FEC_COL */ | |
267 | { | |
268 | offsetof(struct ioctrl512x, io_control_pci_ad11), 12, 0, | |
269 | IO_PIN_FMUX(2) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
270 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(1) | |
271 | }, | |
272 | /* FUNC2=DIU_LD03 Sets Next 25 to DIU pads */ | |
273 | /* DIU_LD00-DIU_LD21 */ | |
274 | { | |
275 | offsetof(struct ioctrl512x, io_control_pci_cbe0), 22, 0, | |
276 | IO_PIN_FMUX(2) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
277 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(1) | |
278 | }, | |
279 | /* FUNC2=DIU_CLK Sets Next 3 to DIU pads */ | |
280 | /* DIU_CLK, DIU_VSYNC, DIU_HSYNC */ | |
281 | { | |
282 | offsetof(struct ioctrl512x, io_control_spdif_txclk), 3, 0, | |
283 | IO_PIN_FMUX(2) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
284 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(3) | |
285 | }, | |
286 | /* FUNC2=CAN3_RX */ | |
287 | { | |
288 | offsetof(struct ioctrl512x, io_control_irq1), 1, 0, | |
289 | IO_PIN_FMUX(2) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
290 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
291 | }, | |
292 | /* Sets lowest slew on 2 CAN_TX Pins*/ | |
293 | { | |
294 | offsetof(struct ioctrl512x, io_control_can1_tx), 2, 0, | |
295 | IO_PIN_FMUX(0) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
296 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
297 | }, | |
298 | /* FUNC3=CAN4_TX Sets Next 2 to CAN4 pads */ | |
299 | /* CAN4_TX, CAN4_RX */ | |
300 | { | |
301 | offsetof(struct ioctrl512x, io_control_j1850_tx), 2, 0, | |
302 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
303 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
304 | }, | |
305 | /* FUNC3=GPIO8 Sets Next 2 to GPIO pads */ | |
306 | /* GPIO8, GPIO9 */ | |
307 | { | |
308 | offsetof(struct ioctrl512x, io_control_psc0_0), 2, 0, | |
309 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
310 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
311 | }, | |
312 | /* FUNC1=FEC_TXD_1 Sets Next 3 to FEC pads */ | |
313 | /* FEC_TXD_1, FEC_TXD_2, FEC_TXD_3 */ | |
314 | { | |
315 | offsetof(struct ioctrl512x, io_control_psc0_4), 3, 0, | |
316 | IO_PIN_FMUX(1) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
317 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(3) | |
318 | }, | |
319 | /* FUNC1=FEC_RXD_3 Sets Next 2 to FEC pads */ | |
320 | /* FEC_RXD_3, FEC_RXD_2 */ | |
321 | { | |
322 | offsetof(struct ioctrl512x, io_control_psc1_4), 2, 0, | |
323 | IO_PIN_FMUX(1) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
324 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(3) | |
325 | }, | |
326 | /* FUNC3=GPIO17 */ | |
327 | { | |
328 | offsetof(struct ioctrl512x, io_control_psc2_1), 1, 0, | |
329 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
330 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
331 | }, | |
332 | /* FUNC3=GPIO2/GPT2 Sets Next 3 to GPIO pads */ | |
333 | /* GPIO2, GPIO20, GPIO21 */ | |
334 | { | |
335 | offsetof(struct ioctrl512x, io_control_psc2_4), 3, 0, | |
336 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
337 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
338 | }, | |
339 | /* FUNC2=VIU_PIX_CLK */ | |
340 | { | |
341 | offsetof(struct ioctrl512x, io_control_psc3_4), 1, 0, | |
342 | IO_PIN_FMUX(2) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
343 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(3) | |
344 | }, | |
345 | /* FUNC3=GPIO24 Sets Next 2 to GPIO pads */ | |
346 | /* GPIO24, GPIO25 */ | |
347 | { | |
348 | offsetof(struct ioctrl512x, io_control_psc4_0), 2, 0, | |
349 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
350 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
351 | }, | |
352 | /* FUNC1=NFC_CE2 */ | |
353 | { | |
354 | offsetof(struct ioctrl512x, io_control_psc4_4), 1, 0, | |
355 | IO_PIN_FMUX(1) | IO_PIN_HOLD(0) | IO_PIN_PUD(1) | | |
356 | IO_PIN_PUE(1) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
357 | }, | |
358 | /* FUNC2=VIU_DATA5 Sets Next 5 to VIU_DATA pads */ | |
359 | /* VIU_DATA5-VIU_DATA9 */ | |
360 | { | |
361 | offsetof(struct ioctrl512x, io_control_psc5_0), 5, 0, | |
362 | IO_PIN_FMUX(2) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
363 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(3) | |
364 | }, | |
365 | /* FUNC1=LPC_TSIZ1 Sets Next 2 to LPC_TSIZ pads */ | |
366 | /* LPC_TSIZ1-LPC_TSIZ2 */ | |
367 | { | |
368 | offsetof(struct ioctrl512x, io_control_psc6_0), 2, 0, | |
369 | IO_PIN_FMUX(1) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
370 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(3) | |
371 | }, | |
372 | /* FUNC1=LPC_TS */ | |
373 | { | |
374 | offsetof(struct ioctrl512x, io_control_psc6_4), 1, 0, | |
375 | IO_PIN_FMUX(1) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
376 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(3) | |
377 | }, | |
378 | /* FUNC3=GPIO16 */ | |
379 | { | |
380 | offsetof(struct ioctrl512x, io_control_psc7_0), 1, 0, | |
381 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
382 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
383 | }, | |
384 | /* FUNC3=GPIO18 Sets Next 3 to GPIO pads */ | |
385 | /* GPIO18-GPIO19, GPT7/GPIO7 */ | |
386 | { | |
387 | offsetof(struct ioctrl512x, io_control_psc7_2), 3, 0, | |
388 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
389 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
390 | }, | |
391 | /* FUNC3=GPIO0/GPT0 */ | |
392 | { | |
393 | offsetof(struct ioctrl512x, io_control_psc8_4), 1, 0, | |
394 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
395 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
396 | }, | |
397 | /* FUNC3=GPIO11 Sets Next 4 to GPIO pads */ | |
398 | /* GPIO11, GPIO2, GPIO12, GPIO13 */ | |
399 | { | |
400 | offsetof(struct ioctrl512x, io_control_psc10_3), 4, 0, | |
401 | IO_PIN_FMUX(3) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
402 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(0) | |
403 | }, | |
404 | /* FUNC2=DIU_DE */ | |
405 | { | |
406 | offsetof(struct ioctrl512x, io_control_psc11_4), 1, 0, | |
407 | IO_PIN_FMUX(2) | IO_PIN_HOLD(0) | IO_PIN_PUD(0) | | |
408 | IO_PIN_PUE(0) | IO_PIN_ST(0) | IO_PIN_DS(3) | |
409 | } | |
410 | }; | |
411 | ||
412 | int checkboard (void) | |
413 | { | |
414 | volatile immap_t *im = (immap_t *)CONFIG_SYS_IMMR; | |
415 | ||
416 | puts("Board: PDM360NG\n"); | |
417 | ||
418 | /* initialize function mux & slew rate IO inter alia on IO Pins */ | |
419 | ||
420 | iopin_initialize(ioregs_init, ARRAY_SIZE(ioregs_init)); | |
421 | ||
422 | /* initialize IO_CONTROL_GP (GPIO/GPT-mux-register) */ | |
423 | setbits_be32(&im->io_ctrl.io_control_gp, | |
424 | (1 << 0) | /* GP_MUX7->GPIO7 */ | |
425 | (1 << 5)); /* GP_MUX2->GPIO2 */ | |
426 | ||
427 | /* configure GPIO24 (VIU_CE), output/high */ | |
428 | setbits_be32(&im->gpio.gpdir, 0x80); | |
429 | setbits_be32(&im->gpio.gpdat, 0x80); | |
430 | ||
431 | return 0; | |
432 | } | |
433 | ||
7ffe3cd6 | 434 | #ifdef CONFIG_OF_BOARD_SETUP |
a3921eef AG |
435 | #ifdef CONFIG_FDT_FIXUP_PARTITIONS |
436 | struct node_info nodes[] = { | |
437 | { "fsl,mpc5121-nfc", MTD_DEV_TYPE_NAND, }, | |
438 | { "cfi-flash", MTD_DEV_TYPE_NOR, }, | |
439 | }; | |
440 | #endif | |
441 | ||
6213b8ff AG |
442 | #if defined(CONFIG_VIDEO) |
443 | /* | |
444 | * EDID block has been generated using Phoenix EDID Designer 1.3. | |
445 | * This tool creates a text file containing: | |
446 | * | |
447 | * EDID BYTES: | |
448 | * 0x 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
449 | * ------------------------------------------------ | |
450 | * 00 | 00 FF FF FF FF FF FF 00 42 C9 34 12 01 00 00 00 | |
451 | * 10 | 0A 0C 01 03 80 98 5B 78 CA 7E 50 A0 58 4E 96 25 | |
452 | * 20 | 1E 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01 | |
453 | * 30 | 01 01 01 01 01 01 80 0C 20 00 31 E0 2D 10 2A 80 | |
454 | * 40 | 12 08 30 E4 10 00 00 18 00 00 00 FD 00 38 3C 1F | |
455 | * 50 | 3C 04 0A 20 20 20 20 20 20 20 00 00 00 FF 00 50 | |
456 | * 60 | 4D 30 37 30 57 4C 33 0A 0A 0A 0A 0A 00 00 00 FF | |
457 | * 70 | 00 41 30 30 30 30 30 30 30 30 30 30 30 31 00 D4 | |
458 | * | |
459 | * Then this data has been manually converted to the char | |
460 | * array below. | |
461 | */ | |
462 | static unsigned char edid_buf[128] = { | |
463 | 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, | |
464 | 0x42, 0xC9, 0x34, 0x12, 0x01, 0x00, 0x00, 0x00, | |
465 | 0x0A, 0x0C, 0x01, 0x03, 0x80, 0x98, 0x5B, 0x78, | |
466 | 0xCA, 0x7E, 0x50, 0xA0, 0x58, 0x4E, 0x96, 0x25, | |
467 | 0x1E, 0x50, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, | |
468 | 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, | |
469 | 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x0C, | |
470 | 0x20, 0x00, 0x31, 0xE0, 0x2D, 0x10, 0x2A, 0x80, | |
471 | 0x12, 0x08, 0x30, 0xE4, 0x10, 0x00, 0x00, 0x18, | |
472 | 0x00, 0x00, 0x00, 0xFD, 0x00, 0x38, 0x3C, 0x1F, | |
473 | 0x3C, 0x04, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, | |
474 | 0x20, 0x20, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x50, | |
475 | 0x4D, 0x30, 0x37, 0x30, 0x57, 0x4C, 0x33, 0x0A, | |
476 | 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0xFF, | |
477 | 0x00, 0x41, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, | |
478 | 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x00, 0xD4, | |
479 | }; | |
480 | #endif | |
481 | ||
e895a4b0 | 482 | int ft_board_setup(void *blob, bd_t *bd) |
a3921eef AG |
483 | { |
484 | u32 val[8]; | |
485 | int rc, i = 0; | |
486 | ||
487 | ft_cpu_setup(blob, bd); | |
a3921eef AG |
488 | #ifdef CONFIG_FDT_FIXUP_PARTITIONS |
489 | fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes)); | |
490 | #endif | |
6213b8ff AG |
491 | #if defined(CONFIG_VIDEO) |
492 | fdt_add_edid(blob, "fsl,mpc5121-diu", edid_buf); | |
493 | #endif | |
a3921eef AG |
494 | |
495 | /* Fixup NOR FLASH mapping */ | |
496 | val[i++] = 0; /* chip select number */ | |
497 | val[i++] = 0; /* always 0 */ | |
498 | val[i++] = gd->bd->bi_flashstart; | |
499 | val[i++] = gd->bd->bi_flashsize; | |
500 | ||
501 | /* Fixup MRAM mapping */ | |
502 | val[i++] = 2; /* chip select number */ | |
503 | val[i++] = 0; /* always 0 */ | |
504 | val[i++] = CONFIG_SYS_MRAM_BASE; | |
505 | val[i++] = CONFIG_SYS_MRAM_SIZE; | |
506 | ||
507 | rc = fdt_find_and_setprop(blob, "/localbus", "ranges", | |
508 | val, i * sizeof(u32), 1); | |
509 | if (rc) | |
510 | printf("Unable to update localbus ranges, err=%s\n", | |
511 | fdt_strerror(rc)); | |
512 | ||
513 | /* Fixup reg property in NOR Flash node */ | |
514 | i = 0; | |
515 | val[i++] = 0; /* always 0 */ | |
516 | val[i++] = 0; /* start at offset 0 */ | |
517 | val[i++] = flash_info[0].size; /* size of Bank 0 */ | |
518 | ||
519 | /* Second Bank available? */ | |
520 | if (flash_info[1].size > 0) { | |
521 | val[i++] = 0; /* always 0 */ | |
522 | val[i++] = flash_info[0].size; /* offset of Bank 1 */ | |
523 | val[i++] = flash_info[1].size; /* size of Bank 1 */ | |
524 | } | |
525 | ||
526 | rc = fdt_find_and_setprop(blob, "/localbus/flash", "reg", | |
527 | val, i * sizeof(u32), 1); | |
528 | if (rc) | |
529 | printf("Unable to update flash reg property, err=%s\n", | |
530 | fdt_strerror(rc)); | |
e895a4b0 SG |
531 | |
532 | return 0; | |
a3921eef | 533 | } |
7ffe3cd6 | 534 | #endif /* CONFIG_OF_BOARD_SETUP */ |
a3921eef | 535 | |
a3921eef AG |
536 | /* |
537 | * If argument is NULL, set the LCD brightness to the | |
538 | * value from "brightness" environment variable. Set | |
539 | * the LCD brightness to the value specified by the | |
540 | * argument otherwise. Default brightness is zero. | |
541 | */ | |
542 | #define MAX_BRIGHTNESS 99 | |
543 | static int set_lcd_brightness(char *brightness) | |
544 | { | |
545 | struct stdio_dev *cop_port; | |
546 | char *env; | |
547 | char cmd_buf[20]; | |
548 | int val = 0; | |
549 | int cs = 0; | |
550 | int len, i; | |
551 | ||
552 | if (brightness) { | |
553 | val = simple_strtol(brightness, NULL, 10); | |
554 | } else { | |
555 | env = getenv("brightness"); | |
556 | if (env) | |
557 | val = simple_strtol(env, NULL, 10); | |
558 | } | |
559 | ||
560 | if (val < 0) | |
561 | val = 0; | |
562 | ||
563 | if (val > MAX_BRIGHTNESS) | |
564 | val = MAX_BRIGHTNESS; | |
565 | ||
566 | sprintf(cmd_buf, "$SB;%04d;", val); | |
567 | ||
568 | len = strlen(cmd_buf); | |
569 | for (i = 1; i <= len; i++) | |
570 | cs += cmd_buf[i]; | |
571 | ||
572 | cs = (~cs + 1) & 0xff; | |
573 | sprintf(cmd_buf + len, "%02X\n", cs); | |
574 | ||
575 | /* IO Coprocessor communication */ | |
576 | cop_port = open_port(4, CONFIG_SYS_PDM360NG_COPROC_BAUDRATE); | |
577 | if (!cop_port) { | |
578 | printf("Error: Can't open IO Coprocessor port.\n"); | |
579 | return -1; | |
580 | } | |
581 | ||
582 | debug("%s: cmd: %s", __func__, cmd_buf); | |
583 | write_port(cop_port, cmd_buf); | |
584 | /* | |
585 | * Wait for transmission and maybe response data | |
586 | * before closing the port. | |
587 | */ | |
588 | udelay(CONFIG_SYS_PDM360NG_COPROC_READ_DELAY); | |
589 | memset(cmd_buf, 0, sizeof(cmd_buf)); | |
590 | len = read_port(cop_port, cmd_buf, sizeof(cmd_buf)); | |
591 | if (len) | |
592 | printf("Error: %s\n", cmd_buf); | |
593 | ||
594 | close_port(4); | |
595 | ||
596 | return 0; | |
597 | } | |
598 | ||
599 | static int cmd_lcd_brightness(cmd_tbl_t *cmdtp, int flag, | |
54841ab5 | 600 | int argc, char * const argv[]) |
a3921eef | 601 | { |
47e26b1b WD |
602 | if (argc < 2) |
603 | return cmd_usage(cmdtp); | |
a3921eef AG |
604 | |
605 | return set_lcd_brightness(argv[1]); | |
606 | } | |
607 | ||
608 | U_BOOT_CMD(lcdbr, 2, 1, cmd_lcd_brightness, | |
609 | "set LCD brightness", | |
610 | "<brightness> - set LCD backlight level to <brightness>.\n" | |
611 | ); |