6f9fb06747f26910b4c1f3244681a57517e79a69
[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 for rev0.0 */
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                         if ((board_rev & ~BOARD_MASK) == 3)
540                                 board_rev &= ~0xff;
541                 }
542                 gpio_set_pull(&gpio->gpio_j1, 2, GPIO_PULL_DOWN);
543                 gpio_direction_output(&gpio->gpio_j1, 2, 0);
544
545                 /* C110 Geminus for rev0.1 ~ */
546                 gpio_set_pull(&gpio->gpio_j0, 6, GPIO_PULL_NONE);
547                 gpio_direction_input(&gpio->gpio_j0, 6);
548                 if (gpio_get_value(&gpio->gpio_j0, 6) == 1)
549                         board = MACH_GEMINUS;
550                 gpio_set_pull(&gpio->gpio_j0, 6, GPIO_PULL_DOWN);
551         }
552
553         /* Set machine id */
554         if (cpu_is_s5pc110())
555                 gd->bd->bi_arch_number = C110_MACH_START + board;
556         else
557                 gd->bd->bi_arch_number = C100_MACH_START + board;
558
559         /* Architecture Common settings */
560         if (cpu_is_s5pc110()) {
561                 setenv("mtdparts", MTDPARTS_DEFAULT_4KB);
562         } else {
563                 setenv("bootk", "onenand read 0x30007FC0 0x60000 0x300000; "
564                                 "bootm 0x30007FC0");
565                 setenv("updatek", "onenand erase 0x60000 0x300000; "
566                                   "onenand write 0x31008000 0x60000 0x300000");
567         }
568 }
569
570 static void show_hw_revision(void)
571 {
572         int board;
573
574         /*
575          * Workaround for Rev 0.3 + CP Ver ES 3.1
576          * it's Rev 0.4
577          */
578         if (board_is_limo_real()) {
579                 if (hwrevision(0)) {
580                         /* default is Rev 0.4 */
581                         board_rev &= ~0xf;
582                         board_rev |= 0x4;
583                 }
584         }
585
586         if (cpu_is_s5pc110())
587                 board = gd->bd->bi_arch_number - C110_MACH_START;
588         else
589                 board = gd->bd->bi_arch_number - C100_MACH_START;
590
591         check_board_revision(board, board_rev);
592         dprintf("HW Revision:\t%x (%s%s)\n", board_rev, board_name[board],
593                 display_features(board, board_rev));
594 }
595
596 static void check_auto_burn(void)
597 {
598         unsigned long magic_base = CONFIG_SYS_SDRAM_BASE + 0x02000000;
599         unsigned int count = 0;
600         char buf[64];
601
602         if (readl(magic_base) == 0x426f6f74) {  /* ASICC: Boot */
603                 printf("Auto burning bootloader\n");
604                 count += sprintf(buf + count, "run updateb; ");
605         }
606         if (readl(magic_base + 0x04) == 0x4b65726e) {   /* ASICC: Kern */
607                 printf("Auto burning kernel\n");
608                 count += sprintf(buf + count, "run updatek; ");
609         }
610
611         if (count) {
612                 count += sprintf(buf + count, "reset");
613                 setenv("bootcmd", buf);
614         }
615
616         /* Clear the magic value */
617         writel(0xa5a55a5a, magic_base);
618         writel(0xa5a55a5a, magic_base + 0x4);
619 }
620
621 static void pmic_pin_init(void)
622 {
623         unsigned int reg, value;
624         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
625
626         if (cpu_is_s5pc100())
627                 return;
628
629         /* AP_PS_HOLD: XEINT_0: GPH0[0]
630          * Note: Don't use GPIO PS_HOLD it doesn't work
631          */
632         reg = S5PC110_PS_HOLD_CONTROL;
633         value = readl(reg);
634         value |= S5PC110_PS_HOLD_DIR_OUTPUT |
635                 S5PC110_PS_HOLD_DATA_HIGH |
636                 S5PC110_PS_HOLD_OUT_EN;
637         writel(value, reg);
638
639         /* nPOWER: XEINT_22: GPH2[6] interrupt mode */
640         gpio_cfg_pin(&gpio->gpio_h2, 6, GPIO_IRQ);
641         gpio_set_pull(&gpio->gpio_h2, 6, GPIO_PULL_UP);
642 }
643
644 static void enable_ldos(void)
645 {
646         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
647
648         if (cpu_is_s5pc100())
649                 return;
650
651         if (machine_is_p1p2())
652                 return;
653
654         /* TOUCH_EN: XMMC3DATA_3: GPG3[6] output high */
655         gpio_direction_output(&gpio->gpio_g3, 6, 1);
656 }
657
658 static void enable_t_flash(void)
659 {
660         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
661
662         if (!(board_is_limo_universal() || board_is_limo_real()))
663                 return;
664
665         /* T_FLASH_EN : XM0ADDR_13: MP0_5[4] output high */
666         gpio_direction_output(&gpio->gpio_mp0_5, 4, 1);
667 }
668
669 static void setup_limo_real_gpios(void)
670 {
671         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
672
673         if (!board_is_limo_real())
674                 return;
675
676         /*
677          * Note: Please write GPIO alphabet order
678          */
679         /* CODEC_LDO_EN: XVVSYNC_LDI: GPF3[4] output high */
680         gpio_direction_output(&gpio->gpio_f3, 4, 1);
681
682         if (hwrevision(0))
683                 /* RESET_REQ_N: XM0BEN_1: MP0_2[1] output high */
684                 gpio_direction_output(&gpio->gpio_mp0_2, 1, 1);
685         else
686                 /* RESET_REQ_N: XM0CSn_2: MP0_1[2] output high */
687                 gpio_direction_output(&gpio->gpio_mp0_1, 2, 1);
688
689         /* T_FLASH_DETECT: EINT28: GPH3[4] interrupt mode */
690         gpio_cfg_pin(&gpio->gpio_h3, 4, GPIO_IRQ);
691         gpio_set_pull(&gpio->gpio_h3, 4, GPIO_PULL_UP);
692 }
693
694 static void setup_media_gpios(void)
695 {
696         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
697
698         if (!board_is_media())
699                 return;
700
701         /*
702          * Note: Please write GPIO alphabet order
703          */
704         /* RESET_REQ_N: XM0CSn_2: MP0_1[2] output high */
705         gpio_direction_output(&gpio->gpio_mp0_1, 2, 1);
706
707         /* T_FLASH_DETECT: EINT28: GPH3[4] interrupt mode */
708         gpio_cfg_pin(&gpio->gpio_h3, 4, GPIO_IRQ);
709         gpio_set_pull(&gpio->gpio_h3, 4, GPIO_PULL_UP);
710 }
711
712 static void setup_p1p2_gpios(void)
713 {
714         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
715
716         if (!machine_is_p1p2())
717                 return;
718
719         /*
720          * Note: Please write GPIO alphabet order
721          */
722         /* RESET_REQ_N: XM0FRnB[1]: MP0_3[5] output high */
723         gpio_direction_output(&gpio->gpio_mp0_3, 5, 1);
724         /* CODEC_LDO_EN: XM0FRnB[2]: MP0_3[6] output high */
725         gpio_direction_output(&gpio->gpio_mp0_3, 6, 1);
726 }
727
728 #define KBR3            (1 << 3)
729 #define KBR2            (1 << 2)
730 #define KBR1            (1 << 1)
731 #define KBR0            (1 << 0)
732
733 static void enable_touchkey(void)
734 {
735         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
736
737         /* TOUCH_EN - GPIO_J3(0) : (J1B2) */
738         /* TOUCH_EN - GPIO_J3(5) : (not J1B2) */
739         if (board_rev & J1_B2_BOARD)
740                 gpio_direction_output(&gpio->gpio_j3, 0, 1);
741         else
742                 gpio_direction_output(&gpio->gpio_j3, 5, 1);
743
744         /* TOUCH_CE - GPIO_J2(6) */
745         gpio_direction_output(&gpio->gpio_j2, 6, 1);    /* TOUCH_CE */
746 }
747
748 static void check_p2_keypad(void)
749 {
750         unsigned int auto_download = 0;
751         unsigned char addr = 0x34, val[2];      /* adp5587 key controller */
752         int i, ret;
753         i2c_set_bus_num(I2C_2);
754
755         if (i2c_probe(addr)) {
756                 printf("Can't found adp5587 key controller\n");
757                 return;
758         }
759         /* Row 8, Column 10 */
760         val[0] = 0xf;
761         ret = i2c_write(addr, 0x1D, 1, val, 1);         /* Set KP_GPIO1 */
762         val[0] = 0xf;
763         ret |= i2c_write(addr, 0x1E, 1, val, 1);        /* Set KP_GPIO2 */
764         val[0] = 0x3;
765         ret |= i2c_write(addr, 0x1F, 1, val, 1);        /* Set KP_GPIO3 */
766         val[0] = 0x3f;          /* CMP2_INT | CMP1_INT | OVR_FLOW_INT |
767                                    K_LCK_INT | GPI_INT | KE_INT */
768         ret |= i2c_write(addr, 0x02, 1, val, 1);        /* Status is W1C */
769         val[0] = 0x19;          /* INT_CFG | OVR_FLOW_IEN | KE_IEN */
770         ret |= i2c_write(addr, 0x01, 1, val, 1);
771         for (i = 0; i < 10; i++) {
772                 udelay(1000);           /* FIXME */
773                 i2c_read(addr, 0x04 + i, 1, val, 1);
774                 if (val[0] == 0x94)
775                         auto_download = 1;
776         }
777
778         if (auto_download == 1)
779                 setenv("bootcmd", "usbdown");
780 }
781
782 static void check_keypad(void)
783 {
784         unsigned int reg, value;
785         unsigned int col_mask, row_mask;
786         unsigned int auto_download = 0;
787         unsigned int col_value[4], i;
788
789         if (cpu_is_s5pc100()) {
790                 struct s5pc100_gpio *gpio =
791                         (struct s5pc100_gpio *)S5PC100_GPIO_BASE;
792
793                 /* Set GPH2[2:0] to KP_COL[2:0] */
794                 gpio_cfg_pin(&gpio->gpio_h2, 0, 0x3);
795                 gpio_cfg_pin(&gpio->gpio_h2, 1, 0x3);
796                 gpio_cfg_pin(&gpio->gpio_h2, 2, 0x3);
797
798                 /* Set GPH3[2:0] to KP_ROW[2:0] */
799                 gpio_cfg_pin(&gpio->gpio_h3, 0, 0x3);
800                 gpio_cfg_pin(&gpio->gpio_h3, 1, 0x3);
801                 gpio_cfg_pin(&gpio->gpio_h3, 2, 0x3);
802
803                 reg = S5PC100_KEYPAD_BASE;
804         } else {
805                 struct s5pc110_gpio *gpio =
806                         (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
807
808                 if (board_is_limo_real() || board_is_limo_universal()) {
809                         row_mask = 0x00FF;
810                         col_mask = 0x0FFF;
811                 } else {
812                         row_mask = 0xFFFF;
813                         col_mask = 0xFFFF;
814                 }
815
816                 for (i = 0; i < 4; i++) {
817                         /* Set GPH3[3:0] to KP_ROW[3:0] */
818                         if (row_mask & (0xF << (i << 2))) {
819                                 gpio_cfg_pin(&gpio->gpio_h3, i, 0x3);
820                                 if (!machine_is_p1p2())
821                                         gpio_set_pull(&gpio->gpio_h3,
822                                                         i, GPIO_PULL_UP);
823                         }
824
825                         /* Set GPH2[3:0] to KP_COL[3:0] */
826                         if (col_mask & (0xF << (i << 2)))
827                                 gpio_cfg_pin(&gpio->gpio_h2, i, 0x3);
828                         if (machine_is_p1p2())
829                                 gpio_set_pull(&gpio->gpio_h2, i, GPIO_PULL_UP);
830                 }
831
832                 reg = S5PC110_KEYPAD_BASE;
833         }
834         /* init col */
835         value = 0x00;
836         writel(value, reg + S5PC1XX_KEYIFCOL_OFFSET);
837         value = readl(reg + S5PC1XX_KEYIFROW_OFFSET);
838         /* VOLUMEDOWN and CAM(Half shot) Button */
839         if ((value & KBR1) == 0) {
840                 i = 0;
841                 while (i < 4) {
842                         value = readl(reg + S5PC1XX_KEYIFCOL_OFFSET);
843                         value |= 0xff;
844                         value &= ~(1 << i);
845                         writel(value, reg + S5PC1XX_KEYIFCOL_OFFSET);
846                         udelay(10*1000);
847                         col_value[i++] = readl(reg + S5PC1XX_KEYIFROW_OFFSET);
848                 }
849                 writel(0x00, reg + S5PC1XX_KEYIFCOL_OFFSET);
850
851                 /* expected value is row_value[0] = 0x00 row_value[1] = 0x01 */
852                 /* workaround */
853                 if ((col_value[0] & 0x3) == 0x3 && (col_value[1] & 0x3) == 0x3)
854                         auto_download = 1;
855
856                 if ((col_value[0] & 0x3) == 0x3 && (col_value[1] & 0x3) != 0x3)
857                         display_info = 1;
858                 if (machine_is_p1p2()) {
859                         if ((col_value[0] & 0xd) == 0xd)
860                                 auto_download = 1;
861                 }
862         }
863
864         if (auto_download)
865                 setenv("bootcmd", "usbdown");
866 }
867
868 static void check_touchkey(void)
869 {
870         unsigned int reg;
871         unsigned char val[2];
872         unsigned char addr = 0x20;              /* mcs5000 3-touchkey */
873
874         if (!machine_is_aquila())
875                 return;
876
877         /* 3 touchkey */
878         i2c_set_bus_num(I2C_GPIO6);
879
880         if (i2c_probe(addr)) {
881                 printf("Can't found 3 touchkey\n");
882                 return;
883         }
884
885 #define MCS5000_TK_HW_VERSION  0x06
886 #define MCS5000_TK_FW_VERSION  0x0A
887 #define MCS5000_TK_MI_VERSION  0x0B
888
889         reg = MCS5000_TK_MI_VERSION;
890         i2c_read(addr, reg, 1, val, 1);
891         dprintf("3-touchkey:\tM/I 0x%x, ", val[0]);
892         reg = MCS5000_TK_HW_VERSION;
893         i2c_read(addr, reg, 1, val, 1);
894         dprintf("H/W 0x%x, ", val[0]);
895         reg = MCS5000_TK_FW_VERSION;
896         i2c_read(addr, reg, 1, val, 1);
897         dprintf("F/W 0x%x\n", val[0]);
898 }
899
900 static void enable_battery(void)
901 {
902         unsigned char val[2];
903         unsigned char addr = 0x36;      /* max17040 fuel gauge */
904
905         if (machine_is_aquila()) {
906                 if (board_is_j1b2())
907                         return;
908         }
909
910         if (machine_is_tickertape())
911                 return;
912
913         if (machine_is_cypress())
914                 i2c_set_bus_num(I2C_GPIO7);
915         else
916                 i2c_set_bus_num(I2C_GPIO3);
917
918         if (i2c_probe(addr)) {
919                 printf("Can't found max17040 fuel gauge\n");
920                 return;
921         }
922
923         val[0] = 0x54;
924         val[1] = 0x00;
925         i2c_write(addr, 0xfe, 1, val, 2);
926 }
927
928 static void check_battery(void)
929 {
930         unsigned char val[2];
931         unsigned char addr = 0x36;      /* max17040 fuel gauge */
932
933         if (machine_is_aquila()) {
934                 if (board_is_j1b2())
935                         return;
936         }
937
938         if (machine_is_tickertape())
939                 return;
940
941         if (machine_is_cypress())
942                 i2c_set_bus_num(I2C_GPIO7);
943         else
944                 i2c_set_bus_num(I2C_GPIO3);
945
946         if (i2c_probe(addr)) {
947                 printf("Can't found max17040 fuel gauge\n");
948                 return;
949         }
950
951         i2c_read(addr, 0x04, 1, val, 1);
952
953         dprintf("battery:\t%d%%\n", val[0]);
954
955         battery_soc = val[0];
956 }
957
958 static void check_mhl(void)
959 {
960         unsigned char val[2];
961         unsigned char addr = 0x39;      /* SIL9230 */
962         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
963
964         /* MHL Power enable */
965         /* HDMI_EN : GPJ2[2] XMSMDATA_2 output mode */
966         gpio_direction_output(&gpio->gpio_j2, 2, 1);
967
968         /* MHL_RST : MP0_4[7] XM0ADDR_7 output mode */
969         gpio_direction_output(&gpio->gpio_mp0_4, 7, 0);
970
971         /* 10ms required after reset */
972         udelay(10000);
973
974         /* output enable */
975         gpio_set_value(&gpio->gpio_mp0_4, 7, 1);
976
977         i2c_set_bus_num(I2C_GPIO5);
978
979         /* set usb path */
980         if (i2c_probe(addr)) {
981                 printf("Can't found MHL Chip\n");
982                 return;
983         }
984
985         /*
986          * System Control #1
987          * set to Normal operation
988          */
989         val[0] = 0x35;
990         i2c_write((0x72 >> 1), 0x08, 1, val, 1);
991         i2c_read((0x72 >> 1), 0x08, 1, val, 1);
992
993         /*
994          * MHL TX Control #1
995          * TERM_MODE [7:6]
996          * 00 = MHL termination ON
997          * 11 = MHL termination OFF
998          */
999         val[0] = 0xd0;
1000         i2c_write((0x72 >> 1), 0xa0, 1, val, 1);
1001         i2c_read((0x72 >> 1), 0xa0, 1, val, 1);
1002 }
1003
1004 static void into_charge_mode(void)
1005 {
1006         unsigned char addr = 0xCC >> 1; /* max8998 */;
1007         unsigned char val[2];
1008         unsigned int level;
1009         int i, j;
1010
1011         i2c_set_bus_num(I2C_PMIC);
1012
1013         if (i2c_probe(addr)) {
1014                 printf("Can't found max8998\n");
1015                 return;
1016         }
1017
1018         printf("Charge Mode\n");
1019
1020         i2c_read(addr, 0x0C, 1, val, 1);
1021         val[0] &= ~(0x7 << 0);
1022         val[0] |= 5;            /* 600mA */
1023         i2c_write(addr, 0x0C, 1, val, 1);
1024
1025 #ifdef CONFIG_S5PC1XXFB
1026         /* TODO: change to Image animation */
1027         init_font();
1028         set_font_xy(0, 0);
1029         set_font_color(FONT_WHITE);
1030         fb_printf("charging");
1031
1032         level = battery_soc / 25;
1033
1034         for (i = 0; i < 3; i++) {
1035                 if (level == 0)
1036                         udelay(1 * 1000 * 1000);
1037
1038                 for (j = 0; j < 4; j++) {
1039                         fb_printf("..");
1040
1041                         if (j >= level)
1042                                 udelay(1 * 1000 * 1000);
1043                 }
1044
1045                 if (level <= 4)
1046                         udelay(1 * 1000 * 1000);
1047
1048                 set_font_xy(0, 0);
1049                 set_font_color(FONT_XOR);
1050                 fb_printf("charging........");
1051
1052                 set_font_xy(0, 0);
1053                 set_font_color(FONT_WHITE);
1054                 fb_printf("charging");
1055         }
1056
1057         exit_font();
1058 #endif
1059
1060         run_command("sleep 1", 0);
1061 }
1062
1063 static void check_micro_usb(int intr)
1064 {
1065         unsigned char addr;
1066         unsigned char val[2];
1067
1068         if (cpu_is_s5pc100())
1069                 return;
1070
1071         if (board_is_limo_real()) {
1072                 if (hwrevision(0) || hwrevision(1))
1073                         return;
1074         }
1075
1076         if (machine_is_cypress())
1077                 i2c_set_bus_num(I2C_GPIO6);
1078         else
1079                 i2c_set_bus_num(I2C_PMIC);
1080
1081         addr = 0x25;            /* fsa9480 */
1082         if (i2c_probe(addr)) {
1083                 printf("Can't found fsa9480\n");
1084                 return;
1085         }
1086
1087         /* Clear Interrupt */
1088         if (intr) {
1089                 i2c_read(addr, 0x03, 1, val, 2);
1090                 udelay(500 * 1000);
1091         }
1092
1093         /* Read Device Type 1 */
1094         i2c_read(addr, 0x0a, 1, val, 1);
1095
1096 #define FSA_DEDICATED_CHARGER   (1 << 6)
1097 #define FSA_UART                (1 << 3)
1098 #define FSA_USB                 (1 << 2)
1099
1100         /*
1101          * If USB, use default 475mA
1102          * If Charger, use 600mA and go to charge mode
1103          */
1104         if (val[0] & FSA_DEDICATED_CHARGER)
1105                 into_charge_mode();
1106
1107         /* If Factory Mode is Boot ON-USB, go to download mode */
1108         i2c_read(addr, 0x07, 1, val, 1);
1109
1110 #define FSA_ADC_FAC_USB         0x19
1111 #define FSA_ADC_FAC_UART        0x1d
1112
1113         if (val[0] == FSA_ADC_FAC_USB)
1114                 setenv("bootcmd", "usbdown");
1115 }
1116
1117 #define MAX8998_REG_ONOFF1      0x11
1118 #define MAX8998_REG_ONOFF2      0x12
1119 #define MAX8998_REG_ONOFF3      0x13
1120 #define MAX8998_LDO3            (1 << 2)
1121 #define MAX8998_LDO10           (1 << 3)
1122 #define MAX8998_LDO11           (1 << 2)
1123 #define MAX8998_LDO12           (1 << 1)
1124 #define MAX8998_LDO13           (1 << 0)
1125 #define MAX8998_LDO14           (1 << 7)
1126 #define MAX8998_LDO15           (1 << 6)
1127 #define MAX8998_LDO16           (1 << 5)
1128 #define MAX8998_LDO17           (1 << 4)
1129
1130 static void init_pmic(void)
1131 {
1132         unsigned char addr;
1133         unsigned char val[2];
1134
1135         if (cpu_is_s5pc100())
1136                 return;
1137
1138         i2c_set_bus_num(I2C_PMIC);
1139
1140         addr = 0xCC >> 1;       /* max8998 */
1141         if (i2c_probe(addr)) {
1142                 printf("Can't found max8998\n");
1143                 return;
1144         }
1145
1146         /* ONOFF1 */
1147         i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1148         val[0] &= ~MAX8998_LDO3;
1149         i2c_write(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1150
1151         /* ONOFF2 */
1152         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1153         /*
1154          * Disable LDO10(VPLL_1.1V), LDO11(CAM_IO_2.8V),
1155          * LDO12(CAM_ISP_1.2V), LDO13(CAM_A_2.8V)
1156          */
1157         val[0] &= ~(MAX8998_LDO10 | MAX8998_LDO11 |
1158                         MAX8998_LDO12 | MAX8998_LDO13);
1159         val[0] |= (1 << 7);
1160         i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1161         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1162         /* ONOFF3 */
1163         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1164         /*
1165          * Disable LDO14(CAM_CIF_1.8), LDO15(CAM_AF_3.3V),
1166          * LDO16(VMIPI_1.8V), LDO17(CAM_8M_1.8V)
1167          */
1168         val[0] &= ~(MAX8998_LDO14 | MAX8998_LDO15 |
1169                         MAX8998_LDO16 | MAX8998_LDO17);
1170         i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1171         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1172 }
1173
1174 #define PDN_MASK(x)             (0x3 << ((x) << 1))
1175
1176 #define CON_INPUT(x)            (0x0 << ((x) << 2))
1177 #define CON_OUTPUT(x)           (0x1 << ((x) << 2))
1178 #define CON_IRQ(x)              (0xf << ((x) << 2))
1179
1180 #define DAT_SET(x)              (0x1 << (x))
1181 #define DAT_CLEAR(x)            (0x0 << (x))
1182
1183 #define OUTPUT0(x)              (0x0 << ((x) << 1))
1184 #define OUTPUT1(x)              (0x1 << ((x) << 1))
1185 #define INPUT(x)                (0x2 << ((x) << 1))
1186
1187 #define PULL_DIS(x)             (0x0 << ((x) << 1))
1188 #define PULL_DOWN(x)            (0x1 << ((x) << 1))
1189 #define PULL_UP(x)              (0x2 << ((x) << 1))
1190
1191 #define PREVIOUS(x)             (0x3 << ((x) << 1))
1192
1193 struct gpio_powermode {
1194         unsigned int    conpdn;
1195         unsigned int    pudpdn;
1196 };
1197
1198 struct gpio_external {
1199         unsigned int    con;
1200         unsigned int    dat;
1201         unsigned int    pud;
1202 };
1203
1204 static struct gpio_powermode powerdown_modes[] = {
1205         {       /* S5PC110_GPIO_A0_OFFSET */
1206                 INPUT(0) | OUTPUT0(1) | INPUT(2) | OUTPUT0(3) |
1207                 INPUT(4) | OUTPUT0(5) | INPUT(6) | OUTPUT0(7),
1208                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1209                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1210         }, {    /* S5PC110_GPIO_A1_OFFSET */
1211                 INPUT(0) | OUTPUT0(1) | INPUT(2) | OUTPUT0(3),
1212                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3),
1213         }, {    /* S5PC110_GPIO_B_OFFSET */
1214                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1215                 INPUT(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1216                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1217                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1218         }, {    /* S5PC110_GPIO_C0_OFFSET */
1219                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1220                 OUTPUT0(4),
1221                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1222                 PULL_DIS(4),
1223         }, {    /* S5PC110_GPIO_C1_OFFSET */
1224                 /* OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1225                 OUTPUT0(4), */
1226                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1227                 OUTPUT0(4),
1228                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1229                 PULL_DIS(4),
1230         }, {    /* S5PC110_GPIO_D0_OFFSET */
1231                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3),
1232                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3),
1233         }, {    /* S5PC110_GPIO_D1_OFFSET */
1234                 INPUT(0) | INPUT(1) | INPUT(2) | INPUT(3) |
1235                 INPUT(4) | INPUT(5),
1236                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1237                 PULL_DIS(4) | PULL_DIS(5),
1238         }, {    /* S5PC110_GPIO_E0_OFFSET */
1239                 INPUT(0) | INPUT(1) | INPUT(2) | INPUT(3) |
1240                 INPUT(4) | INPUT(5) | INPUT(6) | INPUT(7),
1241                 PULL_DOWN(0) | PULL_DOWN(1) | PULL_DOWN(2) | PULL_DOWN(3) |
1242                 PULL_DOWN(4) | PULL_DOWN(5) | PULL_DOWN(6) | PULL_DOWN(7),
1243         }, {    /* S5PC110_GPIO_E1_OFFSET */
1244                 INPUT(0) | INPUT(1) | INPUT(2) | OUTPUT0(3) |
1245                 OUTPUT0(4),
1246                 PULL_DOWN(0) | PULL_DOWN(1) | PULL_DOWN(2) | PULL_DIS(3) |
1247                 PULL_DIS(4),
1248         }, {    /* S5PC110_GPIO_F0_OFFSET */
1249                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1250                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1251                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1252                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1253         }, {    /* S5PC110_GPIO_F1_OFFSET */
1254                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1255                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1256                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1257                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1258         }, {    /* S5PC110_GPIO_F2_OFFSET */
1259                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1260                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1261                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1262                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1263         }, {    /* S5PC110_GPIO_F3_OFFSET */
1264                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1265                 OUTPUT0(4) | OUTPUT0(5),
1266                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1267                 PULL_DIS(4) | PULL_DIS(5),
1268         }, {    /* S5PC110_GPIO_G0_OFFSET */
1269                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(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_G1_OFFSET */
1274                 OUTPUT0(0) | INPUT(1) | OUTPUT0(2) | INPUT(3) |
1275                 INPUT(4) | INPUT(5) | INPUT(6),
1276                 PULL_DIS(0) | PULL_UP(1) | PULL_DIS(2) | PULL_UP(3) |
1277                 PULL_UP(4) | PULL_UP(5) | PULL_UP(6),
1278         }, {    /* S5PC110_GPIO_G2_OFFSET */
1279                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1280                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1281                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1282                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1283         }, {    /* S5PC110_GPIO_G3_OFFSET */
1284                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT1(2) | INPUT(3) |
1285                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1286                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1287                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1288         }, {    /* S5PC110_GPIO_I_OFFSET */
1289                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1290                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1291                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1292                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1293         }, {    /* S5PC110_GPIO_J0_OFFSET */
1294                 OUTPUT1(0) | OUTPUT0(1) | INPUT(2) | INPUT(3) |
1295                 INPUT(4) | INPUT(5) | OUTPUT0(6) | OUTPUT0(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_J1_OFFSET */
1299                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1300                 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1301                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1302                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1303         }, {    /* S5PC110_GPIO_J2_OFFSET */
1304                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1305                 INPUT(4) | OUTPUT0(5) | OUTPUT0(6) | INPUT(7),
1306                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1307                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DOWN(7),
1308         }, {    /* S5PC110_GPIO_J3_OFFSET */
1309                 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1310                 OUTPUT1(4) | OUTPUT0(5) | INPUT(6) | INPUT(7),
1311                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1312                 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1313         }, {    /* S5PC110_GPIO_J4_OFFSET */
1314                 INPUT(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1315                 OUTPUT0(4),
1316                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1317                 PULL_DIS(4),
1318         },
1319 };
1320
1321 static struct gpio_external external_powerdown_modes[] = {
1322         {       /* S5PC110_GPIO_H0_OFFSET */
1323                 CON_OUTPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_OUTPUT(3) |
1324                 CON_OUTPUT(4) | CON_OUTPUT(5) | CON_INPUT(6) | CON_INPUT(7),
1325                 DAT_SET(0) | DAT_CLEAR(2) | DAT_CLEAR(3) |
1326                 DAT_CLEAR(4) | DAT_CLEAR(5),
1327                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1328                 PULL_DIS(4) | PULL_DIS(5),
1329         }, {    /* S5PC110_GPIO_H1_OFFSET */
1330                 /* CON_INPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_IRQ(3) |
1331                 CON_IRQ(4) | CON_INPUT(5) | CON_INPUT(6) | CON_INPUT(7),
1332                 DAT_CLEAR(2),
1333                 PULL_DOWN(0) | PULL_DOWN(1) |
1334                 PULL_DOWN(6),           */
1335                 CON_INPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_IRQ(3) |
1336                 CON_INPUT(4) | CON_INPUT(5) | CON_OUTPUT(6) | CON_INPUT(7),
1337                 DAT_SET(0),
1338                 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1339                 PULL_DOWN(4),
1340         }, {    /* S5PC110_GPIO_H2_OFFSET */
1341                 CON_OUTPUT(0) | CON_OUTPUT(1) | CON_OUTPUT(2) | CON_OUTPUT(3) |
1342                 CON_IRQ(4) | CON_IRQ(5) | CON_IRQ(6) | CON_IRQ(7),
1343                 DAT_CLEAR(0) | DAT_CLEAR(1) | DAT_CLEAR(2) | DAT_CLEAR(3),
1344                 0,
1345         }, {    /* S5PC110_GPIO_H3_OFFSET */
1346                 CON_IRQ(0) | CON_IRQ(1) | CON_IRQ(2) | CON_OUTPUT(3) |
1347                 CON_IRQ(4) | CON_INPUT(5) | CON_IRQ(6) | CON_OUTPUT(7),
1348                 DAT_CLEAR(3) | DAT_CLEAR(7),
1349                 0,
1350         },
1351 };
1352
1353 static void setup_power_down_mode_registers(void)
1354 {
1355         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1356         struct s5pc1xx_gpio_bank *bank;
1357         struct gpio_powermode *p;
1358         struct gpio_external *ge;
1359         int i;
1360
1361         if (cpu_is_s5pc100())
1362                 return;
1363
1364         if (!(machine_is_aquila() && board_is_limo_real()))
1365                 return;
1366
1367         bank = &gpio->gpio_a0;
1368         p = powerdown_modes;
1369
1370         for (i = 0; i < ARRAY_SIZE(powerdown_modes); i++, p++, bank++) {
1371                 writel(p->conpdn, &bank->pdn_con);
1372                 writel(p->pudpdn, &bank->pdn_pull);
1373         }
1374         bank = &gpio->gpio_i;
1375         writel(0x0008, &bank->dat);
1376         bank = &gpio->gpio_mp0_1;
1377         writel(0x5100, &bank->pdn_con);
1378         writel(0x0000, &bank->pdn_pull);
1379         bank = &gpio->gpio_mp0_2;
1380         writel(0x0020, &bank->pdn_con);
1381         writel(0x0000, &bank->pdn_pull);
1382         bank = &gpio->gpio_mp0_3;
1383         writel(0x0210, &bank->pdn_con);
1384         writel(0x0000, &bank->pdn_pull);
1385         bank = &gpio->gpio_mp0_4;
1386         writel(0x2280, &bank->pdn_con);
1387         writel(0x1140, &bank->pdn_pull);
1388         bank = &gpio->gpio_mp0_5;
1389         writel(0x00a2, &bank->pdn_con);
1390         writel(0x0001, &bank->pdn_pull);
1391         bank = &gpio->gpio_mp0_6;
1392         writel(0x0000, &bank->pdn_con);
1393         writel(0x0000, &bank->pdn_pull);
1394         bank = &gpio->gpio_mp0_7;
1395         writel(0x0000, &bank->pdn_con);
1396         writel(0x0000, &bank->pdn_pull);
1397
1398         /* M299 */
1399         writel(0xff0022b0, (unsigned int *)0xF0000000);
1400         writel(0xff0022b0, (unsigned int *)0xF1400000);
1401
1402
1403         bank = &gpio->gpio_h0;
1404         ge = external_powerdown_modes;
1405
1406         for (i = 0; i < ARRAY_SIZE(external_powerdown_modes); i++) {
1407                 writel(ge->con, &bank->con);
1408                 writel(ge->dat, &bank->dat);
1409                 writel(ge->pud, &bank->pull);
1410
1411                 bank++;
1412                 ge++;
1413         }
1414 }
1415
1416 #ifdef CONFIG_LCD
1417 struct s6e63m0_platform_data {
1418         struct s5pc1xx_gpio_bank *bank;
1419         unsigned int num;
1420 };
1421
1422 extern void s6e63m0_set_spi_interface(struct s6e63m0_platform_data *cs,
1423         struct s6e63m0_platform_data *clk, struct s6e63m0_platform_data *si,
1424         struct s6e63m0_platform_data *so);
1425
1426 struct s6e63m0_platform_data pd_cs, pd_clk, pd_si, pd_so;
1427 struct s5pc110_gpio *gpio_base = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1428
1429 void lcd_cfg_gpio(void)
1430 {
1431         unsigned int i, f3_end = 4;
1432
1433         for (i = 0; i < 8; i++) {
1434                 /* set GPF0,1,2[0:7] for RGB Interface and Data lines (32bit) */
1435                 gpio_cfg_pin(&gpio_base->gpio_f0, i, GPIO_FUNC(2));
1436                 gpio_cfg_pin(&gpio_base->gpio_f1, i, GPIO_FUNC(2));
1437                 gpio_cfg_pin(&gpio_base->gpio_f2, i, GPIO_FUNC(2));
1438                 /* pull-up/down disable */
1439                 gpio_set_pull(&gpio_base->gpio_f0, i, GPIO_PULL_NONE);
1440                 gpio_set_pull(&gpio_base->gpio_f1, i, GPIO_PULL_NONE);
1441                 gpio_set_pull(&gpio_base->gpio_f2, i, GPIO_PULL_NONE);
1442
1443                 /* drive strength to max (24bit) */
1444                 gpio_set_drv(&gpio_base->gpio_f0, i, GPIO_DRV_4x);
1445                 gpio_set_rate(&gpio_base->gpio_f0, i, GPIO_DRV_SLOW);
1446                 gpio_set_drv(&gpio_base->gpio_f1, i, GPIO_DRV_4x);
1447                 gpio_set_rate(&gpio_base->gpio_f1, i, GPIO_DRV_SLOW);
1448                 gpio_set_drv(&gpio_base->gpio_f2, i, GPIO_DRV_4x);
1449                 gpio_set_rate(&gpio_base->gpio_f2, i, GPIO_DRV_SLOW);
1450         }
1451
1452         /* set DISPLAY_DE_B pin for dual rgb mode. */
1453         if (board_is_media())
1454                 f3_end = 5;
1455
1456         for (i = 0; i < f3_end; i++) {
1457                 /* set GPF3[0:3] for RGB Interface and Data lines (32bit) */
1458                 gpio_cfg_pin(&gpio_base->gpio_f3, i, GPIO_PULL_UP);
1459                 /* pull-up/down disable */
1460                 gpio_set_pull(&gpio_base->gpio_f3, i, GPIO_PULL_NONE);
1461                 /* drive strength to max (24bit) */
1462                 gpio_set_drv(&gpio_base->gpio_f3, i, GPIO_DRV_4x);
1463                 gpio_set_rate(&gpio_base->gpio_f3, i, GPIO_DRV_SLOW);
1464         }
1465         /* display output path selection (only [1:0] valid) */
1466         writel(0x2, 0xE0107008);
1467
1468         /* gpio pad configuration for LCD reset. */
1469         gpio_cfg_pin(&gpio_base->gpio_mp0_5, 5, GPIO_OUTPUT);
1470
1471         /* gpio pad configuration for LCD ON. */
1472         gpio_cfg_pin(&gpio_base->gpio_j1, 3, GPIO_OUTPUT);
1473
1474         /* MLCD_ON2 */
1475         /*
1476         if (board_is_p2_real())
1477              gpio_cfg_pin(&gpio_base->gpio_j1, 4, GPIO_OUTPUT);
1478         */
1479
1480         /* LCD_BACKLIGHT_EN */
1481         if (machine_is_geminus())
1482                 gpio_cfg_pin(&gpio_base->gpio_mp0_5, 0, GPIO_OUTPUT);
1483
1484         /*
1485          * gpio pad configuration for
1486          * DISPLAY_CS, DISPLAY_CLK, DISPLAY_SO, DISPLAY_SI.
1487          */
1488         gpio_cfg_pin(&gpio_base->gpio_mp0_1, 1, GPIO_OUTPUT);
1489         gpio_cfg_pin(&gpio_base->gpio_mp0_4, 1, GPIO_OUTPUT);
1490         gpio_cfg_pin(&gpio_base->gpio_mp0_4, 2, GPIO_INPUT);
1491         gpio_cfg_pin(&gpio_base->gpio_mp0_4, 3, GPIO_OUTPUT);
1492
1493         if (machine_is_aquila()) {
1494                 pd_cs.bank = &gpio_base->gpio_mp0_1;
1495                 pd_cs.num = 1;
1496                 pd_clk.bank = &gpio_base->gpio_mp0_4;
1497                 pd_clk.num = 1;
1498                 pd_si.bank = &gpio_base->gpio_mp0_4;
1499                 pd_si.num = 3;
1500                 pd_so.bank = &gpio_base->gpio_mp0_4;
1501                 pd_so.num = 2;
1502
1503                 /* these data would be sent to s6e63m0 lcd panel driver. */
1504                 s6e63m0_set_spi_interface(&pd_cs, &pd_clk, &pd_si, &pd_so);
1505         }
1506
1507         if (machine_is_cypress()) {
1508                 /* FLCD_CS */
1509                 gpio_cfg_pin(&gpio_base->gpio_mp0_1, 0, GPIO_OUTPUT);
1510                 /* FLCD_CLK */
1511                 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 0, GPIO_OUTPUT);
1512                 /* FLCD_SDI */
1513                 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 2, GPIO_OUTPUT);
1514                 /* FLCD_RST_S */
1515                 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 5, GPIO_OUTPUT);
1516                 /* FLCD_ON_S */
1517                 gpio_cfg_pin(&gpio_base->gpio_g2, 2, GPIO_OUTPUT);
1518
1519                 pd_cs.bank = &gpio_base->gpio_mp0_1;
1520                 pd_cs.num = 0;
1521                 pd_clk.bank = &gpio_base->gpio_mp0_4;
1522                 pd_clk.num = 0;
1523                 pd_si.bank = &gpio_base->gpio_mp0_4;
1524                 pd_si.num = 2;
1525
1526                 /* these data would be sent to s6e63m0 lcd panel driver. */
1527                 s6e63m0_set_spi_interface(&pd_cs, &pd_clk, &pd_si, NULL);
1528         }
1529
1530         return;
1531 }
1532
1533 void backlight_on(unsigned int onoff)
1534 {
1535         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1536
1537         if (onoff) {
1538                 if (machine_is_geminus())
1539                         gpio_set_value(&gpio->gpio_mp0_5, 0, 1);
1540         } else {
1541                 if (machine_is_geminus())
1542                         gpio_set_value(&gpio->gpio_mp0_5, 0, 0);
1543         }
1544 }
1545
1546 void reset_lcd(void)
1547 {
1548         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1549
1550         if (machine_is_aquila() || machine_is_geminus())
1551                 gpio_set_value(&gpio->gpio_mp0_5, 5, 1);
1552         if (machine_is_cypress())
1553                 gpio_set_value(&gpio->gpio_mp0_4, 5, 1);
1554 }
1555
1556 void lcd_power_on(unsigned int onoff)
1557 {
1558         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1559
1560         if (onoff) {
1561                 if (machine_is_aquila() || machine_is_geminus())
1562                         gpio_set_value(&gpio->gpio_j1, 3, 1);
1563
1564                 if (machine_is_cypress())
1565                         gpio_set_value(&gpio->gpio_g2, 2, 1);
1566
1567                 /*
1568                 if (board_is_p2_real())
1569                         gpio_set_value(&gpio->gpio_j1, 4, 1);
1570                 */
1571         } else {
1572                 if (machine_is_aquila() || machine_is_geminus())
1573                         gpio_set_value(&gpio->gpio_j1, 3, 0);
1574
1575                 if (machine_is_cypress())
1576                         gpio_set_value(&gpio->gpio_g2, 2, 0);
1577
1578                 /*
1579                 if (board_is_p2_real())
1580                      gpio_set_value(&gpio->gpio_j1, 4, 0);
1581                 */
1582         }
1583 }
1584
1585 extern void s6e63m0_cfg_ldo(void);
1586 extern void s6e63m0_enable_ldo(unsigned int onoff);
1587
1588 void init_panel_info(vidinfo_t *vid)
1589 {
1590         vid->cfg_gpio = NULL;
1591         vid->reset_lcd = NULL;
1592         vid->backlight_on = NULL;
1593         vid->lcd_power_on = NULL;
1594
1595         vid->cfg_ldo = NULL;
1596         vid->enable_ldo = NULL;
1597
1598         vid->init_delay = 0;
1599         vid->reset_delay = 0;
1600         vid->power_on_delay = 0;
1601
1602         vid->vl_freq    = 60;
1603         vid->vl_col     = 480;
1604         vid->vl_row     = 800;
1605         vid->vl_width   = 480;
1606         vid->vl_height  = 800;
1607
1608         vid->dual_lcd_enabled = 0;
1609
1610         if (board_is_media()) {
1611                 vid->vl_col     = 960;
1612                 vid->vl_row     = 800;
1613                 vid->vl_width   = 960;
1614                 vid->vl_height  = 800;
1615
1616                 /* enable dual lcd mode. */
1617                 vid->dual_lcd_enabled = 1;
1618         }
1619
1620         vid->vl_clkp    = CONFIG_SYS_HIGH;
1621         vid->vl_hsp     = CONFIG_SYS_LOW;
1622         vid->vl_vsp     = CONFIG_SYS_LOW;
1623         vid->vl_dp      = CONFIG_SYS_HIGH;
1624         vid->vl_bpix    = 32;
1625
1626         /* S6E63M0 LCD Panel */
1627         vid->vl_hspw    = 2;
1628         vid->vl_hbpd    = 16;
1629         vid->vl_hfpd    = 16;
1630
1631         vid->vl_vspw    = 2;
1632         vid->vl_vbpd    = 3;
1633         vid->vl_vfpd    = 28;
1634
1635         if (machine_is_aquila() || machine_is_cypress()) {
1636                 vid->cfg_gpio = lcd_cfg_gpio;
1637                 vid->reset_lcd = reset_lcd;
1638                 vid->backlight_on = backlight_on;
1639                 vid->lcd_power_on = lcd_power_on;
1640
1641                 vid->cfg_ldo = s6e63m0_cfg_ldo;
1642                 vid->enable_ldo = s6e63m0_enable_ldo;
1643
1644                 vid->init_delay = 25000;
1645                 vid->reset_delay = 120000;
1646         }
1647
1648         if (machine_is_geminus()) {
1649                 vid->vl_freq    = 60;
1650                 vid->vl_col     = 1024,
1651                 vid->vl_row     = 600,
1652                 vid->vl_width   = 1024,
1653                 vid->vl_height  = 600,
1654                 vid->vl_clkp    = CONFIG_SYS_LOW,
1655                 vid->vl_hsp     = CONFIG_SYS_HIGH,
1656                 vid->vl_vsp     = CONFIG_SYS_HIGH,
1657                 vid->vl_dp      = CONFIG_SYS_LOW,
1658                 vid->vl_bpix    = 32,
1659
1660                 vid->vl_hspw    = 32,
1661                 vid->vl_hfpd    = 48,
1662                 vid->vl_hbpd    = 80,
1663
1664                 vid->vl_vspw    = 1,
1665                 vid->vl_vfpd    = 3,
1666                 vid->vl_vbpd    = 4,
1667
1668                 vid->cfg_gpio = lcd_cfg_gpio;
1669                 vid->reset_lcd = reset_lcd;
1670                 vid->backlight_on = backlight_on;
1671                 vid->lcd_power_on = lcd_power_on;
1672         }
1673 #if 0
1674         vid->vl_freq    = 60;
1675         vid->vl_col     = 480,
1676         vid->vl_row     = 800,
1677         vid->vl_width   = 480,
1678         vid->vl_height  = 800,
1679         vid->vl_clkp    = CONFIG_SYS_HIGH,
1680         vid->vl_hsp     = CONFIG_SYS_LOW,
1681         vid->vl_vsp     = CONFIG_SYS_LOW,
1682         vid->vl_dp      = CONFIG_SYS_HIGH,
1683         vid->vl_bpix    = 32,
1684
1685         /* tl2796 panel. */
1686         vid->vl_hpw     = 4,
1687         vid->vl_blw     = 8,
1688         vid->vl_elw     = 8,
1689
1690         vid->vl_vpw     = 4,
1691         vid->vl_bfw     = 8,
1692         vid->vl_efw     = 8,
1693 #endif
1694 #if 0
1695         vid->vl_freq    = 60;
1696         vid->vl_col     = 1024,
1697         vid->vl_row     = 600,
1698         vid->vl_width   = 1024,
1699         vid->vl_height  = 600,
1700         vid->vl_clkp    = CONFIG_SYS_HIGH,
1701         vid->vl_hsp     = CONFIG_SYS_HIGH,
1702         vid->vl_vsp     = CONFIG_SYS_HIGH,
1703         vid->vl_dp      = CONFIG_SYS_LOW,
1704         vid->vl_bpix    = 32,
1705
1706         /* AMS701KA AMOLED Panel. */
1707         vid->vl_hpw     = 30,
1708         vid->vl_blw     = 114,
1709         vid->vl_elw     = 48,
1710
1711         vid->vl_vpw     = 2,
1712         vid->vl_bfw     = 6,
1713         vid->vl_efw     = 8,
1714 #endif
1715 }
1716 #endif
1717
1718 static void setup_meminfo(void)
1719 {
1720         char meminfo[64] = {0, };
1721         int count = 0, size, real;
1722
1723         size = gd->bd->bi_dram[0].size >> 20;
1724         count += sprintf(meminfo + count, "mem=%dM", size);
1725
1726         /* Each Chip Select can't exceed the 256MiB */
1727         size = gd->bd->bi_dram[1].size >> 20;
1728         real = min(size, 256);
1729         count += sprintf(meminfo + count, " mem=%dM@0x%x",
1730                 real, (unsigned int)gd->bd->bi_dram[1].start);
1731
1732         size -= real;
1733         if (size > 0) {
1734                 count += sprintf(meminfo + count, " mem=%dM@0x%x", size,
1735                         (unsigned int)gd->bd->bi_dram[1].start + (real << 20));
1736         }
1737
1738         setenv("meminfo", meminfo);
1739 }
1740
1741 int misc_init_r(void)
1742 {
1743 #ifdef CONFIG_LCD
1744         /* It should be located at first */
1745         lcd_is_enabled = 0;
1746
1747         if (board_is_limo_real() ||
1748                 board_is_limo_universal() ||
1749                 board_is_j1b2())
1750                 setenv("lcdinfo", "lcd=s6e63m0");
1751         /* it can't classify tl2796 with single-lcd and dual-lcd.
1752         else
1753                 setenv("lcdinfo", "lcd=tl2796-dual");
1754         */
1755
1756         /*
1757          * env values below should be added in case that lcd panel of geminus,
1758          * p1 and p2 are enabled at u-boot.
1759          * setenv means that lcd panel has been turned on at u-boot.
1760          */
1761         if (machine_is_geminus())
1762                 setenv("lcdinfo", "lcd=lms480jc01");
1763
1764         /*
1765         if (board_is_p2_real())
1766                 setenv("lcdinfo", "lcd=ams701");
1767         */
1768 #endif
1769         setup_meminfo();
1770
1771         show_hw_revision();
1772
1773         /* Set proper PMIC pins */
1774         pmic_pin_init();
1775
1776         /* Check auto burning */
1777         check_auto_burn();
1778
1779         /* To power up I2C2 */
1780         enable_ldos();
1781
1782         /* Enable T-Flash at Limo Real or Limo Universal */
1783         enable_t_flash();
1784
1785         /* Setup Limo Real board GPIOs */
1786         setup_limo_real_gpios();
1787
1788         /* Setup Media board GPIOs */
1789         setup_media_gpios();
1790
1791         /* Setup P1P2 board GPIOS */
1792         setup_p1p2_gpios();
1793
1794         /* To usbdown automatically */
1795         if (board_is_p2_real())
1796                 check_p2_keypad();
1797         else
1798                 check_keypad();
1799
1800         /* check max8998 */
1801         init_pmic();
1802
1803 #ifdef CONFIG_S5PC1XXFB
1804         display_device_info();
1805 #endif
1806
1807         setup_power_down_mode_registers();
1808
1809         /* check mcs5000 3-touch key */
1810         check_touchkey();
1811
1812         /* check max17040 */
1813         check_battery();
1814
1815         /* check fsa9480 */
1816         check_micro_usb(0);
1817
1818         return 0;
1819 }
1820 #endif
1821
1822 int board_init(void)
1823 {
1824         gd->bd->bi_arch_number = MACH_TYPE;
1825         gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
1826
1827         /* Check H/W Revision */
1828         check_hw_revision();
1829
1830         return 0;
1831 }
1832
1833 int dram_init(void)
1834 {
1835         unsigned int base, memconfig0, size;
1836         unsigned int memconfig1, sz = 0;
1837
1838         if (cpu_is_s5pc100()) {
1839                 /* In mem setup, we swap the bank. So below size is correct */
1840                 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
1841                 gd->bd->bi_dram[0].size = PHYS_SDRAM_2_SIZE;
1842                 gd->bd->bi_dram[1].start = S5PC100_PHYS_SDRAM_2;
1843                 size = 128;
1844         } else {
1845                 /* In S5PC110, we can't swap the DMC0/1 */
1846                 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
1847                 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
1848
1849                 base = S5PC110_DMC1_BASE;
1850                 /* DMC configuration */
1851                 memconfig0 = readl(base + MEMCONFIG0_OFFSET);
1852                 gd->bd->bi_dram[1].start = memconfig0 & 0xFF000000;
1853
1854                 size = (memconfig0 >> 16) & 0xFF;
1855                 size = ((unsigned char) ~size) + 1;
1856
1857                 /*
1858                  * (0x07 + 1) * 16 = 128 MiB
1859                  * (0x0f + 1) * 16 = 256 MiB
1860                  */
1861                 size = size << 4;
1862
1863                 /*
1864                  * Aquila Rev0.5 4G3G1G
1865                  * Aquila Rev0.7 4G3G1G
1866                  * Aquila Rev0.8 4G3G1G
1867                  */
1868                 if (machine_is_aquila() &&
1869                         (hwrevision(5) || hwrevision(7) || hwrevision(8))) {
1870                         memconfig1 = readl(base + MEMCONFIG1_OFFSET);
1871
1872                         sz = (memconfig1 >> 16) & 0xFF;
1873                         sz = ((unsigned char) ~sz) + 1;
1874                         sz = sz << 4;
1875                 }
1876
1877         }
1878         /*
1879          * bi_dram[1].size contains all DMC1 memory size
1880          */
1881         gd->bd->bi_dram[1].size = (size + sz) << 20;
1882
1883         return 0;
1884 }
1885
1886 /* Used for sleep test */
1887 static unsigned char saved_val[4][2];
1888 static unsigned int gpio_CP;
1889 static unsigned int gpio_T_FLASH;
1890 void board_sleep_init(void)
1891 {
1892         unsigned int value;
1893         unsigned char addr;
1894         unsigned char val[2];
1895         struct s5pc110_gpio *gpio =
1896                 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1897
1898         /* Set wakeup mask register */
1899         value = 0xFFFF;
1900         value &= ~(1 << 4);     /* Keypad */
1901         value &= ~(1 << 3);     /* RTC */
1902         value &= ~(1 << 2);     /* RTC Alarm */
1903         writel(value, S5PC110_WAKEUP_MASK);
1904
1905         /* Set external wakeup mask register */
1906         value = 0xFFFFFFFF;
1907         value &= ~(1 << 18);    /* T-Flash */
1908         writel(value, S5PC110_EINT_WAKEUP_MASK);
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         /* CP off */
1918         gpio_CP = gpio_get_value(&gpio->gpio_h3, 7);
1919         gpio_set_value(&gpio->gpio_h3, 7, 0);
1920         value = gpio_get_value(&gpio->gpio_h3, 7);
1921         /* MMC T_FLASH off */
1922         gpio_T_FLASH = gpio_get_value(&gpio->gpio_mp0_5, 4);
1923         gpio_set_value(&gpio->gpio_mp0_5, 4, 0);
1924         value = gpio_get_value(&gpio->gpio_mp0_5, 4);
1925         /* MHL off */
1926         gpio_set_value(&gpio->gpio_j2, 2, 0);
1927         gpio_set_value(&gpio->gpio_mp0_4, 7, 0);
1928         gpio_set_value(&gpio->gpio_j2, 3, 0); /* MHL_ON for REV02 or higher */
1929
1930         /* Set ONOFF1 */
1931         i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1932         saved_val[0][0] = val[0];
1933         saved_val[0][1] = val[1];
1934         val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) |
1935                         (1 << 1) | (1 << 0));
1936         i2c_write(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1937         i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1938         /* Set ONOFF2 */
1939         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1940         saved_val[1][0] = val[0];
1941         saved_val[1][1] = val[1];
1942         val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 3) |
1943                         (1 << 2) | (1 << 1) | (1 << 0));
1944         val[0] |= (1 << 7);
1945         i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1946         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1947         /* Set ONOFF3 */
1948         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1949         saved_val[2][0] = val[0];
1950         saved_val[2][1] = val[1];
1951         val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4));
1952         i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1953         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1954         /* Set ONOFF4 */
1955         i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1956         saved_val[3][0] = val[0];
1957         saved_val[3][1] = val[1];
1958         val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4));
1959         i2c_write(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1960         i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1961         printf("Turned off regulators. Preparing to sleep. [%s:%d]\n",
1962                         __FILE__, __LINE__);
1963 }
1964
1965 void board_sleep_resume(void)
1966 {
1967         unsigned int value;
1968         unsigned char addr;
1969         unsigned char val[2];
1970         struct s5pc110_gpio *gpio =
1971                 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1972
1973         show_hw_revision();
1974
1975         i2c_set_bus_num(I2C_PMIC);
1976         addr = 0xCC >> 1;
1977         if (i2c_probe(addr)) {
1978                 printf("Can't find max8998\n");
1979                 return;
1980         }
1981
1982         /* Set ONOFF1 */
1983         i2c_write(addr, MAX8998_REG_ONOFF1, 1, saved_val[0], 1);
1984         i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1985         /* Set ONOFF2 */
1986         i2c_write(addr, MAX8998_REG_ONOFF2, 1, saved_val[1], 1);
1987         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1988         /* Set ONOFF3 */
1989         i2c_write(addr, MAX8998_REG_ONOFF3, 1, saved_val[2], 1);
1990         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1991         /* Set ONOFF4 */
1992         i2c_write(addr, MAX8998_REG_ONOFF3+1, 1, saved_val[3], 1);
1993         i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1994         printf("Waked up.\n");
1995
1996         /* CP */
1997         gpio_set_value(&gpio->gpio_h3, 7, gpio_CP);
1998         value = gpio_get_value(&gpio->gpio_h3, 7);
1999         /* MMC T_FLASH */
2000         gpio_set_value(&gpio->gpio_mp0_5, 4, gpio_T_FLASH);
2001         value = gpio_get_value(&gpio->gpio_mp0_5, 4);
2002
2003         /* check max17040 */
2004         check_battery();
2005
2006         /* check fsa9480 */
2007         check_micro_usb(1);
2008 }
2009
2010 #ifdef CONFIG_CMD_USBDOWN
2011 int usb_board_init(void)
2012 {
2013 #ifdef CONFIG_CMD_PMIC
2014         run_command("pmic ldo 3 on", 0);
2015 #endif
2016
2017         if (cpu_is_s5pc100()) {
2018 #ifdef CONFIG_HARD_I2C
2019                 uchar val[2] = {0,};
2020
2021                 /* PMIC */
2022                 if (i2c_read(0x66, 0, 1, val, 2)) {
2023                         printf("i2c_read error\n");
2024                         return 1;
2025                 }
2026
2027                 val[0] |= (1 << 3);
2028                 val[1] |= (1 << 5);
2029
2030                 if (i2c_write(0x66, 0, 1, val, 2)) {
2031                         printf("i2c_write error\n");
2032                         return 1;
2033                 }
2034                 i2c_read(0x66, 0, 1, val, 2);
2035 #endif
2036                 return 0;
2037         }
2038
2039         /* S5PC110 */
2040         if (board_is_limo_universal() ||
2041                 board_is_limo_real() ||
2042                 board_is_media()) {
2043                 /* check usb path */
2044                 if (board_is_limo_real() && !hwrevision(6))
2045                         check_mhl();
2046         }
2047
2048         if (machine_is_tickertape()) {
2049                 struct s5pc110_gpio *gpio =
2050                         (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
2051
2052                 /* USB_SEL: XM0ADDR_0: MP04[0] output mode */
2053                 gpio_direction_output(&gpio->gpio_mp0_4, 0, 0);
2054         }
2055
2056         return 0;
2057 }
2058 #endif
2059
2060 #ifdef CONFIG_GENERIC_MMC
2061 int board_mmc_init(bd_t *bis)
2062 {
2063         unsigned int reg;
2064         unsigned int clock;
2065         struct s5pc110_clock *clk = (struct s5pc110_clock *)S5PC1XX_CLOCK_BASE;
2066         struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
2067         int i;
2068
2069         /* MMC0 Clock source = SCLKMPLL */
2070         reg = readl(&clk->src4);
2071         reg &= ~0xf;
2072         reg |= 0x6;
2073         writel(reg, &clk->src4);
2074
2075         reg = readl(&clk->div4);
2076         reg &= ~0xf;
2077
2078         /* set div value near 50MHz */
2079         clock = get_pll_clk(MPLL) / 1000000;
2080         for (i = 0; i < 0xf; i++) {
2081                 if ((clock / (i + 1)) <= 50) {
2082                         reg |= i << 0;
2083                         break;
2084                 }
2085         }
2086
2087         writel(reg, &clk->div4);
2088
2089         /*
2090          * MMC0 GPIO
2091          * GPG0[0]      SD_0_CLK
2092          * GPG0[1]      SD_0_CMD
2093          * GPG0[2]      SD_0_CDn
2094          * GPG0[3:6]    SD_0_DATA[0:3]
2095          */
2096         for (i = 0; i < 7; i++) {
2097                 /* GPG0[0:6] special function 2 */
2098                 gpio_cfg_pin(&gpio->gpio_g0, i, 0x2);
2099                 /* GPG0[0:6] pull up */
2100                 gpio_set_pull(&gpio->gpio_g0, i, GPIO_PULL_UP);
2101         }
2102
2103         return s5pc1xx_mmc_init(0);
2104 }
2105 #endif
2106
2107 #ifdef CONFIG_CMD_PMIC
2108 static int pmic_status(void)
2109 {
2110         unsigned char addr, val[2];
2111         int reg, i;
2112
2113         i2c_set_bus_num(I2C_PMIC);
2114         addr = 0xCC >> 1;
2115         if (i2c_probe(addr)) {
2116                 printf("Can't found max8998\n");
2117                 return -1;
2118         }
2119
2120         reg = 0x11;
2121         i2c_read(addr, reg, 1, val, 1);
2122         for (i = 7; i >= 4; i--)
2123                 printf("BUCK%d %s\n", 7 - i + 1,
2124                         val[0] & (1 << i) ? "on" : "off");
2125         for (; i >= 0; i--)
2126                 printf("LDO%d %s\n", 5 - i,
2127                         val[0] & (1 << i) ? "on" : "off");
2128         reg = 0x12;
2129         i2c_read(addr, reg, 1, val, 1);
2130         for (i = 7; i >= 0; i--)
2131                 printf("LDO%d %s\n", 7 - i + 6,
2132                         val[0] & (1 << i) ? "on" : "off");
2133         reg = 0x13;
2134         i2c_read(addr, reg, 1, val, 1);
2135         for (i = 7; i >= 4; i--)
2136                 printf("LDO%d %s\n", 7 - i + 14,
2137                         val[0] & (1 << i) ? "on" : "off");
2138         return 0;
2139 }
2140
2141 static int pmic_ldo_control(int buck, int ldo, int on)
2142 {
2143         unsigned char addr, val[2];
2144         unsigned int reg, shift;
2145
2146         if (ldo) {
2147                 if (ldo < 2)
2148                         return -1;
2149                 if (ldo <= 5) {
2150                         reg = 0x11;
2151                         shift = 5 - ldo;
2152                 } else if (ldo <= 13) {
2153                         reg = 0x12;
2154                         shift = 13 - ldo;
2155                 } else if (ldo <= 17) {
2156                         reg = 0x13;
2157                         shift = 17 - ldo + 4;
2158                 } else
2159                         return -1;
2160         } else if (buck) {
2161                 if (buck > 4)
2162                         return -1;
2163                 reg = 0x11;
2164                 shift = 4 - buck + 4;
2165         } else
2166                 return -1;
2167
2168         i2c_set_bus_num(I2C_PMIC);
2169         addr = 0xCC >> 1;
2170         if (i2c_probe(addr)) {
2171                 printf("Can't found max8998\n");
2172                 return -1;
2173         }
2174
2175         i2c_read(addr, reg, 1, val, 1);
2176         if (on)
2177                 val[0] |= (1 << shift);
2178         else
2179                 val[0] &= ~(1 << shift);
2180         i2c_write(addr, reg, 1, val, 1);
2181         i2c_read(addr, reg, 1, val, 1);
2182         printf("%s %d value 0x%x, %s\n", buck ? "buck" : "ldo", buck ? : ldo,
2183                 val[0], val[0] & (1 << shift) ? "on" : "off");
2184
2185         return 0;
2186 }
2187
2188 static int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
2189 {
2190         int buck = 0, ldo = 0, on = -1;
2191
2192         switch (argc) {
2193         case 2:
2194                 if (strncmp(argv[1], "status", 6) == 0)
2195                         return pmic_status();
2196                 break;
2197         case 4:
2198                 if (strncmp(argv[1], "ldo", 3) == 0) {
2199                         ldo = simple_strtoul(argv[2], NULL, 10);
2200                         if (strncmp(argv[3], "on", 2) == 0)
2201                                 on = 1;
2202                         else if (strncmp(argv[3], "off", 3) == 0)
2203                                 on = 0;
2204                         else
2205                                 break;
2206                         return pmic_ldo_control(buck, ldo, on);
2207                 }
2208                 if (strncmp(argv[1], "buck", 4) == 0) {
2209                         buck = simple_strtoul(argv[2], NULL, 10);
2210                         if (strncmp(argv[3], "on", 2) == 0)
2211                                 on = 1;
2212                         else if (strncmp(argv[3], "off", 3) == 0)
2213                                 on = 0;
2214                         else
2215                                 break;
2216                         return pmic_ldo_control(buck, ldo, on);
2217                 }
2218
2219         default:
2220                 break;
2221         }
2222
2223         cmd_usage(cmdtp);
2224         return 1;
2225 }
2226
2227 U_BOOT_CMD(
2228         pmic,           CONFIG_SYS_MAXARGS,     1, do_pmic,
2229         "PMIC LDO & BUCK control",
2230         "status - Display PMIC LDO & BUCK status\n"
2231         "pmic ldo num on/off - Turn on/off the LDO\n"
2232         "pmic buck num on/off - Turn on/off the BUCK\n"
2233 );
2234 #endif