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