s5pc110: add CPU revision checking function
[kernel/u-boot.git] / board / samsung / universal / universal.c
1 /*
2  * Copyright (C) 2009 Samsung Electronics
3  * Kyungmin Park <kyungmin.park@samsung.com>
4  * Minkyu Kang <mk7.kang@samsung.com>
5  *
6  * See file CREDITS for list of people who contributed to this
7  * project.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as
11  * published by the Free Software Foundation; either version 2 of
12  * the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
22  * MA 02111-1307 USA
23  */
24
25 #include <common.h>
26 #include <i2c.h>
27 #include <asm/io.h>
28 #include <asm/arch/clk.h>
29 #include <asm/arch/clock.h>
30 #include <asm/arch/gpio.h>
31 #include <asm/arch/keypad.h>
32 #include <asm/arch/mmc.h>
33 #include <asm/arch/power.h>
34 #include <asm/arch/mem.h>
35 #include <asm/errno.h>
36 #include <fbutils.h>
37 #include <lcd.h>
38
39 DECLARE_GLOBAL_DATA_PTR;
40
41 #define C100_MACH_START                 3000
42 #define C110_MACH_START                 3100
43
44 static unsigned int board_rev;
45 static unsigned int battery_soc;
46 static struct s5pc110_gpio *s5pc110_gpio;
47
48 enum {
49         I2C_2,
50         I2C_GPIO3,
51         I2C_PMIC,
52         I2C_GPIO5,
53         I2C_GPIO6,
54         I2C_GPIO7,
55 };
56
57 /*
58  * i2c 2
59  * SDA: GPD1[4]
60  * SCL: GPD1[5]
61  */
62 static struct i2c_gpio_bus_data i2c_2 = {
63         .sda_pin        = 4,
64         .scl_pin        = 5,
65 };
66
67 /*
68  * i2c gpio3
69  * SDA: GPJ3[6]
70  * SCL: GPJ3[7]
71  */
72 static struct i2c_gpio_bus_data i2c_gpio3 = {
73         .sda_pin        = 6,
74         .scl_pin        = 7,
75 };
76
77 /*
78  * i2c pmic
79  * SDA: GPJ4[0]
80  * SCL: GPJ4[3]
81  */
82 static struct i2c_gpio_bus_data i2c_pmic = {
83         .sda_pin        = 0,
84         .scl_pin        = 3,
85 };
86
87 /*
88  * i2c gpio5
89  * SDA: MP05[3]
90  * SCL: MP05[2]
91  */
92 static struct i2c_gpio_bus_data i2c_gpio5 = {
93         .sda_pin        = 3,
94         .scl_pin        = 2,
95 };
96
97 /*
98  * i2c gpio6
99  * SDA: GPJ3[0]
100  * SCL: GPJ3[1]
101  */
102 static struct i2c_gpio_bus_data i2c_gpio6 = {
103         .sda_pin        = 0,
104         .scl_pin        = 1,
105 };
106
107 /*
108  * i2c gpio6 - cypress
109  * SDA: GPJ3[4]
110  * SCL: GPJ3[5]
111  */
112 static struct i2c_gpio_bus_data i2c_cypress_gpio6 = {
113         .sda_pin        = 4,
114         .scl_pin        = 5,
115 };
116
117 /*
118  * i2c gpio7 - cypress
119  * SDA: MP05[6]
120  * SCL: MP05[4]
121  */
122 static struct i2c_gpio_bus_data i2c_cypress_gpio7 = {
123         .sda_pin        = 6,
124         .scl_pin        = 4,
125 };
126
127 static struct i2c_gpio_bus i2c_gpio[] = {
128         {
129                 .bus    = &i2c_2,
130         }, {
131                 .bus    = &i2c_gpio3,
132         }, {
133                 .bus    = &i2c_pmic,
134         }, {
135                 .bus    = &i2c_gpio5,
136         }, {
137                 .bus    = &i2c_gpio6,
138         }, {
139                 .bus    = NULL,
140         }
141 };
142
143 u32 get_board_rev(void)
144 {
145         return board_rev;
146 }
147
148 static int hwrevision(int rev)
149 {
150         return (board_rev & 0xf) == rev;
151 }
152
153 enum {
154         MACH_UNIVERSAL,
155         MACH_TICKERTAPE,
156         MACH_AQUILA,
157         MACH_P1P2,
158         MACH_GEMINUS,
159         MACH_CYPRESS,
160 };
161
162 #define SPLIT_SCREEN_FEATURE    0x100
163
164 /* board is MACH_AQUILA and board is like below. */
165 #define J1_B2_BOARD             0x200
166 #define LIMO_UNIVERSAL_BOARD    0x400
167 #define LIMO_REAL_BOARD         0x800
168 #define MEDIA_BOARD             0x1000
169 /* board is MACH_P1P2 and board is like below. */
170 #define P1_REAL_BOARD           0x200
171 #define P2_REAL_BOARD           0x400
172
173 #define BOARD_MASK              0xF00
174
175 static int c110_machine_id(void)
176 {
177         return gd->bd->bi_arch_number - C110_MACH_START;
178 }
179
180 static int machine_is_aquila(void)
181 {
182         return c110_machine_id() == MACH_AQUILA;
183 }
184
185 static int machine_is_p1p2(void)
186 {
187         return c110_machine_id() == MACH_P1P2;
188 }
189
190 static int machine_is_tickertape(void)
191 {
192         return c110_machine_id() == MACH_TICKERTAPE;
193 }
194
195 static int machine_is_geminus(void)
196 {
197         return c110_machine_id() == MACH_GEMINUS;
198 }
199
200 static int machine_is_cypress(void)
201 {
202         return c110_machine_id() == MACH_CYPRESS;
203 }
204
205 static int board_is_limo_universal(void)
206 {
207         return machine_is_aquila() && (board_rev & LIMO_UNIVERSAL_BOARD);
208 }
209
210 static int board_is_limo_real(void)
211 {
212         return machine_is_aquila() && (board_rev & LIMO_REAL_BOARD);
213 }
214
215 static int board_is_media(void)
216 {
217         return machine_is_aquila() && (board_rev & MEDIA_BOARD);
218 }
219
220 static int board_is_j1b2(void)
221 {
222         return machine_is_aquila() && (board_rev & J1_B2_BOARD);
223 }
224
225 static int board_is_p2_real(void)
226 {
227         return machine_is_p1p2() && (board_rev & P2_REAL_BOARD);
228 }
229
230 static void enable_battery(void);
231
232 void i2c_init_board(void)
233 {
234         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
235         int num_bus;
236
237         if (cpu_is_s5pc100())
238                 return;
239
240         num_bus = ARRAY_SIZE(i2c_gpio);
241
242         if (machine_is_cypress()) {
243                 i2c_gpio[I2C_GPIO6].bus = &i2c_cypress_gpio6;
244                 i2c_gpio[I2C_GPIO7].bus = &i2c_cypress_gpio7;
245                 i2c_gpio[I2C_GPIO7].bus->gpio_base =
246                         (unsigned int)&gpio->gpio_mp0_5;
247         } else {
248                 num_bus--;
249         }
250
251         i2c_gpio[I2C_2].bus->gpio_base = (unsigned int)&gpio->gpio_d1;
252         i2c_gpio[I2C_GPIO3].bus->gpio_base = (unsigned int)&gpio->gpio_j3;
253         i2c_gpio[I2C_PMIC].bus->gpio_base = (unsigned int)&gpio->gpio_j4;
254         i2c_gpio[I2C_GPIO5].bus->gpio_base = (unsigned int)&gpio->gpio_mp0_5;
255         i2c_gpio[I2C_GPIO6].bus->gpio_base = (unsigned int)&gpio->gpio_j3;
256
257         i2c_gpio_init(i2c_gpio, num_bus, I2C_PMIC);
258
259         /* Reset on max17040 early */
260         if (battery_soc == 0)
261                 enable_battery();
262 }
263
264 #ifdef CONFIG_MISC_INIT_R
265 #define DEV_INFO_LEN            512
266 static char device_info[DEV_INFO_LEN];
267 static int display_info;
268
269 static void dprintf(const char *fmt, ...)
270 {
271         va_list args;
272         uint i;
273         char buf[128];
274
275         va_start(args, fmt);
276         i = vsprintf(buf, fmt, args);
277         va_end(args);
278
279         buf[127] = 0;
280
281         if ((strlen(device_info) + strlen(buf)) > (DEV_INFO_LEN - 1)) {
282                 puts("Flushing device info...\n");
283                 puts(device_info);
284                 device_info[0] = 0;
285         }
286         strcat(device_info, buf);
287         puts(buf);
288 }
289
290 #ifdef CONFIG_S5PC1XXFB
291 static void display_device_info(void)
292 {
293         if (!display_info)
294                 return;
295
296         init_font();
297         set_font_xy(0, 450);
298         set_font_color(FONT_WHITE);
299         fb_printf(device_info);
300         exit_font();
301
302         memset(device_info, 0x0, DEV_INFO_LEN);
303
304         udelay(5 * 1000 * 1000);
305 }
306 #endif
307
308 static const char *board_name[] = {
309         "Universal",
310         "TickerTape",
311         "Aquila",
312         "P1P2",
313         "Geminus",
314         "Cypress",
315 };
316
317 enum {
318         MEM_4G1G1G,
319         MEM_4G2G1G,
320         MEM_4G3G1G,
321         MEM_4G4G1G,
322 };
323
324 static char feature_buffer[32];
325
326 static char *display_features(int board, int board_rev)
327 {
328         int count = 0;
329         char *buf = feature_buffer;
330
331         if (board == MACH_AQUILA) {
332                 if (board_rev & SPLIT_SCREEN_FEATURE)
333                         count += sprintf(buf + count, " - SplitScreen");
334                 if (board_rev & J1_B2_BOARD)
335                         count += sprintf(buf + count, " - J1 B2 board");
336                 /* Limo Real or Universal */
337                 if (board_rev & LIMO_REAL_BOARD)
338                         count += sprintf(buf + count, " - Limo Real");
339                 else if (board_rev & LIMO_UNIVERSAL_BOARD)
340                         count += sprintf(buf + count, " - Limo Universal");
341                 if (board_rev & MEDIA_BOARD)
342                         count += sprintf(buf + count, " - Media");
343         } else if (board == MACH_P1P2) {
344                 /* P1P2 */
345                 if (board_rev & P1_REAL_BOARD)
346                         count += sprintf(buf + count, " - P1 Real");
347                 else if (board_rev & P2_REAL_BOARD)
348                         count += sprintf(buf + count, " - P2 Real");
349                 else
350                         count += sprintf(buf + count, " - Universal");
351         }
352
353         return buf;
354 }
355
356 static void check_board_revision(int board, int rev)
357 {
358         switch (board) {
359         case MACH_AQUILA:
360                 /* Limo Real or Universal */
361                 if (rev & LIMO_UNIVERSAL_BOARD)
362                         board_rev &= ~J1_B2_BOARD;
363                 if (rev & LIMO_REAL_BOARD) {
364                         board_rev &= ~(J1_B2_BOARD |
365                                         LIMO_UNIVERSAL_BOARD);
366                 }
367                 if (rev & MEDIA_BOARD)
368                         board_rev &= ~(J1_B2_BOARD |
369                                         LIMO_UNIVERSAL_BOARD);
370                 break;
371         case MACH_P1P2:
372                 break;
373         case MACH_CYPRESS:
374                 /* There's no HWREV_MODE3 */
375                 board_rev &= ~(1 << 3);
376                 /* Fall through */
377         case MACH_TICKERTAPE:
378         case MACH_GEMINUS:
379                 board_rev &= ~BOARD_MASK;
380                 break;
381         default:
382                 break;
383         }
384 }
385
386 static unsigned int get_hw_revision(struct s5pc1xx_gpio_bank *bank)
387 {
388         unsigned int rev;
389
390         gpio_direction_input(bank, 1);
391         gpio_direction_input(bank, 2);
392         gpio_direction_input(bank, 3);
393         gpio_direction_input(bank, 4);
394
395         gpio_set_pull(bank, 1, GPIO_PULL_NONE);         /* HWREV_MODE3 */
396         gpio_set_pull(bank, 2, GPIO_PULL_NONE);         /* HWREV_MODE0 */
397         gpio_set_pull(bank, 3, GPIO_PULL_NONE);         /* HWREV_MODE1 */
398         gpio_set_pull(bank, 4, GPIO_PULL_NONE);         /* HWREV_MODE2 */
399
400         rev = gpio_get_value(bank, 2);
401         rev |= (gpio_get_value(bank, 3) << 1);
402         rev |= (gpio_get_value(bank, 4) << 2);
403         rev |= (gpio_get_value(bank, 1) << 3);
404
405         return rev;
406 }
407
408 static void check_hw_revision(void)
409 {
410         unsigned int board = MACH_UNIVERSAL;    /* Default is Universal */
411
412         if (cpu_is_s5pc100()) {
413                 struct s5pc100_gpio *gpio =
414                         (struct s5pc100_gpio *)S5PC100_GPIO_BASE;
415
416                 board_rev = get_hw_revision(&gpio->gpio_j0);
417
418                 /* C100 TickerTape */
419                 if (board_rev == 3)
420                         board = MACH_TICKERTAPE;
421         } else {
422                 struct s5pc110_gpio *gpio =
423                         (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
424
425                 board_rev = get_hw_revision(&gpio->gpio_j0);
426
427                 /*
428                  * Note Check 'Aquila' board first
429                  *
430                  * TT: TickerTape
431                  * SS: SplitScreen
432                  * LRA: Limo Real Aquila
433                  * LUA: Limo Universal Aquila
434                  * OA: Old Aquila
435                  * P1P2: Smart Book
436                  * CYP: Cypress
437                  *
438                  * ADDR = 0xE0200000 + OFF
439                  *
440                  *       OFF    Universal LRA  LUA  OA   TT   SS        P1P2 CYP
441                  *   J1: 0x0264 0x10      0x00 0x00 0x00 0x00 0x00      0x00
442                  *   H1: 0x0C24    W      0x28 0xA8 0x1C                0x18 0x0F
443                  *   H3: 0x0C64           0x03 0x07 0x0F                0xff
444                  *   D1: 0x00C4 0x0F      0x3F 0x3F 0x0F 0xXC 0x3F
445                  *    I: 0x0224                     0x02 0x00 0x08
446                  * MP03: 0x0324                     0x9x      0xbx 0x9x
447                  * MP05: 0x0364                     0x80      0x88
448                  */
449
450                 /* C110 Aquila */
451                 if (gpio_get_value(&gpio->gpio_j1, 4) == 0) {
452                         board = MACH_AQUILA;
453                         board_rev |= J1_B2_BOARD;
454
455                         gpio_set_pull(&gpio->gpio_j2, 6, GPIO_PULL_NONE);
456                         gpio_direction_input(&gpio->gpio_j2, 6);
457
458                         /* Check board */
459                         if (gpio_get_value(&gpio->gpio_h1, 2) == 0)
460                                 board_rev |= LIMO_UNIVERSAL_BOARD;
461
462                         if (gpio_get_value(&gpio->gpio_h3, 2) == 0)
463                                 board_rev |= LIMO_REAL_BOARD;
464
465                         if (gpio_get_value(&gpio->gpio_j2, 6) == 1)
466                                 board_rev |= MEDIA_BOARD;
467
468                         /* set gpio to default value. */
469                         gpio_set_pull(&gpio->gpio_j2, 6, GPIO_PULL_DOWN);
470                         gpio_direction_output(&gpio->gpio_j2, 6, 0);
471                 }
472                 /* Workaround: C110 Aquila Rev0.6 */
473                 if (board_rev == 6) {
474                         board = MACH_AQUILA;
475                         board_rev |= LIMO_REAL_BOARD;
476                 }
477
478                 /* C110 TickerTape */
479                 if (gpio_get_value(&gpio->gpio_d1, 0) == 0 &&
480                                 gpio_get_value(&gpio->gpio_d1, 1) == 0)
481                         board = MACH_TICKERTAPE;
482
483                 /* C110 Cypress: Do first this than P1P2 */
484                 gpio_set_pull(&gpio->gpio_j2, 2, GPIO_PULL_NONE);
485                 gpio_direction_input(&gpio->gpio_j2, 2);
486                 if (gpio_get_value(&gpio->gpio_j2, 2) == 1)
487                         board = MACH_CYPRESS;
488                 gpio_set_pull(&gpio->gpio_j2, 2, GPIO_PULL_DOWN);
489
490                 /* C110 P1P2 */
491                 if (gpio_get_value(&gpio->gpio_h3, 7) == 1) {
492                         board = MACH_P1P2;
493                         board_rev &= ~BOARD_MASK;
494                 }
495
496                 /* set gpio configuration for P1P2. */
497                 gpio_direction_input(&gpio->gpio_j0, 6);
498                 gpio_direction_input(&gpio->gpio_j0, 7);
499
500                 /*
501                  * do not change order below
502                  * because it needs delay to get gpio value.
503                  */
504                 /* HWREV_MODE4 */
505                 gpio_set_pull(&gpio->gpio_j0, 7, GPIO_PULL_NONE);
506                 /* HWREV_MODE5 */
507                 gpio_set_pull(&gpio->gpio_j0, 6, GPIO_PULL_NONE);
508
509                 if (gpio_get_value(&gpio->gpio_j0, 7) == 1) {
510                         board = MACH_P1P2;
511                         board_rev &= ~BOARD_MASK;
512                         if (gpio_get_value(&gpio->gpio_j0, 6) == 1)
513                                 board_rev |= P1_REAL_BOARD;
514                         if (gpio_get_value(&gpio->gpio_j0, 6) == 0)
515                                 board_rev |= P2_REAL_BOARD;
516                 }
517
518                 /* set gpio to default value. */
519                 /* HWREV_MODE4 */
520                 gpio_set_pull(&gpio->gpio_j0, 6, GPIO_PULL_DOWN);
521                 /* HWREV_MODE5 */
522                 gpio_set_pull(&gpio->gpio_j0, 7, GPIO_PULL_DOWN);
523
524                 /* C110 Geminus for rev0.0 */
525                 gpio_set_pull(&gpio->gpio_j1, 2, GPIO_PULL_NONE);
526                 gpio_direction_input(&gpio->gpio_j1, 2);
527                 if (gpio_get_value(&gpio->gpio_j1, 2) == 1) {
528                         board = MACH_GEMINUS;
529                         if ((board_rev & ~BOARD_MASK) == 3)
530                                 board_rev &= ~0xff;
531                 }
532                 gpio_set_pull(&gpio->gpio_j1, 2, GPIO_PULL_DOWN);
533                 gpio_direction_output(&gpio->gpio_j1, 2, 0);
534
535                 /* C110 Geminus for rev0.1 ~ */
536                 gpio_set_pull(&gpio->gpio_j0, 6, GPIO_PULL_NONE);
537                 gpio_direction_input(&gpio->gpio_j0, 6);
538                 if (gpio_get_value(&gpio->gpio_j0, 6) == 1)
539                         board = MACH_GEMINUS;
540                 gpio_set_pull(&gpio->gpio_j0, 6, GPIO_PULL_DOWN);
541         }
542
543         /* Set machine id */
544         if (cpu_is_s5pc110())
545                 gd->bd->bi_arch_number = C110_MACH_START + board;
546         else
547                 gd->bd->bi_arch_number = C100_MACH_START + board;
548
549         /* Architecture Common settings */
550         if (cpu_is_s5pc110()) {
551                 setenv("mtdparts", MTDPARTS_DEFAULT_4KB);
552         } else {
553                 setenv("bootk", "onenand read 0x30007FC0 0x60000 0x300000; "
554                                 "bootm 0x30007FC0");
555                 setenv("updatek", "onenand erase 0x60000 0x300000; "
556                                   "onenand write 0x31008000 0x60000 0x300000");
557         }
558 }
559
560 static void show_hw_revision(void)
561 {
562         int board;
563
564         /*
565          * Workaround for Rev 0.3 + CP Ver ES 3.1
566          * it's Rev 0.4
567          */
568         if (board_is_limo_real()) {
569                 if (hwrevision(0)) {
570                         /* default is Rev 0.4 */
571                         board_rev &= ~0xf;
572                         board_rev |= 0x4;
573                 }
574         }
575
576         if (cpu_is_s5pc110())
577                 board = gd->bd->bi_arch_number - C110_MACH_START;
578         else
579                 board = gd->bd->bi_arch_number - C100_MACH_START;
580
581         check_board_revision(board, board_rev);
582
583         /* Set CPU Revision */
584         if (board_is_limo_real()) {
585                 if ((board_rev & 0xf) < 8)
586                         s5pc1xx_set_cpu_rev(0);
587         } else {
588                 s5pc1xx_set_cpu_rev(0);
589         }
590
591         dprintf("HW Revision:\t%x (%s%s)\n", board_rev, board_name[board],
592                 display_features(board, board_rev));
593 }
594
595 static void check_auto_burn(void)
596 {
597         unsigned long magic_base = CONFIG_SYS_SDRAM_BASE + 0x02000000;
598         unsigned int count = 0;
599         char buf[64];
600
601         if (readl(magic_base) == 0x426f6f74) {  /* ASICC: Boot */
602                 printf("Auto burning bootloader\n");
603                 count += sprintf(buf + count, "run updateb; ");
604         }
605         if (readl(magic_base + 0x04) == 0x4b65726e) {   /* ASICC: Kern */
606                 printf("Auto burning kernel\n");
607                 count += sprintf(buf + count, "run updatek; ");
608         }
609
610         if (count) {
611                 count += sprintf(buf + count, "reset");
612                 setenv("bootcmd", buf);
613         }
614
615         /* Clear the magic value */
616         writel(0xa5a55a5a, magic_base);
617         writel(0xa5a55a5a, magic_base + 0x4);
618 }
619
620 static void pmic_pin_init(void)
621 {
622         unsigned int reg, value;
623
624         if (cpu_is_s5pc100())
625                 return;
626
627         /* AP_PS_HOLD: XEINT_0: GPH0[0]
628          * Note: Don't use GPIO PS_HOLD it doesn't work
629          */
630         reg = S5PC110_PS_HOLD_CONTROL;
631         value = readl(reg);
632         value |= S5PC110_PS_HOLD_DIR_OUTPUT |
633                 S5PC110_PS_HOLD_DATA_HIGH |
634                 S5PC110_PS_HOLD_OUT_EN;
635         writel(value, reg);
636
637         /* nPOWER: XEINT_22: GPH2[6] interrupt mode */
638         gpio_cfg_pin(&s5pc110_gpio->gpio_h2, 6, GPIO_IRQ);
639         gpio_set_pull(&s5pc110_gpio->gpio_h2, 6, GPIO_PULL_UP);
640 }
641
642 static void enable_ldos(void)
643 {
644         if (cpu_is_s5pc100())
645                 return;
646
647         if (machine_is_p1p2())
648                 return;
649
650         /* TOUCH_EN: XMMC3DATA_3: GPG3[6] output high */
651         gpio_direction_output(&s5pc110_gpio->gpio_g3, 6, 1);
652 }
653
654 static void enable_t_flash(void)
655 {
656         if (!(board_is_limo_universal() || board_is_limo_real()))
657                 return;
658
659         /* T_FLASH_EN : XM0ADDR_13: MP0_5[4] output high */
660         gpio_direction_output(&s5pc110_gpio->gpio_mp0_5, 4, 1);
661 }
662
663 static void setup_limo_real_gpios(void)
664 {
665         if (!board_is_limo_real())
666                 return;
667
668         /*
669          * Note: Please write GPIO alphabet order
670          */
671         /* CODEC_LDO_EN: XVVSYNC_LDI: GPF3[4] output high */
672         gpio_direction_output(&s5pc110_gpio->gpio_f3, 4, 1);
673
674         if (hwrevision(0))
675                 /* RESET_REQ_N: XM0BEN_1: MP0_2[1] output high */
676                 gpio_direction_output(&s5pc110_gpio->gpio_mp0_2, 1, 1);
677         else
678                 /* RESET_REQ_N: XM0CSn_2: MP0_1[2] output high */
679                 gpio_direction_output(&s5pc110_gpio->gpio_mp0_1, 2, 1);
680
681         /* T_FLASH_DETECT: EINT28: GPH3[4] interrupt mode */
682         gpio_cfg_pin(&s5pc110_gpio->gpio_h3, 4, GPIO_IRQ);
683         gpio_set_pull(&s5pc110_gpio->gpio_h3, 4, GPIO_PULL_UP);
684 }
685
686 static void setup_media_gpios(void)
687 {
688         if (!board_is_media())
689                 return;
690
691         /*
692          * Note: Please write GPIO alphabet order
693          */
694         /* RESET_REQ_N: XM0CSn_2: MP0_1[2] output high */
695         gpio_direction_output(&s5pc110_gpio->gpio_mp0_1, 2, 1);
696
697         /* T_FLASH_DETECT: EINT28: GPH3[4] interrupt mode */
698         gpio_cfg_pin(&s5pc110_gpio->gpio_h3, 4, GPIO_IRQ);
699         gpio_set_pull(&s5pc110_gpio->gpio_h3, 4, GPIO_PULL_UP);
700 }
701
702 static void setup_p1p2_gpios(void)
703 {
704         if (!machine_is_p1p2())
705                 return;
706
707         /*
708          * Note: Please write GPIO alphabet order
709          */
710         /* RESET_REQ_N: XM0FRnB[1]: MP0_3[5] output high */
711         gpio_direction_output(&s5pc110_gpio->gpio_mp0_3, 5, 1);
712         /* CODEC_LDO_EN: XM0FRnB[2]: MP0_3[6] output high */
713         gpio_direction_output(&s5pc110_gpio->gpio_mp0_3, 6, 1);
714 }
715
716 #define KBR3            (1 << 3)
717 #define KBR2            (1 << 2)
718 #define KBR1            (1 << 1)
719 #define KBR0            (1 << 0)
720
721 static void check_p2_keypad(void)
722 {
723         unsigned int auto_download = 0;
724         unsigned char addr = 0x34, val[2];      /* adp5587 key controller */
725         int i, ret;
726         i2c_set_bus_num(I2C_2);
727
728         if (i2c_probe(addr)) {
729                 printf("Can't found adp5587 key controller\n");
730                 return;
731         }
732         /* Row 8, Column 10 */
733         val[0] = 0xf;
734         ret = i2c_write(addr, 0x1D, 1, val, 1);         /* Set KP_GPIO1 */
735         val[0] = 0xf;
736         ret |= i2c_write(addr, 0x1E, 1, val, 1);        /* Set KP_GPIO2 */
737         val[0] = 0x3;
738         ret |= i2c_write(addr, 0x1F, 1, val, 1);        /* Set KP_GPIO3 */
739         val[0] = 0x3f;          /* CMP2_INT | CMP1_INT | OVR_FLOW_INT |
740                                    K_LCK_INT | GPI_INT | KE_INT */
741         ret |= i2c_write(addr, 0x02, 1, val, 1);        /* Status is W1C */
742         val[0] = 0x19;          /* INT_CFG | OVR_FLOW_IEN | KE_IEN */
743         ret |= i2c_write(addr, 0x01, 1, val, 1);
744         for (i = 0; i < 10; i++) {
745                 udelay(1000);           /* FIXME */
746                 i2c_read(addr, 0x04 + i, 1, val, 1);
747                 if (val[0] == 0x94)
748                         auto_download = 1;
749         }
750
751         if (auto_download == 1)
752                 setenv("bootcmd", "usbdown");
753 }
754
755 static void check_keypad(void)
756 {
757         unsigned int reg, value;
758         unsigned int col_mask, row_mask;
759         unsigned int auto_download = 0;
760         unsigned int col_value[4], i;
761
762         if (cpu_is_s5pc100()) {
763                 struct s5pc100_gpio *gpio =
764                         (struct s5pc100_gpio *)S5PC100_GPIO_BASE;
765
766                 /* Set GPH2[2:0] to KP_COL[2:0] */
767                 gpio_cfg_pin(&gpio->gpio_h2, 0, 0x3);
768                 gpio_cfg_pin(&gpio->gpio_h2, 1, 0x3);
769                 gpio_cfg_pin(&gpio->gpio_h2, 2, 0x3);
770
771                 /* Set GPH3[2:0] to KP_ROW[2:0] */
772                 gpio_cfg_pin(&gpio->gpio_h3, 0, 0x3);
773                 gpio_cfg_pin(&gpio->gpio_h3, 1, 0x3);
774                 gpio_cfg_pin(&gpio->gpio_h3, 2, 0x3);
775
776                 reg = S5PC100_KEYPAD_BASE;
777         } else {
778                 if (board_is_limo_real() || board_is_limo_universal()) {
779                         row_mask = 0x00FF;
780                         col_mask = 0x0FFF;
781                 } else {
782                         row_mask = 0xFFFF;
783                         col_mask = 0xFFFF;
784                 }
785
786                 for (i = 0; i < 4; i++) {
787                         /* Set GPH3[3:0] to KP_ROW[3:0] */
788                         if (row_mask & (0xF << (i << 2))) {
789                                 gpio_cfg_pin(&s5pc110_gpio->gpio_h3, i, 0x3);
790                                 if (!machine_is_p1p2())
791                                         gpio_set_pull(&s5pc110_gpio->gpio_h3,
792                                                         i, GPIO_PULL_UP);
793                         }
794
795                         /* Set GPH2[3:0] to KP_COL[3:0] */
796                         if (col_mask & (0xF << (i << 2)))
797                                 gpio_cfg_pin(&s5pc110_gpio->gpio_h2, i, 0x3);
798                         if (machine_is_p1p2())
799                                 gpio_set_pull(&s5pc110_gpio->gpio_h2, i, GPIO_PULL_UP);
800                 }
801
802                 reg = S5PC110_KEYPAD_BASE;
803         }
804         /* init col */
805         value = 0x00;
806         writel(value, reg + S5PC1XX_KEYIFCOL_OFFSET);
807         value = readl(reg + S5PC1XX_KEYIFROW_OFFSET);
808         /* VOLUMEDOWN and CAM(Half shot) Button */
809         if ((value & KBR1) == 0) {
810                 i = 0;
811                 while (i < 4) {
812                         value = readl(reg + S5PC1XX_KEYIFCOL_OFFSET);
813                         value |= 0xff;
814                         value &= ~(1 << i);
815                         writel(value, reg + S5PC1XX_KEYIFCOL_OFFSET);
816                         udelay(10*1000);
817                         col_value[i++] = readl(reg + S5PC1XX_KEYIFROW_OFFSET);
818                 }
819                 writel(0x00, reg + S5PC1XX_KEYIFCOL_OFFSET);
820
821                 /* expected value is row_value[0] = 0x00 row_value[1] = 0x01 */
822                 /* workaround */
823                 if ((col_value[0] & 0x3) == 0x3 && (col_value[1] & 0x3) == 0x3)
824                         auto_download = 1;
825
826                 if ((col_value[0] & 0x3) == 0x3 && (col_value[1] & 0x3) != 0x3)
827                         display_info = 1;
828                 if (machine_is_p1p2()) {
829                         if ((col_value[0] & 0xd) == 0xd)
830                                 auto_download = 1;
831                 }
832         }
833
834         if (auto_download)
835                 setenv("bootcmd", "usbdown");
836 }
837
838 static void enable_battery(void)
839 {
840         unsigned char val[2];
841         unsigned char addr = 0x36;      /* max17040 fuel gauge */
842
843         if (machine_is_aquila()) {
844                 if (board_is_j1b2())
845                         return;
846         }
847
848         if (machine_is_tickertape())
849                 return;
850
851         if (machine_is_cypress())
852                 i2c_set_bus_num(I2C_GPIO7);
853         else
854                 i2c_set_bus_num(I2C_GPIO3);
855
856         if (i2c_probe(addr)) {
857                 printf("Can't found max17040 fuel gauge\n");
858                 return;
859         }
860
861         val[0] = 0x54;
862         val[1] = 0x00;
863         i2c_write(addr, 0xfe, 1, val, 2);
864 }
865
866 static void check_battery(void)
867 {
868         unsigned char val[2];
869         unsigned char addr = 0x36;      /* max17040 fuel gauge */
870
871         if (machine_is_aquila()) {
872                 if (board_is_j1b2())
873                         return;
874         }
875
876         if (machine_is_tickertape())
877                 return;
878
879         if (machine_is_cypress())
880                 i2c_set_bus_num(I2C_GPIO7);
881         else
882                 i2c_set_bus_num(I2C_GPIO3);
883
884         if (i2c_probe(addr)) {
885                 printf("Can't found max17040 fuel gauge\n");
886                 return;
887         }
888
889         i2c_read(addr, 0x04, 1, val, 1);
890
891         dprintf("battery:\t%d%%\n", val[0]);
892
893         battery_soc = val[0];
894 }
895
896 static void check_mhl(void)
897 {
898         unsigned char val[2];
899         unsigned char addr = 0x39;      /* SIL9230 */
900
901         /* MHL Power enable */
902         /* HDMI_EN : GPJ2[2] XMSMDATA_2 output mode */
903         gpio_direction_output(&s5pc110_gpio->gpio_j2, 2, 1);
904
905         /* MHL_RST : MP0_4[7] XM0ADDR_7 output mode */
906         gpio_direction_output(&s5pc110_gpio->gpio_mp0_4, 7, 0);
907
908         /* 10ms required after reset */
909         udelay(10000);
910
911         /* output enable */
912         gpio_set_value(&s5pc110_gpio->gpio_mp0_4, 7, 1);
913
914         i2c_set_bus_num(I2C_GPIO5);
915
916         /* set usb path */
917         if (i2c_probe(addr)) {
918                 printf("Can't found MHL Chip\n");
919                 return;
920         }
921
922         /*
923          * System Control #1
924          * set to Normal operation
925          */
926         val[0] = 0x35;
927         i2c_write((0x72 >> 1), 0x08, 1, val, 1);
928         i2c_read((0x72 >> 1), 0x08, 1, val, 1);
929
930         /*
931          * MHL TX Control #1
932          * TERM_MODE [7:6]
933          * 00 = MHL termination ON
934          * 11 = MHL termination OFF
935          */
936         val[0] = 0xd0;
937         i2c_write((0x72 >> 1), 0xa0, 1, val, 1);
938         i2c_read((0x72 >> 1), 0xa0, 1, val, 1);
939 }
940
941 static void into_charge_mode(void)
942 {
943         unsigned char addr = 0xCC >> 1; /* max8998 */;
944         unsigned char val[2];
945         unsigned int level;
946         int i, j;
947
948         i2c_set_bus_num(I2C_PMIC);
949
950         if (i2c_probe(addr)) {
951                 printf("Can't found max8998\n");
952                 return;
953         }
954
955         printf("Charge Mode\n");
956
957         i2c_read(addr, 0x0C, 1, val, 1);
958         val[0] &= ~(0x7 << 0);
959         val[0] |= 5;            /* 600mA */
960         i2c_write(addr, 0x0C, 1, val, 1);
961
962 #ifdef CONFIG_S5PC1XXFB
963         /* TODO: change to Image animation */
964         init_font();
965         set_font_xy(0, 0);
966         set_font_color(FONT_WHITE);
967         fb_printf("charging");
968
969         level = battery_soc / 25;
970
971         for (i = 0; i < 3; i++) {
972                 if (level == 0)
973                         udelay(1 * 1000 * 1000);
974
975                 for (j = 0; j < 4; j++) {
976                         fb_printf("..");
977
978                         if (j >= level)
979                                 udelay(1 * 1000 * 1000);
980                 }
981
982                 if (level <= 4)
983                         udelay(1 * 1000 * 1000);
984
985                 set_font_xy(0, 0);
986                 set_font_color(FONT_XOR);
987                 fb_printf("charging........");
988
989                 set_font_xy(0, 0);
990                 set_font_color(FONT_WHITE);
991                 fb_printf("charging");
992         }
993
994         exit_font();
995 #endif
996
997         run_command("sleep 1", 0);
998 }
999
1000 static void check_micro_usb(int intr)
1001 {
1002         unsigned char addr;
1003         unsigned char val[2];
1004
1005         if (cpu_is_s5pc100())
1006                 return;
1007
1008         if (board_is_limo_real()) {
1009                 if (hwrevision(0) || hwrevision(1))
1010                         return;
1011         }
1012
1013         if (machine_is_cypress())
1014                 i2c_set_bus_num(I2C_GPIO6);
1015         else
1016                 i2c_set_bus_num(I2C_PMIC);
1017
1018         addr = 0x25;            /* fsa9480 */
1019         if (i2c_probe(addr)) {
1020                 printf("Can't found fsa9480\n");
1021                 return;
1022         }
1023
1024         /* Clear Interrupt */
1025         if (intr) {
1026                 i2c_read(addr, 0x03, 1, val, 2);
1027                 udelay(500 * 1000);
1028         }
1029
1030         /* Read Device Type 1 */
1031         i2c_read(addr, 0x0a, 1, val, 1);
1032
1033 #define FSA_DEDICATED_CHARGER   (1 << 6)
1034 #define FSA_UART                (1 << 3)
1035 #define FSA_USB                 (1 << 2)
1036
1037         /*
1038          * If USB, use default 475mA
1039          * If Charger, use 600mA and go to charge mode
1040          */
1041         if (val[0] & FSA_DEDICATED_CHARGER)
1042                 into_charge_mode();
1043
1044         /* If Factory Mode is Boot ON-USB, go to download mode */
1045         i2c_read(addr, 0x07, 1, val, 1);
1046
1047 #define FSA_ADC_FAC_USB         0x19
1048 #define FSA_ADC_FAC_UART        0x1d
1049
1050         if (val[0] == FSA_ADC_FAC_USB)
1051                 setenv("bootcmd", "usbdown");
1052 }
1053
1054 #define MAX8998_REG_ONOFF1      0x11
1055 #define MAX8998_REG_ONOFF2      0x12
1056 #define MAX8998_REG_ONOFF3      0x13
1057 #define MAX8998_LDO3            (1 << 2)
1058 #define MAX8998_LDO10           (1 << 3)
1059 #define MAX8998_LDO11           (1 << 2)
1060 #define MAX8998_LDO12           (1 << 1)
1061 #define MAX8998_LDO13           (1 << 0)
1062 #define MAX8998_LDO14           (1 << 7)
1063 #define MAX8998_LDO15           (1 << 6)
1064 #define MAX8998_LDO16           (1 << 5)
1065 #define MAX8998_LDO17           (1 << 4)
1066
1067 static void init_pmic(void)
1068 {
1069         unsigned char addr;
1070         unsigned char val[2];
1071
1072         if (cpu_is_s5pc100())
1073                 return;
1074
1075         i2c_set_bus_num(I2C_PMIC);
1076
1077         addr = 0xCC >> 1;       /* max8998 */
1078         if (i2c_probe(addr)) {
1079                 printf("Can't found max8998\n");
1080                 return;
1081         }
1082
1083         /* ONOFF1 */
1084         i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1085         val[0] &= ~MAX8998_LDO3;
1086         i2c_write(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1087
1088         /* ONOFF2 */
1089         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1090         /*
1091          * Disable LDO10(VPLL_1.1V), LDO11(CAM_IO_2.8V),
1092          * LDO12(CAM_ISP_1.2V), LDO13(CAM_A_2.8V)
1093          */
1094         val[0] &= ~(MAX8998_LDO10 | MAX8998_LDO11 |
1095                         MAX8998_LDO12 | MAX8998_LDO13);
1096         val[0] |= (1 << 7);
1097         i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1098         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1099         /* ONOFF3 */
1100         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1101         /*
1102          * Disable LDO14(CAM_CIF_1.8), LDO15(CAM_AF_3.3V),
1103          * LDO16(VMIPI_1.8V), LDO17(CAM_8M_1.8V)
1104          */
1105         val[0] &= ~(MAX8998_LDO14 | MAX8998_LDO15 |
1106                         MAX8998_LDO16 | MAX8998_LDO17);
1107         i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1108         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1109 }
1110
1111 #define PDN_MASK(x)             (0x3 << ((x) << 1))
1112
1113 #define CON_INPUT(x)            (0x0 << ((x) << 2))
1114 #define CON_OUTPUT(x)           (0x1 << ((x) << 2))
1115 #define CON_IRQ(x)              (0xf << ((x) << 2))
1116
1117 #define DAT_SET(x)              (0x1 << (x))
1118 #define DAT_CLEAR(x)            (0x0 << (x))
1119
1120 #define OUTPUT0(x)              (0x0 << ((x) << 1))
1121 #define OUTPUT1(x)              (0x1 << ((x) << 1))
1122 #define INPUT(x)                (0x2 << ((x) << 1))
1123
1124 #define PULL_DIS(x)             (0x0 << ((x) << 1))
1125 #define PULL_DOWN(x)            (0x1 << ((x) << 1))
1126 #define PULL_UP(x)              (0x2 << ((x) << 1))
1127
1128 #define PREVIOUS(x)             (0x3 << ((x) << 1))
1129
1130 struct gpio_powermode {
1131         unsigned int    conpdn;
1132         unsigned int    pudpdn;
1133 };
1134
1135 struct gpio_external {
1136         unsigned int    con;
1137         unsigned int    dat;
1138         unsigned int    pud;
1139 };
1140
1141 static struct gpio_powermode powerdown_modes[] = {
1142         {       /* S5PC110_GPIO_A0_OFFSET */
1143                 INPUT(0) | OUTPUT0(1) | INPUT(2) | OUTPUT0(3) |
1144                 INPUT(4) | OUTPUT0(5) | INPUT(6) | OUTPUT0(7),
1145                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1146                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1147         }, {    /* S5PC110_GPIO_A1_OFFSET */
1148                 INPUT(0) | OUTPUT0(1) | INPUT(2) | OUTPUT0(3),
1149                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3),
1150         }, {    /* S5PC110_GPIO_B_OFFSET */
1151                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1152                 INPUT(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1153                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1154                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1155         }, {    /* S5PC110_GPIO_C0_OFFSET */
1156                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1157                 OUTPUT0(4),
1158                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1159                 PULL_DIS(4),
1160         }, {    /* S5PC110_GPIO_C1_OFFSET */
1161                 /* OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1162                 OUTPUT0(4), */
1163                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1164                 OUTPUT0(4),
1165                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1166                 PULL_DIS(4),
1167         }, {    /* S5PC110_GPIO_D0_OFFSET */
1168                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3),
1169                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3),
1170         }, {    /* S5PC110_GPIO_D1_OFFSET */
1171                 INPUT(0) | INPUT(1) | INPUT(2) | INPUT(3) |
1172                 INPUT(4) | INPUT(5),
1173                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1174                 PULL_DIS(4) | PULL_DIS(5),
1175         }, {    /* S5PC110_GPIO_E0_OFFSET */
1176                 INPUT(0) | INPUT(1) | INPUT(2) | INPUT(3) |
1177                 INPUT(4) | INPUT(5) | INPUT(6) | INPUT(7),
1178                 PULL_DOWN(0) | PULL_DOWN(1) | PULL_DOWN(2) | PULL_DOWN(3) |
1179                 PULL_DOWN(4) | PULL_DOWN(5) | PULL_DOWN(6) | PULL_DOWN(7),
1180         }, {    /* S5PC110_GPIO_E1_OFFSET */
1181                 INPUT(0) | INPUT(1) | INPUT(2) | OUTPUT0(3) |
1182                 OUTPUT0(4),
1183                 PULL_DOWN(0) | PULL_DOWN(1) | PULL_DOWN(2) | PULL_DIS(3) |
1184                 PULL_DIS(4),
1185         }, {    /* S5PC110_GPIO_F0_OFFSET */
1186                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1187                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1188                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1189                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1190         }, {    /* S5PC110_GPIO_F1_OFFSET */
1191                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1192                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1193                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1194                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1195         }, {    /* S5PC110_GPIO_F2_OFFSET */
1196                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1197                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1198                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1199                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1200         }, {    /* S5PC110_GPIO_F3_OFFSET */
1201                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1202                 OUTPUT0(4) | OUTPUT0(5),
1203                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1204                 PULL_DIS(4) | PULL_DIS(5),
1205         }, {    /* S5PC110_GPIO_G0_OFFSET */
1206                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1207                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1208                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1209                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1210         }, {    /* S5PC110_GPIO_G1_OFFSET */
1211                 OUTPUT0(0) | INPUT(1) | OUTPUT0(2) | INPUT(3) |
1212                 INPUT(4) | INPUT(5) | INPUT(6),
1213                 PULL_DIS(0) | PULL_UP(1) | PULL_DIS(2) | PULL_UP(3) |
1214                 PULL_UP(4) | PULL_UP(5) | PULL_UP(6),
1215         }, {    /* S5PC110_GPIO_G2_OFFSET */
1216                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1217                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1218                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1219                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1220         }, {    /* S5PC110_GPIO_G3_OFFSET */
1221                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT1(2) | INPUT(3) |
1222                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1223                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1224                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1225         }, {    /* S5PC110_GPIO_I_OFFSET */
1226                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1227                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1228                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1229                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1230         }, {    /* S5PC110_GPIO_J0_OFFSET */
1231                 OUTPUT1(0) | OUTPUT0(1) | INPUT(2) | INPUT(3) |
1232                 INPUT(4) | INPUT(5) | OUTPUT0(6) | OUTPUT0(7),
1233                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1234                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1235         }, {    /* S5PC110_GPIO_J1_OFFSET */
1236                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1237                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1238                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1239                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1240         }, {    /* S5PC110_GPIO_J2_OFFSET */
1241                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1242                 INPUT(4) | OUTPUT0(5) | OUTPUT0(6) | INPUT(7),
1243                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1244                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DOWN(7),
1245         }, {    /* S5PC110_GPIO_J3_OFFSET */
1246                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1247                 OUTPUT1(4) | OUTPUT0(5) | INPUT(6) | INPUT(7),
1248                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1249                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1250         }, {    /* S5PC110_GPIO_J4_OFFSET */
1251                 INPUT(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1252                 OUTPUT0(4),
1253                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1254                 PULL_DIS(4),
1255         },
1256 };
1257
1258 static struct gpio_external external_powerdown_modes[] = {
1259         {       /* S5PC110_GPIO_H0_OFFSET */
1260                 CON_OUTPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_OUTPUT(3) |
1261                 CON_OUTPUT(4) | CON_OUTPUT(5) | CON_INPUT(6) | CON_INPUT(7),
1262                 DAT_SET(0) | DAT_CLEAR(2) | DAT_CLEAR(3) |
1263                 DAT_CLEAR(4) | DAT_CLEAR(5),
1264                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1265                 PULL_DIS(4) | PULL_DIS(5),
1266         }, {    /* S5PC110_GPIO_H1_OFFSET */
1267                 /* CON_INPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_IRQ(3) |
1268                 CON_IRQ(4) | CON_INPUT(5) | CON_INPUT(6) | CON_INPUT(7),
1269                 DAT_CLEAR(2),
1270                 PULL_DOWN(0) | PULL_DOWN(1) |
1271                 PULL_DOWN(6),           */
1272                 CON_INPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_IRQ(3) |
1273                 CON_INPUT(4) | CON_INPUT(5) | CON_OUTPUT(6) | CON_INPUT(7),
1274                 DAT_SET(0),
1275                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1276                 PULL_DOWN(4),
1277         }, {    /* S5PC110_GPIO_H2_OFFSET */
1278                 CON_OUTPUT(0) | CON_OUTPUT(1) | CON_OUTPUT(2) | CON_OUTPUT(3) |
1279                 CON_IRQ(4) | CON_IRQ(5) | CON_IRQ(6) | CON_IRQ(7),
1280                 DAT_CLEAR(0) | DAT_CLEAR(1) | DAT_CLEAR(2) | DAT_CLEAR(3),
1281                 0,
1282         }, {    /* S5PC110_GPIO_H3_OFFSET */
1283                 CON_IRQ(0) | CON_IRQ(1) | CON_IRQ(2) | CON_OUTPUT(3) |
1284                 CON_IRQ(4) | CON_INPUT(5) | CON_IRQ(6) | CON_OUTPUT(7),
1285                 DAT_CLEAR(3) | DAT_CLEAR(7),
1286                 0,
1287         },
1288 };
1289
1290 static void setup_power_down_mode_registers(void)
1291 {
1292         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1293         struct s5pc1xx_gpio_bank *bank;
1294         struct gpio_powermode *p;
1295         struct gpio_external *ge;
1296         int i;
1297
1298         if (cpu_is_s5pc100())
1299                 return;
1300
1301         if (!(machine_is_aquila() && board_is_limo_real()))
1302                 return;
1303
1304         bank = &gpio->gpio_a0;
1305         p = powerdown_modes;
1306
1307         for (i = 0; i < ARRAY_SIZE(powerdown_modes); i++, p++, bank++) {
1308                 writel(p->conpdn, &bank->pdn_con);
1309                 writel(p->pudpdn, &bank->pdn_pull);
1310         }
1311         bank = &gpio->gpio_i;
1312         writel(0x0008, &bank->dat);
1313         bank = &gpio->gpio_mp0_1;
1314         writel(0x5100, &bank->pdn_con);
1315         writel(0x0000, &bank->pdn_pull);
1316         bank = &gpio->gpio_mp0_2;
1317         writel(0x0020, &bank->pdn_con);
1318         writel(0x0000, &bank->pdn_pull);
1319         bank = &gpio->gpio_mp0_3;
1320         writel(0x0210, &bank->pdn_con);
1321         writel(0x0000, &bank->pdn_pull);
1322         bank = &gpio->gpio_mp0_4;
1323         writel(0x2280, &bank->pdn_con);
1324         writel(0x1140, &bank->pdn_pull);
1325         bank = &gpio->gpio_mp0_5;
1326         writel(0x00a2, &bank->pdn_con);
1327         writel(0x0001, &bank->pdn_pull);
1328         bank = &gpio->gpio_mp0_6;
1329         writel(0x0000, &bank->pdn_con);
1330         writel(0x0000, &bank->pdn_pull);
1331         bank = &gpio->gpio_mp0_7;
1332         writel(0x0000, &bank->pdn_con);
1333         writel(0x0000, &bank->pdn_pull);
1334
1335         /* M299 */
1336         writel(0xff0022b0, (unsigned int *)0xF0000000);
1337         writel(0xff0022b0, (unsigned int *)0xF1400000);
1338
1339
1340         bank = &gpio->gpio_h0;
1341         ge = external_powerdown_modes;
1342
1343         for (i = 0; i < ARRAY_SIZE(external_powerdown_modes); i++) {
1344                 writel(ge->con, &bank->con);
1345                 writel(ge->dat, &bank->dat);
1346                 writel(ge->pud, &bank->pull);
1347
1348                 bank++;
1349                 ge++;
1350         }
1351 }
1352
1353 #ifdef CONFIG_LCD
1354 struct s6e63m0_platform_data {
1355         struct s5pc1xx_gpio_bank *bank;
1356         unsigned int num;
1357 };
1358
1359 extern void s6e63m0_set_spi_interface(struct s6e63m0_platform_data *cs,
1360         struct s6e63m0_platform_data *clk, struct s6e63m0_platform_data *si,
1361         struct s6e63m0_platform_data *so);
1362
1363 struct s6e63m0_platform_data pd_cs, pd_clk, pd_si, pd_so;
1364 struct s5pc110_gpio *gpio_base = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1365
1366 void lcd_cfg_gpio(void)
1367 {
1368         unsigned int i, f3_end = 4;
1369
1370         for (i = 0; i < 8; i++) {
1371                 /* set GPF0,1,2[0:7] for RGB Interface and Data lines (32bit) */
1372                 gpio_cfg_pin(&gpio_base->gpio_f0, i, GPIO_FUNC(2));
1373                 gpio_cfg_pin(&gpio_base->gpio_f1, i, GPIO_FUNC(2));
1374                 gpio_cfg_pin(&gpio_base->gpio_f2, i, GPIO_FUNC(2));
1375                 /* pull-up/down disable */
1376                 gpio_set_pull(&gpio_base->gpio_f0, i, GPIO_PULL_NONE);
1377                 gpio_set_pull(&gpio_base->gpio_f1, i, GPIO_PULL_NONE);
1378                 gpio_set_pull(&gpio_base->gpio_f2, i, GPIO_PULL_NONE);
1379
1380                 /* drive strength to max (24bit) */
1381                 gpio_set_drv(&gpio_base->gpio_f0, i, GPIO_DRV_4x);
1382                 gpio_set_rate(&gpio_base->gpio_f0, i, GPIO_DRV_SLOW);
1383                 gpio_set_drv(&gpio_base->gpio_f1, i, GPIO_DRV_4x);
1384                 gpio_set_rate(&gpio_base->gpio_f1, i, GPIO_DRV_SLOW);
1385                 gpio_set_drv(&gpio_base->gpio_f2, i, GPIO_DRV_4x);
1386                 gpio_set_rate(&gpio_base->gpio_f2, i, GPIO_DRV_SLOW);
1387         }
1388
1389         /* set DISPLAY_DE_B pin for dual rgb mode. */
1390         if (board_is_media())
1391                 f3_end = 5;
1392
1393         for (i = 0; i < f3_end; i++) {
1394                 /* set GPF3[0:3] for RGB Interface and Data lines (32bit) */
1395                 gpio_cfg_pin(&gpio_base->gpio_f3, i, GPIO_PULL_UP);
1396                 /* pull-up/down disable */
1397                 gpio_set_pull(&gpio_base->gpio_f3, i, GPIO_PULL_NONE);
1398                 /* drive strength to max (24bit) */
1399                 gpio_set_drv(&gpio_base->gpio_f3, i, GPIO_DRV_4x);
1400                 gpio_set_rate(&gpio_base->gpio_f3, i, GPIO_DRV_SLOW);
1401         }
1402         /* display output path selection (only [1:0] valid) */
1403         writel(0x2, 0xE0107008);
1404
1405         /* gpio pad configuration for LCD reset. */
1406         gpio_cfg_pin(&gpio_base->gpio_mp0_5, 5, GPIO_OUTPUT);
1407
1408         /* gpio pad configuration for LCD ON. */
1409         gpio_cfg_pin(&gpio_base->gpio_j1, 3, GPIO_OUTPUT);
1410
1411         /* MLCD_ON2 */
1412         /*
1413         if (board_is_p2_real())
1414              gpio_cfg_pin(&gpio_base->gpio_j1, 4, GPIO_OUTPUT);
1415         */
1416
1417         /* LCD_BACKLIGHT_EN */
1418         if (machine_is_geminus())
1419                 gpio_cfg_pin(&gpio_base->gpio_mp0_5, 0, GPIO_OUTPUT);
1420
1421         /*
1422          * gpio pad configuration for
1423          * DISPLAY_CS, DISPLAY_CLK, DISPLAY_SO, DISPLAY_SI.
1424          */
1425         gpio_cfg_pin(&gpio_base->gpio_mp0_1, 1, GPIO_OUTPUT);
1426         gpio_cfg_pin(&gpio_base->gpio_mp0_4, 1, GPIO_OUTPUT);
1427         gpio_cfg_pin(&gpio_base->gpio_mp0_4, 2, GPIO_INPUT);
1428         gpio_cfg_pin(&gpio_base->gpio_mp0_4, 3, GPIO_OUTPUT);
1429
1430         if (machine_is_aquila()) {
1431                 pd_cs.bank = &gpio_base->gpio_mp0_1;
1432                 pd_cs.num = 1;
1433                 pd_clk.bank = &gpio_base->gpio_mp0_4;
1434                 pd_clk.num = 1;
1435                 pd_si.bank = &gpio_base->gpio_mp0_4;
1436                 pd_si.num = 3;
1437                 pd_so.bank = &gpio_base->gpio_mp0_4;
1438                 pd_so.num = 2;
1439
1440                 /* these data would be sent to s6e63m0 lcd panel driver. */
1441                 s6e63m0_set_spi_interface(&pd_cs, &pd_clk, &pd_si, &pd_so);
1442         }
1443
1444         if (machine_is_cypress()) {
1445                 /* FLCD_CS */
1446                 gpio_cfg_pin(&gpio_base->gpio_mp0_1, 0, GPIO_OUTPUT);
1447                 /* FLCD_CLK */
1448                 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 0, GPIO_OUTPUT);
1449                 /* FLCD_SDI */
1450                 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 2, GPIO_OUTPUT);
1451                 /* FLCD_RST_S */
1452                 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 5, GPIO_OUTPUT);
1453                 /* FLCD_ON_S */
1454                 gpio_cfg_pin(&gpio_base->gpio_g2, 2, GPIO_OUTPUT);
1455
1456                 pd_cs.bank = &gpio_base->gpio_mp0_1;
1457                 pd_cs.num = 0;
1458                 pd_clk.bank = &gpio_base->gpio_mp0_4;
1459                 pd_clk.num = 0;
1460                 pd_si.bank = &gpio_base->gpio_mp0_4;
1461                 pd_si.num = 2;
1462
1463                 /* these data would be sent to s6e63m0 lcd panel driver. */
1464                 s6e63m0_set_spi_interface(&pd_cs, &pd_clk, &pd_si, NULL);
1465         }
1466
1467         return;
1468 }
1469
1470 void backlight_on(unsigned int onoff)
1471 {
1472         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1473
1474         if (onoff) {
1475                 if (machine_is_geminus())
1476                         gpio_set_value(&gpio->gpio_mp0_5, 0, 1);
1477         } else {
1478                 if (machine_is_geminus())
1479                         gpio_set_value(&gpio->gpio_mp0_5, 0, 0);
1480         }
1481 }
1482
1483 void reset_lcd(void)
1484 {
1485         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1486
1487         if (machine_is_aquila() || machine_is_geminus())
1488                 gpio_set_value(&gpio->gpio_mp0_5, 5, 1);
1489         if (machine_is_cypress())
1490                 gpio_set_value(&gpio->gpio_mp0_4, 5, 1);
1491 }
1492
1493 void lcd_power_on(unsigned int onoff)
1494 {
1495         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1496
1497         if (onoff) {
1498                 if (machine_is_aquila() || machine_is_geminus())
1499                         gpio_set_value(&gpio->gpio_j1, 3, 1);
1500
1501                 if (machine_is_cypress())
1502                         gpio_set_value(&gpio->gpio_g2, 2, 1);
1503
1504                 /*
1505                 if (board_is_p2_real())
1506                         gpio_set_value(&gpio->gpio_j1, 4, 1);
1507                 */
1508         } else {
1509                 if (machine_is_aquila() || machine_is_geminus())
1510                         gpio_set_value(&gpio->gpio_j1, 3, 0);
1511
1512                 if (machine_is_cypress())
1513                         gpio_set_value(&gpio->gpio_g2, 2, 0);
1514
1515                 /*
1516                 if (board_is_p2_real())
1517                      gpio_set_value(&gpio->gpio_j1, 4, 0);
1518                 */
1519         }
1520 }
1521
1522 extern void s6e63m0_cfg_ldo(void);
1523 extern void s6e63m0_enable_ldo(unsigned int onoff);
1524
1525 void init_panel_info(vidinfo_t *vid)
1526 {
1527         vid->cfg_gpio = NULL;
1528         vid->reset_lcd = NULL;
1529         vid->backlight_on = NULL;
1530         vid->lcd_power_on = NULL;
1531
1532         vid->cfg_ldo = NULL;
1533         vid->enable_ldo = NULL;
1534
1535         vid->init_delay = 0;
1536         vid->reset_delay = 0;
1537         vid->power_on_delay = 0;
1538
1539         vid->vl_freq    = 60;
1540         vid->vl_col     = 480;
1541         vid->vl_row     = 800;
1542         vid->vl_width   = 480;
1543         vid->vl_height  = 800;
1544
1545         vid->dual_lcd_enabled = 0;
1546
1547         if (board_is_media()) {
1548                 vid->vl_col     = 960;
1549                 vid->vl_row     = 800;
1550                 vid->vl_width   = 960;
1551                 vid->vl_height  = 800;
1552
1553                 /* enable dual lcd mode. */
1554                 vid->dual_lcd_enabled = 1;
1555         }
1556
1557         vid->vl_clkp    = CONFIG_SYS_HIGH;
1558         vid->vl_hsp     = CONFIG_SYS_LOW;
1559         vid->vl_vsp     = CONFIG_SYS_LOW;
1560         vid->vl_dp      = CONFIG_SYS_HIGH;
1561         vid->vl_bpix    = 32;
1562
1563         /* S6E63M0 LCD Panel */
1564         vid->vl_hspw    = 2;
1565         vid->vl_hbpd    = 16;
1566         vid->vl_hfpd    = 16;
1567
1568         vid->vl_vspw    = 2;
1569         vid->vl_vbpd    = 3;
1570         vid->vl_vfpd    = 28;
1571
1572         if (machine_is_aquila() || machine_is_cypress()) {
1573                 vid->cfg_gpio = lcd_cfg_gpio;
1574                 vid->reset_lcd = reset_lcd;
1575                 vid->backlight_on = backlight_on;
1576                 vid->lcd_power_on = lcd_power_on;
1577
1578                 vid->cfg_ldo = s6e63m0_cfg_ldo;
1579                 vid->enable_ldo = s6e63m0_enable_ldo;
1580
1581                 vid->init_delay = 25000;
1582                 vid->reset_delay = 120000;
1583         }
1584
1585         if (machine_is_geminus()) {
1586                 vid->vl_freq    = 60;
1587                 vid->vl_col     = 1024,
1588                 vid->vl_row     = 600,
1589                 vid->vl_width   = 1024,
1590                 vid->vl_height  = 600,
1591                 vid->vl_clkp    = CONFIG_SYS_LOW,
1592                 vid->vl_hsp     = CONFIG_SYS_HIGH,
1593                 vid->vl_vsp     = CONFIG_SYS_HIGH,
1594                 vid->vl_dp      = CONFIG_SYS_LOW,
1595                 vid->vl_bpix    = 32,
1596
1597                 vid->vl_hspw    = 32,
1598                 vid->vl_hfpd    = 48,
1599                 vid->vl_hbpd    = 80,
1600
1601                 vid->vl_vspw    = 1,
1602                 vid->vl_vfpd    = 3,
1603                 vid->vl_vbpd    = 4,
1604
1605                 vid->cfg_gpio = lcd_cfg_gpio;
1606                 vid->reset_lcd = reset_lcd;
1607                 vid->backlight_on = backlight_on;
1608                 vid->lcd_power_on = lcd_power_on;
1609         }
1610 #if 0
1611         vid->vl_freq    = 60;
1612         vid->vl_col     = 480,
1613         vid->vl_row     = 800,
1614         vid->vl_width   = 480,
1615         vid->vl_height  = 800,
1616         vid->vl_clkp    = CONFIG_SYS_HIGH,
1617         vid->vl_hsp     = CONFIG_SYS_LOW,
1618         vid->vl_vsp     = CONFIG_SYS_LOW,
1619         vid->vl_dp      = CONFIG_SYS_HIGH,
1620         vid->vl_bpix    = 32,
1621
1622         /* tl2796 panel. */
1623         vid->vl_hpw     = 4,
1624         vid->vl_blw     = 8,
1625         vid->vl_elw     = 8,
1626
1627         vid->vl_vpw     = 4,
1628         vid->vl_bfw     = 8,
1629         vid->vl_efw     = 8,
1630 #endif
1631 #if 0
1632         vid->vl_freq    = 60;
1633         vid->vl_col     = 1024,
1634         vid->vl_row     = 600,
1635         vid->vl_width   = 1024,
1636         vid->vl_height  = 600,
1637         vid->vl_clkp    = CONFIG_SYS_HIGH,
1638         vid->vl_hsp     = CONFIG_SYS_HIGH,
1639         vid->vl_vsp     = CONFIG_SYS_HIGH,
1640         vid->vl_dp      = CONFIG_SYS_LOW,
1641         vid->vl_bpix    = 32,
1642
1643         /* AMS701KA AMOLED Panel. */
1644         vid->vl_hpw     = 30,
1645         vid->vl_blw     = 114,
1646         vid->vl_elw     = 48,
1647
1648         vid->vl_vpw     = 2,
1649         vid->vl_bfw     = 6,
1650         vid->vl_efw     = 8,
1651 #endif
1652 }
1653 #endif
1654
1655 static void setup_meminfo(void)
1656 {
1657         char meminfo[64] = {0, };
1658         int count = 0, size, real;
1659
1660         size = gd->bd->bi_dram[0].size >> 20;
1661         count += sprintf(meminfo + count, "mem=%dM", size);
1662
1663         /* Each Chip Select can't exceed the 256MiB */
1664         size = gd->bd->bi_dram[1].size >> 20;
1665         real = min(size, 256);
1666         count += sprintf(meminfo + count, " mem=%dM@0x%x",
1667                 real, (unsigned int)gd->bd->bi_dram[1].start);
1668
1669         size -= real;
1670         if (size > 0) {
1671                 count += sprintf(meminfo + count, " mem=%dM@0x%x", size,
1672                         (unsigned int)gd->bd->bi_dram[1].start + (real << 20));
1673         }
1674
1675         setenv("meminfo", meminfo);
1676 }
1677
1678 int misc_init_r(void)
1679 {
1680 #ifdef CONFIG_LCD
1681         /* It should be located at first */
1682         lcd_is_enabled = 0;
1683
1684         if (board_is_limo_real() ||
1685                 board_is_limo_universal() ||
1686                 board_is_j1b2())
1687                 setenv("lcdinfo", "lcd=s6e63m0");
1688         /* it can't classify tl2796 with single-lcd and dual-lcd.
1689         else
1690                 setenv("lcdinfo", "lcd=tl2796-dual");
1691         */
1692
1693         /*
1694          * env values below should be added in case that lcd panel of geminus,
1695          * p1 and p2 are enabled at u-boot.
1696          * setenv means that lcd panel has been turned on at u-boot.
1697          */
1698         if (machine_is_geminus())
1699                 setenv("lcdinfo", "lcd=lms480jc01");
1700
1701         /*
1702         if (board_is_p2_real())
1703                 setenv("lcdinfo", "lcd=ams701");
1704         */
1705 #endif
1706         setup_meminfo();
1707
1708         show_hw_revision();
1709
1710         /* Set proper PMIC pins */
1711         pmic_pin_init();
1712
1713         /* Check auto burning */
1714         check_auto_burn();
1715
1716         /* To power up I2C2 */
1717         enable_ldos();
1718
1719         /* Enable T-Flash at Limo Real or Limo Universal */
1720         enable_t_flash();
1721
1722         /* Setup Limo Real board GPIOs */
1723         setup_limo_real_gpios();
1724
1725         /* Setup Media board GPIOs */
1726         setup_media_gpios();
1727
1728         /* Setup P1P2 board GPIOS */
1729         setup_p1p2_gpios();
1730
1731         /* To usbdown automatically */
1732         if (board_is_p2_real())
1733                 check_p2_keypad();
1734         else
1735                 check_keypad();
1736
1737         /* check max8998 */
1738         init_pmic();
1739
1740 #ifdef CONFIG_S5PC1XXFB
1741         display_device_info();
1742 #endif
1743
1744         setup_power_down_mode_registers();
1745
1746         /* check max17040 */
1747         check_battery();
1748
1749         /* check fsa9480 */
1750         check_micro_usb(0);
1751
1752         return 0;
1753 }
1754 #endif
1755
1756 int board_init(void)
1757 {
1758         /* Set Initial global variables */
1759         s5pc110_gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1760
1761         gd->bd->bi_arch_number = MACH_TYPE;
1762         gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
1763
1764         /* Check H/W Revision */
1765         check_hw_revision();
1766
1767         return 0;
1768 }
1769
1770 int dram_init(void)
1771 {
1772         unsigned int base, memconfig0, size;
1773         unsigned int memconfig1, sz = 0;
1774
1775         if (cpu_is_s5pc100()) {
1776                 /* In mem setup, we swap the bank. So below size is correct */
1777                 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
1778                 gd->bd->bi_dram[0].size = PHYS_SDRAM_2_SIZE;
1779                 gd->bd->bi_dram[1].start = S5PC100_PHYS_SDRAM_2;
1780                 size = 128;
1781         } else {
1782                 /* In S5PC110, we can't swap the DMC0/1 */
1783                 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
1784                 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
1785
1786                 base = S5PC110_DMC1_BASE;
1787                 /* DMC configuration */
1788                 memconfig0 = readl(base + MEMCONFIG0_OFFSET);
1789                 gd->bd->bi_dram[1].start = memconfig0 & 0xFF000000;
1790
1791                 size = (memconfig0 >> 16) & 0xFF;
1792                 size = ((unsigned char) ~size) + 1;
1793
1794                 /*
1795                  * (0x07 + 1) * 16 = 128 MiB
1796                  * (0x0f + 1) * 16 = 256 MiB
1797                  */
1798                 size = size << 4;
1799
1800                 /*
1801                  * Aquila Rev0.5 4G3G1G
1802                  * Aquila Rev0.8 4G3G1G
1803                  */
1804                 if (machine_is_aquila() && (hwrevision(5) || hwrevision(8))) {
1805                         memconfig1 = readl(base + MEMCONFIG1_OFFSET);
1806
1807                         sz = (memconfig1 >> 16) & 0xFF;
1808                         sz = ((unsigned char) ~sz) + 1;
1809                         sz = sz << 4;
1810                 }
1811
1812         }
1813         /*
1814          * bi_dram[1].size contains all DMC1 memory size
1815          */
1816         gd->bd->bi_dram[1].size = (size + sz) << 20;
1817
1818         return 0;
1819 }
1820
1821 /* Used for sleep test */
1822 static unsigned char saved_val[4][2];
1823 static unsigned int gpio_CP;
1824 static unsigned int gpio_T_FLASH;
1825 void board_sleep_init(void)
1826 {
1827         unsigned int value;
1828         unsigned char addr;
1829         unsigned char val[2];
1830         struct s5pc110_gpio *gpio =
1831                 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1832
1833         /* Set wakeup mask register */
1834         value = 0xFFFF;
1835         value &= ~(1 << 4);     /* Keypad */
1836         value &= ~(1 << 3);     /* RTC */
1837         value &= ~(1 << 2);     /* RTC Alarm */
1838         writel(value, S5PC110_WAKEUP_MASK);
1839
1840         /* Set external wakeup mask register */
1841         value = 0xFFFFFFFF;
1842         value &= ~(1 << 18);    /* T-Flash */
1843         writel(value, S5PC110_EINT_WAKEUP_MASK);
1844
1845         i2c_set_bus_num(I2C_PMIC);
1846         addr = 0xCC >> 1;
1847         if (i2c_probe(addr)) {
1848                 printf("Can't find max8998\n");
1849                 return;
1850         }
1851
1852         /* CP off */
1853         gpio_CP = gpio_get_value(&gpio->gpio_h3, 7);
1854         gpio_set_value(&gpio->gpio_h3, 7, 0);
1855         value = gpio_get_value(&gpio->gpio_h3, 7);
1856         /* MMC T_FLASH off */
1857         gpio_T_FLASH = gpio_get_value(&gpio->gpio_mp0_5, 4);
1858         gpio_set_value(&gpio->gpio_mp0_5, 4, 0);
1859         value = gpio_get_value(&gpio->gpio_mp0_5, 4);
1860         /* MHL off */
1861         gpio_set_value(&gpio->gpio_j2, 2, 0);
1862         gpio_set_value(&gpio->gpio_mp0_4, 7, 0);
1863         gpio_set_value(&gpio->gpio_j2, 3, 0); /* MHL_ON for REV02 or higher */
1864
1865         /* Set ONOFF1 */
1866         i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1867         saved_val[0][0] = val[0];
1868         saved_val[0][1] = val[1];
1869         val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) |
1870                         (1 << 1) | (1 << 0));
1871         i2c_write(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1872         i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1873         /* Set ONOFF2 */
1874         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1875         saved_val[1][0] = val[0];
1876         saved_val[1][1] = val[1];
1877         val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 3) |
1878                         (1 << 2) | (1 << 1) | (1 << 0));
1879         val[0] |= (1 << 7);
1880         i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1881         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1882         /* Set ONOFF3 */
1883         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1884         saved_val[2][0] = val[0];
1885         saved_val[2][1] = val[1];
1886         val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4));
1887         i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1888         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1889         /* Set ONOFF4 */
1890         i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1891         saved_val[3][0] = val[0];
1892         saved_val[3][1] = val[1];
1893         val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4));
1894         i2c_write(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1895         i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1896         printf("Turned off regulators. Preparing to sleep. [%s:%d]\n",
1897                         __FILE__, __LINE__);
1898 }
1899
1900 void board_sleep_resume(void)
1901 {
1902         unsigned int value;
1903         unsigned char addr;
1904         unsigned char val[2];
1905         struct s5pc110_gpio *gpio =
1906                 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1907
1908         show_hw_revision();
1909
1910         i2c_set_bus_num(I2C_PMIC);
1911         addr = 0xCC >> 1;
1912         if (i2c_probe(addr)) {
1913                 printf("Can't find max8998\n");
1914                 return;
1915         }
1916
1917         /* Set ONOFF1 */
1918         i2c_write(addr, MAX8998_REG_ONOFF1, 1, saved_val[0], 1);
1919         i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1920         /* Set ONOFF2 */
1921         i2c_write(addr, MAX8998_REG_ONOFF2, 1, saved_val[1], 1);
1922         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1923         /* Set ONOFF3 */
1924         i2c_write(addr, MAX8998_REG_ONOFF3, 1, saved_val[2], 1);
1925         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1926         /* Set ONOFF4 */
1927         i2c_write(addr, MAX8998_REG_ONOFF3+1, 1, saved_val[3], 1);
1928         i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1929         printf("Waked up.\n");
1930
1931         /* CP */
1932         gpio_set_value(&gpio->gpio_h3, 7, gpio_CP);
1933         value = gpio_get_value(&gpio->gpio_h3, 7);
1934         /* MMC T_FLASH */
1935         gpio_set_value(&gpio->gpio_mp0_5, 4, gpio_T_FLASH);
1936         value = gpio_get_value(&gpio->gpio_mp0_5, 4);
1937
1938         /* check max17040 */
1939         check_battery();
1940
1941         /* check fsa9480 */
1942         check_micro_usb(1);
1943 }
1944
1945 #ifdef CONFIG_CMD_USBDOWN
1946 int usb_board_init(void)
1947 {
1948 #ifdef CONFIG_CMD_PMIC
1949         run_command("pmic ldo 3 on", 0);
1950 #endif
1951
1952         if (cpu_is_s5pc100()) {
1953 #ifdef CONFIG_HARD_I2C
1954                 uchar val[2] = {0,};
1955
1956                 /* PMIC */
1957                 if (i2c_read(0x66, 0, 1, val, 2)) {
1958                         printf("i2c_read error\n");
1959                         return 1;
1960                 }
1961
1962                 val[0] |= (1 << 3);
1963                 val[1] |= (1 << 5);
1964
1965                 if (i2c_write(0x66, 0, 1, val, 2)) {
1966                         printf("i2c_write error\n");
1967                         return 1;
1968                 }
1969                 i2c_read(0x66, 0, 1, val, 2);
1970 #endif
1971                 return 0;
1972         }
1973
1974         /* S5PC110 */
1975         if (board_is_limo_universal() ||
1976                 board_is_limo_real() ||
1977                 board_is_media()) {
1978                 /* check usb path */
1979                 if (board_is_limo_real() && !hwrevision(6))
1980                         check_mhl();
1981         }
1982
1983         if (machine_is_tickertape())
1984                 /* USB_SEL: XM0ADDR_0: MP04[0] output mode */
1985                 gpio_direction_output(&s5pc110_gpio->gpio_mp0_4, 0, 0);
1986
1987         return 0;
1988 }
1989 #endif
1990
1991 #ifdef CONFIG_GENERIC_MMC
1992 int board_mmc_init(bd_t *bis)
1993 {
1994         unsigned int reg;
1995         unsigned int clock;
1996         struct s5pc110_clock *clk = (struct s5pc110_clock *)S5PC1XX_CLOCK_BASE;
1997         int i;
1998
1999         /* MMC0 Clock source = SCLKMPLL */
2000         reg = readl(&clk->src4);
2001         reg &= ~0xf;
2002         reg |= 0x6;
2003         writel(reg, &clk->src4);
2004
2005         reg = readl(&clk->div4);
2006         reg &= ~0xf;
2007
2008         /* set div value near 50MHz */
2009         clock = get_pll_clk(MPLL) / 1000000;
2010         for (i = 0; i < 0xf; i++) {
2011                 if ((clock / (i + 1)) <= 50) {
2012                         reg |= i << 0;
2013                         break;
2014                 }
2015         }
2016
2017         writel(reg, &clk->div4);
2018
2019         /*
2020          * MMC0 GPIO
2021          * GPG0[0]      SD_0_CLK
2022          * GPG0[1]      SD_0_CMD
2023          * GPG0[2]      SD_0_CDn        -> Not used
2024          * GPG0[3:6]    SD_0_DATA[0:3]
2025          */
2026         for (i = 0; i < 7; i++) {
2027                 if (i == 2)
2028                         continue;
2029                 /* GPG0[0:6] special function 2 */
2030                 gpio_cfg_pin(&s5pc110_gpio->gpio_g0, i, 0x2);
2031                 /* GPG0[0:6] pull disable */
2032                 gpio_set_pull(&s5pc110_gpio->gpio_g0, i, GPIO_PULL_NONE);
2033         }
2034
2035         return s5pc1xx_mmc_init(0);
2036 }
2037 #endif
2038
2039 #ifdef CONFIG_CMD_PMIC
2040 static int pmic_status(void)
2041 {
2042         unsigned char addr, val[2];
2043         int reg, i;
2044
2045         i2c_set_bus_num(I2C_PMIC);
2046         addr = 0xCC >> 1;
2047         if (i2c_probe(addr)) {
2048                 printf("Can't found max8998\n");
2049                 return -1;
2050         }
2051
2052         reg = 0x11;
2053         i2c_read(addr, reg, 1, val, 1);
2054         for (i = 7; i >= 4; i--)
2055                 printf("BUCK%d %s\n", 7 - i + 1,
2056                         val[0] & (1 << i) ? "on" : "off");
2057         for (; i >= 0; i--)
2058                 printf("LDO%d %s\n", 5 - i,
2059                         val[0] & (1 << i) ? "on" : "off");
2060         reg = 0x12;
2061         i2c_read(addr, reg, 1, val, 1);
2062         for (i = 7; i >= 0; i--)
2063                 printf("LDO%d %s\n", 7 - i + 6,
2064                         val[0] & (1 << i) ? "on" : "off");
2065         reg = 0x13;
2066         i2c_read(addr, reg, 1, val, 1);
2067         for (i = 7; i >= 4; i--)
2068                 printf("LDO%d %s\n", 7 - i + 14,
2069                         val[0] & (1 << i) ? "on" : "off");
2070         return 0;
2071 }
2072
2073 static int pmic_ldo_control(int buck, int ldo, int on)
2074 {
2075         unsigned char addr, val[2];
2076         unsigned int reg, shift;
2077
2078         if (ldo) {
2079                 if (ldo < 2)
2080                         return -1;
2081                 if (ldo <= 5) {
2082                         reg = 0x11;
2083                         shift = 5 - ldo;
2084                 } else if (ldo <= 13) {
2085                         reg = 0x12;
2086                         shift = 13 - ldo;
2087                 } else if (ldo <= 17) {
2088                         reg = 0x13;
2089                         shift = 17 - ldo + 4;
2090                 } else
2091                         return -1;
2092         } else if (buck) {
2093                 if (buck > 4)
2094                         return -1;
2095                 reg = 0x11;
2096                 shift = 4 - buck + 4;
2097         } else
2098                 return -1;
2099
2100         i2c_set_bus_num(I2C_PMIC);
2101         addr = 0xCC >> 1;
2102         if (i2c_probe(addr)) {
2103                 printf("Can't found max8998\n");
2104                 return -1;
2105         }
2106
2107         i2c_read(addr, reg, 1, val, 1);
2108         if (on)
2109                 val[0] |= (1 << shift);
2110         else
2111                 val[0] &= ~(1 << shift);
2112         i2c_write(addr, reg, 1, val, 1);
2113         i2c_read(addr, reg, 1, val, 1);
2114         printf("%s %d value 0x%x, %s\n", buck ? "buck" : "ldo", buck ? : ldo,
2115                 val[0], val[0] & (1 << shift) ? "on" : "off");
2116
2117         return 0;
2118 }
2119
2120 static int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
2121 {
2122         int buck = 0, ldo = 0, on = -1;
2123
2124         switch (argc) {
2125         case 2:
2126                 if (strncmp(argv[1], "status", 6) == 0)
2127                         return pmic_status();
2128                 break;
2129         case 4:
2130                 if (strncmp(argv[1], "ldo", 3) == 0) {
2131                         ldo = simple_strtoul(argv[2], NULL, 10);
2132                         if (strncmp(argv[3], "on", 2) == 0)
2133                                 on = 1;
2134                         else if (strncmp(argv[3], "off", 3) == 0)
2135                                 on = 0;
2136                         else
2137                                 break;
2138                         return pmic_ldo_control(buck, ldo, on);
2139                 }
2140                 if (strncmp(argv[1], "buck", 4) == 0) {
2141                         buck = simple_strtoul(argv[2], NULL, 10);
2142                         if (strncmp(argv[3], "on", 2) == 0)
2143                                 on = 1;
2144                         else if (strncmp(argv[3], "off", 3) == 0)
2145                                 on = 0;
2146                         else
2147                                 break;
2148                         return pmic_ldo_control(buck, ldo, on);
2149                 }
2150
2151         default:
2152                 break;
2153         }
2154
2155         cmd_usage(cmdtp);
2156         return 1;
2157 }
2158
2159 U_BOOT_CMD(
2160         pmic,           CONFIG_SYS_MAXARGS,     1, do_pmic,
2161         "PMIC LDO & BUCK control",
2162         "status - Display PMIC LDO & BUCK status\n"
2163         "pmic ldo num on/off - Turn on/off the LDO\n"
2164         "pmic buck num on/off - Turn on/off the BUCK\n"
2165 );
2166 #endif
2167
2168 #ifdef CONFIG_CMD_DEVICE_POWER
2169
2170 enum {
2171         POWER_NONE,
2172         POWER_TOUCH,
2173         POWER_3_TOUCHKEY,
2174         POWER_LCD,
2175         POWER_HAPTIC,
2176         POWER_AUDIO_CODEC,
2177         POWER_FM_RADIO,
2178         POWER_BT_WIFI,
2179         POWER_HDMI,
2180 };
2181
2182 static void power_display_devices(void)
2183 {
2184         printf("devices:\n");
2185         printf("\t%d - touch\n", POWER_TOUCH);
2186         printf("\t%d - 3 touchkey\n", POWER_3_TOUCHKEY);
2187         printf("\t%d - LCD\n", POWER_LCD);
2188         printf("\t%d - Haptic\n", POWER_HAPTIC);
2189         printf("\t%d - Audio Codec\n", POWER_AUDIO_CODEC);
2190         printf("\t%d - FM Radio\n", POWER_FM_RADIO);
2191         printf("\t%d - BT/WiFi\n", POWER_BT_WIFI);
2192         printf("\t%d - HDMI\n", POWER_HDMI);
2193 }
2194
2195 static int power_hdmi(int on)
2196 {
2197         /* HDMI_EN1: GPJ2[2] */
2198         gpio_direction_output(&s5pc110_gpio->gpio_j2, 2, on);
2199         /* MHL_ON: GPJ2[3] */
2200         gpio_direction_output(&s5pc110_gpio->gpio_j2, 3, on);
2201         return 0;
2202 }
2203
2204 static int power_bt_wifi(int on)
2205 {
2206         /* WLAN_BT_EN: GPB[5] */
2207         gpio_direction_output(&s5pc110_gpio->gpio_b, 5, on);
2208         return 0;
2209 }
2210
2211 static int power_fm_radio(int on)
2212 {
2213         /* FM_BUS_nRST: GPJ2[5] */
2214         gpio_direction_output(&s5pc110_gpio->gpio_j2, 5, !on);
2215         return 0;
2216 }
2217
2218 static int power_audio_codec(int on)
2219 {
2220         /* CODEC_LDO_EN: GPF3[4] */
2221         gpio_direction_output(&s5pc110_gpio->gpio_f3, 4, on);
2222         /* CODEC_XTAL_EN: GPH3[2] */
2223         gpio_direction_output(&s5pc110_gpio->gpio_h3, 2, on);
2224         return 0;
2225 }
2226
2227 static int power_haptic(int on)
2228 {
2229         /* HAPTIC_ON: GPJ1[1] */
2230         gpio_direction_output(&s5pc110_gpio->gpio_j1, 1, on);
2231         return 0;
2232 }
2233
2234 static int power_lcd(int on)
2235 {
2236         /* MLCD_ON: GPJ1[3] */
2237         gpio_direction_output(&s5pc110_gpio->gpio_j1, 3, on);
2238         return 0;
2239 }
2240
2241 static int power_touch(int on)
2242 {
2243         /* TOUCH_EN: GPG3[6] */
2244         gpio_direction_output(&s5pc110_gpio->gpio_g3, 6, on);
2245         return 0;
2246 }
2247
2248 static int power_3_touchkey(int on)
2249 {
2250         /* 3_TOUCH_EN - GPJ3[0] : (J1B2) */
2251         /* 3_TOUCH_EN - GPJ3[5] : (not J1B2) */
2252         if (board_rev & J1_B2_BOARD)
2253                 gpio_direction_output(&s5pc110_gpio->gpio_j3, 0, on);
2254         else
2255                 gpio_direction_output(&s5pc110_gpio->gpio_j3, 5, on);
2256
2257         /* 3_TOUCH_CE - GPJ2[6] */
2258         gpio_direction_output(&s5pc110_gpio->gpio_j2, 6, on);   /* TOUCH_CE */
2259
2260         if (on) {
2261                 unsigned int reg;
2262                 unsigned char val[2];
2263                 unsigned char addr = 0x20;              /* mcs5000 3-touchkey */
2264
2265                 /* Require 100ms */
2266                 udelay(80 * 1000);
2267
2268                 /* 3 touchkey */
2269                 i2c_set_bus_num(I2C_GPIO6);
2270
2271                 /* Workaround to probe */
2272                 if (i2c_probe(addr)) {
2273                         if (i2c_probe(addr)) {
2274                                 printf("Can't found 3 touchkey\n");
2275                                 return -ENODEV;
2276                         }
2277                 }
2278
2279 #define MCS5000_TK_HW_VERSION  0x06
2280 #define MCS5000_TK_FW_VERSION  0x0A
2281 #define MCS5000_TK_MI_VERSION  0x0B
2282
2283                 reg = MCS5000_TK_MI_VERSION;
2284                 i2c_read(addr, reg, 1, val, 1);
2285                 printf("3-touchkey:\tM/I 0x%x, ", val[0]);
2286                 reg = MCS5000_TK_HW_VERSION;
2287                 i2c_read(addr, reg, 1, val, 1);
2288                 printf("H/W 0x%x, ", val[0]);
2289                 reg = MCS5000_TK_FW_VERSION;
2290                 i2c_read(addr, reg, 1, val, 1);
2291                 printf("F/W 0x%x\n", val[0]);
2292         }
2293         return 0;
2294 }
2295
2296 static int power_control(int device, int on)
2297 {
2298         switch (device) {
2299         case POWER_TOUCH:
2300                 return power_touch(on);
2301         case POWER_3_TOUCHKEY:
2302                 return power_3_touchkey(on);
2303         case POWER_LCD:
2304                 return power_lcd(on);
2305         case POWER_HAPTIC:
2306                 return power_haptic(on);
2307         case POWER_AUDIO_CODEC:
2308                 return power_audio_codec(on);
2309         case POWER_FM_RADIO:
2310                 return power_fm_radio(on);
2311         case POWER_BT_WIFI:
2312                 return power_bt_wifi(on);
2313         case POWER_HDMI:
2314                 return power_hdmi(on);
2315         default:
2316                 printf("I don't know device %d\n", device);
2317                 break;
2318         }
2319         return 0;
2320 }
2321
2322 static int power_on(int on)
2323 {
2324         power_touch(on);
2325         power_3_touchkey(on);
2326         power_lcd(on);
2327         power_haptic(on);
2328         power_audio_codec(on);
2329         power_fm_radio(on);
2330         power_bt_wifi(on);
2331         power_hdmi(on);
2332 }
2333
2334 static int do_power(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
2335 {
2336         int device, on;
2337
2338         if (!machine_is_aquila())
2339                 goto out;
2340
2341         switch (argc) {
2342         case 2:
2343                 if (strncmp(argv[1], "on", 2) == 0)
2344                         return power_on(1);
2345                 if (strncmp(argv[1], "off", 3) == 0)
2346                         return power_on(0);
2347                 break;
2348         case 3:
2349                 device = simple_strtoul(argv[1], NULL, 10);
2350                 if (device < 0)
2351                         break;
2352
2353                 if (strncmp(argv[2], "on", 2) == 0)
2354                         on = 1;
2355                 else if (strncmp(argv[2], "off", 3) == 0)
2356                         on = 0;
2357                 else
2358                         break;
2359                 return power_control(device, on);
2360         default:
2361                 break;
2362         }
2363 out:
2364         cmd_usage(cmdtp);
2365         power_display_devices();
2366         return 1;
2367 }
2368
2369 U_BOOT_CMD(
2370         power,          CONFIG_SYS_MAXARGS,     1, do_power,
2371         "Device Power Management control",
2372         "device on/off - Turn on/off the device\n"
2373 );
2374 #endif