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