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