tizen 2.3.1 release
[platform/kernel/u-boot.git] / board / samsung / universal_c110 / 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 <malloc.h>
28 #include <asm/io.h>
29 #include <asm/arch/clk.h>
30 #include <asm/arch/clock.h>
31 #include <asm/arch/gpio.h>
32 #include <asm/arch/keypad.h>
33 #include <asm/arch/mmc.h>
34 #include <asm/arch/power.h>
35 #include <asm/arch/mem.h>
36 #include <asm/arch/hs_otg.h>
37 #include <asm/arch/regs-otg.h>
38 #include <asm/arch/rtc.h>
39 #include <asm/arch/adc.h>
40 #include <mipi_ddi.h>
41 #include <asm/errno.h>
42 #include <fbutils.h>
43 #include <lcd.h>
44 #include <spi.h>
45 #include <bmp_layout.h>
46 #include <ramoops.h>
47 #include <pmic.h>
48
49 #include "animation_frames.h"
50 #include "gpio_setting.h"
51 #include "usb_mass_storage.h"
52
53 DECLARE_GLOBAL_DATA_PTR;
54
55 #define C100_MACH_START                 3000
56 #define C110_MACH_START                 3100
57
58 static unsigned int arch_number;
59 static unsigned int board_rev;
60 static unsigned int battery_soc;
61 static struct s5pc110_gpio *gpio;
62
63 enum {
64         I2C_2,
65         I2C_GPIO3,
66         I2C_PMIC,
67         I2C_GPIO5,
68         I2C_GPIO6,
69         I2C_GPIO7,
70         I2C_GPIO10,
71         I2C_NUM,
72 };
73
74 /*
75  * i2c 2
76  * SDA: GPD1[4]
77  * SCL: GPD1[5]
78  */
79 static struct i2c_gpio_bus_data i2c_2 = {
80         .sda_pin        = 4,
81         .scl_pin        = 5,
82 };
83
84 /*
85  * i2c gpio3
86  * SDA: GPJ3[6]
87  * SCL: GPJ3[7]
88  */
89 static struct i2c_gpio_bus_data i2c_gpio3 = {
90         .sda_pin        = 6,
91         .scl_pin        = 7,
92 };
93
94 /*
95  * i2c pmic
96  * SDA: GPJ4[0]
97  * SCL: GPJ4[3]
98  */
99 static struct i2c_gpio_bus_data i2c_pmic = {
100         .sda_pin        = 0,
101         .scl_pin        = 3,
102 };
103
104 /*
105  * i2c gpio5
106  * SDA: MP05[3]
107  * SCL: MP05[2]
108  */
109 static struct i2c_gpio_bus_data i2c_gpio5 = {
110         .sda_pin        = 3,
111         .scl_pin        = 2,
112 };
113
114 /*
115  * i2c gpio6
116  * SDA: GPJ3[4]
117  * SCL: GPJ3[5]
118  */
119 static struct i2c_gpio_bus_data i2c_gpio6 = {
120         .sda_pin        = 4,
121         .scl_pin        = 5,
122 };
123
124 /*
125  * i2c gpio7 - goni
126  * SDA: MP05[1]
127  * SCL: MP05[0]
128  */
129 static struct i2c_gpio_bus_data i2c_gpio7 = {
130         .sda_pin        = 1,
131         .scl_pin        = 0,
132 };
133
134 /*
135  * i2c gpio7 - cypress
136  * SDA: MP05[6]
137  * SCL: MP05[4]
138  */
139 static struct i2c_gpio_bus_data i2c_cypress_gpio7 = {
140         .sda_pin        = 6,
141         .scl_pin        = 4,
142 };
143
144 /*
145  * i2c gpio10
146  * SDA: GPJ3[0]
147  * SCL: GPJ3[1]
148  */
149 static struct i2c_gpio_bus_data i2c_gpio10 = {
150         .sda_pin        = 0,
151         .scl_pin        = 1,
152 };
153
154 static struct i2c_gpio_bus i2c_gpio[I2C_NUM];
155
156 u32 get_board_rev(void)
157 {
158         return board_rev;
159 }
160
161 static int hwrevision(int rev)
162 {
163         return (board_rev & 0xf) == rev;
164 }
165
166 enum {
167         MACH_UNIVERSAL,
168         MACH_TICKERTAPE,
169         MACH_CHANGED,
170         MACH_P1P2,      /* Don't remove it */
171         MACH_GEMINUS,
172         MACH_CYPRESS,
173
174         MACH_WMG160 = 160,
175
176         MACH_PSEUDO_END,
177 };
178
179 #define SPLIT_SCREEN_FEATURE    0x100
180
181 /* board is MACH_AQUILA and board is like below. */
182 #define J1_B2_BOARD             0x0200
183 #define LIMO_UNIVERSAL_BOARD    0x0400
184 #define LIMO_REAL_BOARD         0x0800
185 #define MEDIA_BOARD             0x1000
186 #define BAMBOO_BOARD            0x2000
187
188 /* board is MACH_GONI and board is like below */
189 #define S1_BOARD                0x1000
190 #define HAYDN_BOARD             0x2000
191 #define KESSLER_BOARD           0x4000
192 #define SDK_BOARD               0x8000
193
194 #define BOARD_MASK              0xFF00
195
196 static int c110_machine_id(void)
197 {
198         return arch_number - C110_MACH_START;
199 }
200
201 static int mach_is_aquila(void)
202 {
203         return arch_number == MACH_TYPE_AQUILA;
204 }
205
206 static int mach_is_tickertape(void)
207 {
208         return c110_machine_id() == MACH_TICKERTAPE;
209 }
210
211 static int mach_is_geminus(void)
212 {
213         return c110_machine_id() == MACH_GEMINUS;
214 }
215
216 static int mach_is_cypress(void)
217 {
218         return c110_machine_id() == MACH_CYPRESS;
219 }
220
221 static int board_is_limo_universal(void)
222 {
223         return mach_is_aquila() && (board_rev & LIMO_UNIVERSAL_BOARD);
224 }
225
226 static int board_is_limo_real(void)
227 {
228         return mach_is_aquila() && (board_rev & LIMO_REAL_BOARD);
229 }
230
231 static int board_is_bamboo(void)
232 {
233         return mach_is_aquila() && (board_rev & BAMBOO_BOARD);
234 }
235
236 static int board_is_media(void)
237 {
238         return mach_is_aquila() && (board_rev & MEDIA_BOARD);
239 }
240
241 static int board_is_j1b2(void)
242 {
243         return mach_is_aquila() && (board_rev & J1_B2_BOARD);
244 }
245
246 /* Kessler */
247 static int mach_is_goni(void)
248 {
249         return arch_number == MACH_TYPE_GONI;
250 }
251
252 static int board_is_sdk(void)
253 {
254         return mach_is_goni() && (board_rev & SDK_BOARD);
255 }
256
257 static int board_is_s1(void)
258 {
259         return mach_is_goni() && (board_rev & S1_BOARD);
260 }
261
262
263 static int board_is_haydn(void)
264 {
265         return mach_is_goni() && (board_rev & HAYDN_BOARD);
266 }
267
268 /* DLNA Dongle */
269 static int mach_is_wmg160(void)
270 {
271         return c110_machine_id() == MACH_WMG160;
272 }
273
274 #ifdef CONFIG_AVS_TEST
275 static int board_has_AVS(void)
276 {
277         return board_is_sdk() && hwrevision(6);
278 }
279 #else
280 static int board_has_AVS(void)
281 {
282         return 0;
283 }
284 #endif
285
286 static void check_battery(int mode);
287 static void check_micro_usb(int intr);
288
289 static struct i2c_gpio_bus i2c_gpio[] = {
290         {
291                 .bus    = &i2c_2,
292         }, {
293                 .bus    = &i2c_gpio3,
294         }, {
295                 .bus    = &i2c_pmic,
296         }, {
297                 .bus    = &i2c_gpio5,
298         }, {
299                 .bus    = &i2c_gpio6,
300         }, {
301                 .bus    = &i2c_gpio7,
302         }, {
303                 .bus    = &i2c_gpio10,
304         },
305 };
306
307 void i2c_init_board(void)
308 {
309         i2c_gpio[I2C_2].bus = &i2c_2;
310         i2c_gpio[I2C_GPIO3].bus = &i2c_gpio3;
311         i2c_gpio[I2C_PMIC].bus = &i2c_pmic;
312         i2c_gpio[I2C_GPIO5].bus = &i2c_gpio5;
313         i2c_gpio[I2C_GPIO6].bus = &i2c_gpio6;
314         i2c_gpio[I2C_GPIO7].bus = &i2c_gpio7;
315         i2c_gpio[I2C_GPIO10].bus = &i2c_gpio10;
316
317         if (mach_is_aquila()) {
318                 i2c_gpio[I2C_GPIO6].bus->gpio_base = 0;
319                 i2c_gpio[I2C_GPIO7].bus->gpio_base = 0;
320         } else if (mach_is_goni()) {
321                 i2c_gpio[I2C_GPIO7].bus->gpio_base =
322                         (unsigned int)&gpio->mp0_5;
323         } else if (mach_is_cypress()) {
324                 i2c_gpio[I2C_GPIO7].bus = &i2c_cypress_gpio7;
325                 i2c_gpio[I2C_GPIO7].bus->gpio_base =
326                         (unsigned int)&gpio->mp0_5;
327         } else {
328                 i2c_gpio[I2C_GPIO7].bus->gpio_base = 0;
329         }
330
331         if (board_has_AVS()) { /* no I2C2. it's used by AVS-IEM */
332                 static int printed = 0;
333                 struct s5p_gpio_bank *bank =
334                         (struct s5p_gpio_bank *)(&gpio->d1);
335                 /* set GPD1CON[4], [5] as IEM_SPWI/SCLK */
336                 gpio_cfg_pin(bank, 4, 0x2); /* IEM_SCLK */
337                 gpio_cfg_pin(bank, 5, 0x2); /* IEM_SPWI */
338
339                 i2c_gpio[I2C_2].bus->gpio_base = 0;
340                 if (!printed) {
341                         puts("(I2C2 Diabled. AVS Mode) ");
342                         printed = 1;
343                 }
344         } else {
345                 i2c_gpio[I2C_2].bus->gpio_base =
346                         (unsigned int)&gpio->d1;
347         }
348
349         i2c_gpio[I2C_GPIO3].bus->gpio_base =
350                 (unsigned int)&gpio->j3;
351         i2c_gpio[I2C_PMIC].bus->gpio_base =
352                 (unsigned int)&gpio->j4;
353         i2c_gpio[I2C_GPIO5].bus->gpio_base =
354                 (unsigned int)&gpio->mp0_5;
355         i2c_gpio[I2C_GPIO6].bus->gpio_base =
356                 (unsigned int)&gpio->j3;
357
358         i2c_gpio_init(i2c_gpio, I2C_NUM, I2C_PMIC);
359
360         /* Reset on fsa9480 early */
361         check_micro_usb(1);
362         /* Reset on max17040 early */
363         check_battery(1);
364 }
365
366 #ifdef CONFIG_MISC_INIT_R
367 #define DEV_INFO_LEN            256
368 static char device_info[DEV_INFO_LEN];
369 static int display_info;
370
371 static void empty_device_info_buffer(void)
372 {
373         memset(device_info, 0x0, DEV_INFO_LEN);
374 }
375
376 static void dprintf(const char *fmt, ...)
377 {
378         va_list args;
379         uint i;
380         char buf[128];
381
382         va_start(args, fmt);
383         i = vsprintf(buf, fmt, args);
384         va_end(args);
385
386         buf[127] = 0;
387
388         if ((strlen(device_info) + strlen(buf)) > (DEV_INFO_LEN - 1)) {
389                 puts("Flushing device info...\n");
390                 puts(device_info);
391                 empty_device_info_buffer();
392         }
393         strncat(device_info, buf, 127);
394         puts(buf);
395 }
396
397 #ifdef CONFIG_S5PC1XXFB
398 static void display_device_info(void)
399 {
400         if (!display_info)
401                 return;
402
403         init_font();
404         set_font_xy(0, 450);
405         set_font_color(FONT_WHITE);
406         fb_printf(device_info);
407         exit_font();
408
409         memset(device_info, 0x0, DEV_INFO_LEN);
410
411         udelay(5 * 1000 * 1000);
412 }
413 #endif
414
415 static const char *board_name[] = {
416         "Universal",
417         "TickerTape",
418         "Goni",
419         "P1P2",         /* Don't remove it */
420         "Geminus",
421         "Cypress",
422         "Limo SDK",
423 };
424
425 enum {
426         MEM_4G1G1G,
427         MEM_4G2G1G,
428         MEM_4G3G1G,
429         MEM_4G4G1G,
430 };
431
432 static char feature_buffer[32];
433
434 static char *display_features(int board, int board_rev)
435 {
436         int count = 0;
437         char *buf = feature_buffer;
438         char *name = NULL;
439
440         if (board == MACH_TYPE_AQUILA) {
441                 if (board_rev & SPLIT_SCREEN_FEATURE)
442                         name = "SplitScreen";
443                 if (board_rev & J1_B2_BOARD)
444                         name = "J1 B2";
445                 /* Limo Real or Universal */
446                 if (board_rev & LIMO_REAL_BOARD)
447                         name = "Limo Real";
448                 else if (board_rev & LIMO_UNIVERSAL_BOARD)
449                         name = "Limo Universal";
450                 if (board_rev & MEDIA_BOARD)
451                         name = "Media";
452                 if (board_rev & BAMBOO_BOARD)
453                         name = "Bamboo";
454         } else if (board == MACH_TYPE_GONI) {
455                 if (board_rev & SDK_BOARD) {
456                         if (hwrevision(9)) {
457                                 name = "Kessler";
458                         } else {
459                                 if (hwrevision(3))
460                                         name = "SLP SDK 4.3inch";
461                                 else if (hwrevision(4))
462                                         name = "SLP SDK 4.5inch";
463                                 else
464                                         name = "SLP SDK";
465                         }
466                 }
467                 if (board_rev & S1_BOARD)
468                         name = "S1";
469                 if (board_rev & HAYDN_BOARD)
470                         name = "Haydn";
471         }
472         if (name)
473                 count += sprintf(buf + count, " - %s", name);
474
475         return buf;
476 }
477
478 static char *get_board_name(int board)
479 {
480         if (board == MACH_TYPE_AQUILA)
481                 return "Aquila";
482         else if (board == MACH_TYPE_GONI)
483                 return "Goni";
484         else if (board == MACH_WMG160)
485                 return "WMG160";
486         return (char *) board_name[board];
487 }
488
489 static void check_board_revision(int board, int rev)
490 {
491         if (board == MACH_TYPE_AQUILA) {
492                 /* Limo Real or Universal */
493                 if (rev & LIMO_UNIVERSAL_BOARD)
494                         board_rev &= ~J1_B2_BOARD;
495                 if (rev & LIMO_REAL_BOARD)
496                         board_rev &= ~(J1_B2_BOARD |
497                                         LIMO_UNIVERSAL_BOARD);
498                 if (rev & MEDIA_BOARD)
499                         board_rev &= ~(J1_B2_BOARD |
500                                         LIMO_UNIVERSAL_BOARD);
501                 if (rev & BAMBOO_BOARD)
502                         board_rev &= ~(J1_B2_BOARD |
503                                         LIMO_UNIVERSAL_BOARD |
504                                         LIMO_REAL_BOARD |
505                                         MEDIA_BOARD);
506         } else if (board == MACH_TYPE_GONI) {
507                 if (rev & KESSLER_BOARD)
508                         board_rev &= ~(J1_B2_BOARD |
509                                         LIMO_UNIVERSAL_BOARD);
510                 if (rev & SDK_BOARD)
511                         board_rev &= ~(J1_B2_BOARD |
512                                         LIMO_UNIVERSAL_BOARD);
513                 if (rev & S1_BOARD)
514                         board_rev &= ~(J1_B2_BOARD | LIMO_UNIVERSAL_BOARD |
515                                         LIMO_REAL_BOARD);
516                 if (rev & HAYDN_BOARD)
517                         board_rev &= ~(J1_B2_BOARD | LIMO_UNIVERSAL_BOARD |
518                                         LIMO_REAL_BOARD);
519         } else {
520                 board_rev &= ~BOARD_MASK;
521         }
522 }
523
524 static unsigned int get_hw_revision(struct s5p_gpio_bank *bank, int hwrev3)
525 {
526         unsigned int rev;
527
528         gpio_direction_input(bank, 2);
529         gpio_direction_input(bank, 3);
530         gpio_direction_input(bank, 4);
531         gpio_direction_input(bank, hwrev3);
532
533         gpio_set_pull(bank, 2, GPIO_PULL_NONE);         /* HWREV_MODE0 */
534         gpio_set_pull(bank, 3, GPIO_PULL_NONE);         /* HWREV_MODE1 */
535         gpio_set_pull(bank, 4, GPIO_PULL_NONE);         /* HWREV_MODE2 */
536         gpio_set_pull(bank, hwrev3, GPIO_PULL_NONE);    /* HWREV_MODE3 */
537
538         rev = gpio_get_value(bank, 2);
539         rev |= (gpio_get_value(bank, 3) << 1);
540         rev |= (gpio_get_value(bank, 4) << 2);
541         rev |= (gpio_get_value(bank, hwrev3) << 3);
542
543         return rev;
544 }
545
546 static void check_hw_revision(void)
547 {
548         unsigned int board = MACH_UNIVERSAL;    /* Default is Universal */
549         int hwrev3 = 1;
550
551         board_rev = 0;
552
553         /*
554          * Note Check 'Aquila' board first
555          *
556          * TT: TickerTape
557          * SS: SplitScreen
558          * LRA: Limo Real Aquila
559          * LUA: Limo Universal Aquila
560          * OA: Old Aquila
561          * CYP: Cypress
562          * BB: Bamboo
563          *
564          * ADDR = 0xE0200000 + OFF
565          *
566          *       OFF    Universal BB   LRA  LUA  OA   TT   SS        CYP
567          *   J1: 0x0264 0x10      0x10 0x00 0x00 0x00 0x00 0x00
568          *   J2: 0x0284           0x01 0x10 0x00
569          *   H1: 0x0C24    W           0x28 0xA8 0x1C                0x0F
570          *   H3: 0x0C64                0x03 0x07 0x0F
571          *   D1: 0x00C4 0x0F           0x3F 0x3F 0x0F 0xXC 0x3F
572          *    I: 0x0224                          0x02 0x00 0x08
573          * MP03: 0x0324                          0x9x      0xbx 0x9x
574          * MP05: 0x0364                          0x80      0x88
575          */
576
577         /* C110 Aquila */
578         if (gpio_get_value(&gpio->j1, 4) == 0) {
579                 board = MACH_TYPE_AQUILA;
580                 board_rev |= J1_B2_BOARD;
581
582                 gpio_set_pull(&gpio->j2, 6, GPIO_PULL_NONE);
583                 gpio_direction_input(&gpio->j2, 6);
584
585                 /* Check board */
586                 if (gpio_get_value(&gpio->h1, 2) == 0)
587                         board_rev |= LIMO_UNIVERSAL_BOARD;
588
589                 if (gpio_get_value(&gpio->h3, 2) == 0)
590                         board_rev |= LIMO_REAL_BOARD;
591
592                 if (gpio_get_value(&gpio->j2, 6) == 1)
593                         board_rev |= MEDIA_BOARD;
594
595                 /* set gpio to default value. */
596                 gpio_set_pull(&gpio->j2, 6, GPIO_PULL_DOWN);
597                 gpio_direction_output(&gpio->j2, 6, 0);
598         }
599
600         /* Workaround: C110 Aquila Rev0.6 */
601         if (board_rev == 6) {
602                 board = MACH_TYPE_AQUILA;
603                 board_rev |= LIMO_REAL_BOARD;
604         }
605
606         /* C110 Aquila Bamboo */
607         if (gpio_get_value(&gpio->j2, 0) == 1) {
608                 board = MACH_TYPE_AQUILA;
609                 board_rev |= BAMBOO_BOARD;
610         }
611
612         /* C110 TickerTape */
613         if (gpio_get_value(&gpio->d1, 0) == 0 &&
614                         gpio_get_value(&gpio->d1, 1) == 0)
615                 board = MACH_TICKERTAPE;
616
617         /* WMG160 - GPH3[0:4] = 0x00 */
618         if (board == MACH_TICKERTAPE) {
619                 int i, wmg160 = 1;
620
621                 for (i = 0; i < 4; i++) {
622                         if (gpio_get_value(&gpio->h3, i) != 0) {
623                                 wmg160 = 0;
624                                 break;
625                         }
626                 }
627                 if (wmg160) {
628                         board = MACH_WMG160;
629                         hwrev3 = 7;
630                 }
631         }
632
633         /* C110 Geminus for rev0.0 */
634         gpio_set_pull(&gpio->j1, 2, GPIO_PULL_NONE);
635         gpio_direction_input(&gpio->j1, 2);
636         if (gpio_get_value(&gpio->j1, 2) == 1) {
637                 board = MACH_GEMINUS;
638                 if ((board_rev & ~BOARD_MASK) == 3)
639                         board_rev &= ~0xff;
640         }
641         gpio_set_pull(&gpio->j1, 2, GPIO_PULL_DOWN);
642         gpio_direction_output(&gpio->j1, 2, 0);
643
644         /* C110 Geminus for rev0.1 ~ */
645         gpio_set_pull(&gpio->j0, 6, GPIO_PULL_NONE);
646         gpio_direction_input(&gpio->j0, 6);
647         if (gpio_get_value(&gpio->j0, 6) == 1) {
648                 board = MACH_GEMINUS;
649                 hwrev3 = 7;
650         }
651         gpio_set_pull(&gpio->j0, 6, GPIO_PULL_DOWN);
652
653         /* Kessler MP0_5[6] == 1 */
654         gpio_direction_input(&gpio->mp0_5, 6);
655         if (gpio_get_value(&gpio->mp0_5, 6) == 1) {
656                 /* Cypress: Do this for cypress */
657                 gpio_set_pull(&gpio->j2, 2, GPIO_PULL_NONE);
658                 gpio_direction_input(&gpio->j2, 2);
659                 if (gpio_get_value(&gpio->j2, 2) == 1) {
660                         board = MACH_CYPRESS;
661                         gpio_direction_output(&gpio->mp0_5, 6, 0);
662                 } else {
663                         board = MACH_TYPE_GONI;
664                         board_rev |= KESSLER_BOARD;
665 #if 0
666                         /* workaround: temporarily use sdk rev0.5 */
667                         board_rev |= SDK_BOARD;
668
669 #endif
670                         /* Limo SDK MP0_5[4] == 1 */
671                         gpio_direction_input(&gpio->mp0_5, 4);
672                         if (gpio_get_value(&gpio->mp0_5, 4) == 1) {
673                                 board_rev &= ~KESSLER_BOARD;
674
675 #if 0
676                                 /* Haydn MP0_4[0] == 1 */
677                                 gpio_direction_input(
678                                                 &gpio->mp0_4, 0);
679                                 if (gpio_get_value(
680                                                         &gpio->mp0_4, 0) == 1)
681                                         board_rev |= HAYDN_BOARD;
682                                 else
683 #endif
684                                         board_rev |= SDK_BOARD;
685                         }
686
687                 }
688                 gpio_set_pull(&gpio->j2, 2, GPIO_PULL_DOWN);
689                 hwrev3 = 7;
690         } else {
691                 gpio_direction_output(&gpio->mp0_5, 6, 0);
692                 /* Goni S1 board detection */
693                 if (board == MACH_TICKERTAPE) {
694                         board = MACH_TYPE_GONI;
695                         board_rev |= S1_BOARD;
696                         hwrev3 = 7;
697                 }
698         }
699
700         board_rev |= get_hw_revision(&gpio->j0, hwrev3);
701
702         /* Set machine id */
703         if (board < MACH_PSEUDO_END)
704                 arch_number = C110_MACH_START + board;
705         else
706                 arch_number = board;
707 }
708
709 static void check_cpu_revision(void)
710 {
711         int board;
712
713         /*
714          * Workaround for Rev 0.3 + CP Ver ES 3.1
715          * it's Rev 0.4
716          */
717         if (board_is_limo_real()) {
718                 if (hwrevision(0)) {
719                         /* default is Rev 0.4 */
720                         board_rev &= ~0xf;
721                         board_rev |= 0x4;
722                 }
723         }
724
725         if (mach_is_goni() || mach_is_aquila())
726                 board = arch_number;
727         else
728                 board = arch_number - C110_MACH_START;
729
730         check_board_revision(board, board_rev);
731
732         /* Set CPU Revision */
733         if (mach_is_aquila()) {
734                 if (board_is_limo_real()) {
735                         if ((board_rev & 0xf) < 8)
736                                 s5p_set_cpu_rev(0);
737                 } else if (board_is_bamboo())
738                         s5p_set_cpu_rev(0);
739         } else if (mach_is_goni()) {
740                 if (board_is_sdk() && (hwrevision(2) || hwrevision(4) ||
741                                         hwrevision(5) || hwrevision(6)))
742                         s5p_set_cpu_rev(2);     /* EVT1-Fused */
743                 else
744                         s5p_set_cpu_rev(1);
745         } else if (mach_is_geminus()) {
746                 if ((board_rev & 0xf) < 1)
747                         s5p_set_cpu_rev(0);
748         } else if (mach_is_cypress()) {
749                 s5p_set_cpu_rev(1);
750         } else if (mach_is_wmg160()) {
751                 if (hwrevision(5))
752                         s5p_set_cpu_rev(0);
753                 else
754                         s5p_set_cpu_rev(2);
755         } else {
756                 s5p_set_cpu_rev(0);
757         }
758
759         writel(0xc1100000 | (0xffff & (s5p_get_cpu_rev() ? 1 : 0)),
760                                 S5PC110_INFORM3);
761
762 }
763
764 static void show_hw_revision(void)
765 {
766         int board;
767
768         if (mach_is_goni() || mach_is_aquila())
769                 board = arch_number;
770         else
771                 board = arch_number - C110_MACH_START;
772
773         check_board_revision(board, board_rev);
774
775         empty_device_info_buffer();
776         dprintf("HW Revision:\t%x (%s%s) %s\n",
777                 board_rev, get_board_name(board),
778                 display_features(board, board_rev),
779                 s5p_get_cpu_rev() ? "" : "EVT0");
780 }
781
782 void get_rev_info(char *rev_info)
783 {
784         int board;
785
786         if (mach_is_goni() || mach_is_aquila())
787                 board = arch_number;
788         else
789                 board = arch_number - C110_MACH_START;
790
791         check_board_revision(board, board_rev);
792
793         sprintf(rev_info, "HW Revision: %x (%s%s) %s\n",
794                 board_rev, get_board_name(board),
795                 display_features(board, board_rev),
796                 s5p_get_cpu_rev() ? "" : "EVT0");
797 }
798
799 static void check_auto_burn(void)
800 {
801         unsigned long magic_base = CONFIG_SYS_SDRAM_BASE + 0x02000000;
802         unsigned int count = 0;
803         char buf[64];
804
805         /* OneNAND */
806         if (readl(magic_base) == 0x426f6f74) {  /* ASICC: Boot */
807                 puts("Auto burning bootloader\n");
808                 count += sprintf(buf + count, "run updateb; ");
809         }
810         /* MMC */
811         if (readl(magic_base) == 0x654D4D43) {  /* ASICC: eMMC */
812                 puts("Auto burning bootloader (eMMC)\n");
813                 count += sprintf(buf + count, "run updatemmc; ");
814         }
815         if (readl(magic_base + 0x04) == 0x4b65726e) {   /* ASICC: Kern */
816                 puts("Auto burning kernel\n");
817                 count += sprintf(buf + count, "run updatek; ");
818         }
819         /* Backup u-boot in eMMC */
820         if (readl(magic_base + 0x8) == 0x4261636B) {    /* ASICC: Back */
821                 puts("Auto buring u-boot image (boot partition2 in eMMC)\n");
822                 count += sprintf(buf + count, "run updatebackup; ");
823         }
824
825         if (count) {
826                 count += sprintf(buf + count, "reset");
827                 setenv("bootcmd", buf);
828         }
829
830         /* Clear the magic value */
831         memset((void*) magic_base, 0, 2);
832 }
833
834 static void pmic_pin_init(void)
835 {
836         unsigned int reg, value;
837
838         /* AP_PS_HOLD: XEINT_0: GPH0[0]
839          * Note: Don't use GPIO PS_HOLD it doesn't work
840          */
841         reg = S5PC110_PS_HOLD_CONTROL;
842         value = readl(reg);
843         value |= S5PC110_PS_HOLD_DIR_OUTPUT |
844                 S5PC110_PS_HOLD_DATA_HIGH |
845                 S5PC110_PS_HOLD_OUT_EN;
846         writel(value, reg);
847
848         /* nPOWER: XEINT_22: GPH2[6] interrupt mode */
849         gpio_cfg_pin(&gpio->h2, 6, GPIO_IRQ);
850         gpio_set_pull(&gpio->h2, 6, GPIO_PULL_UP);
851 }
852
853 static void enable_ldos(void)
854 {
855         /* TOUCH_EN: XMMC3DATA_3: GPG3[6] output high */
856         gpio_direction_output(&gpio->g3, 6, 1);
857 }
858
859 static void enable_t_flash(void)
860 {
861         if (!(board_is_limo_universal() || board_is_limo_real()))
862                 return;
863
864         /* T_FLASH_EN : XM0ADDR_13: MP0_5[4] output high */
865         gpio_direction_output(&gpio->mp0_5, 4, 1);
866 }
867
868 static void setup_limo_real_gpios(void)
869 {
870         if (!board_is_limo_real())
871                 return;
872
873         /*
874          * Note: Please write GPIO alphabet order
875          */
876         if (hwrevision(0))
877                 /* RESET_REQ_N: XM0BEN_1: MP0_2[1] output high */
878                 gpio_direction_output(&gpio->mp0_2, 1, 1);
879         else
880                 /* RESET_REQ_N: XM0CSn_2: MP0_1[2] output high */
881                 gpio_direction_output(&gpio->mp0_1, 2, 1);
882 }
883
884 static void setup_media_gpios(void)
885 {
886         if (!board_is_media())
887                 return;
888
889         /*
890          * Note: Please write GPIO alphabet order
891          */
892         /* RESET_REQ_N: XM0CSn_2: MP0_1[2] output high */
893         gpio_direction_output(&gpio->mp0_1, 2, 1);
894 }
895
896 static void check_battery(int mode)
897 {
898         unsigned char val[2];
899         unsigned char addr = 0x36;      /* max17040 fuel gauge */
900
901         i2c_set_bus_num(I2C_GPIO3);
902
903         if (mach_is_aquila()) {
904                 if (board_is_j1b2())
905                         return;
906         } else if (mach_is_goni()) {
907                 i2c_set_bus_num(I2C_GPIO7);
908         } else if (mach_is_cypress()) {
909                 i2c_set_bus_num(I2C_GPIO7);
910         } else if (mach_is_geminus()) {
911                 if (hwrevision(1))
912                         i2c_set_bus_num(I2C_GPIO7);
913         } else
914                 return;
915
916         if (i2c_probe(addr)) {
917                 puts("Can't found max17040 fuel gauge\n");
918                 return;
919         }
920
921         /* mode 0: check mode / 1: enable mode */
922         if (mode) {
923                 val[0] = 0x40;
924                 val[1] = 0x00;
925                 i2c_write(addr, 0xfe, 1, val, 2);
926         } else {
927                 i2c_read(addr, 0x04, 1, val, 1);
928                 dprintf("battery:\t%d%%\n", val[0]);
929                 battery_soc = val[0];
930         }
931 }
932
933 static void check_mhl(void)
934 {
935         unsigned char val[2];
936         unsigned char addr = 0x39;      /* SIL9230 */
937
938         /* MHL Power enable */
939         /* HDMI_EN : GPJ2[2] XMSMDATA_2 output mode */
940         gpio_direction_output(&gpio->j2, 2, 1);
941
942         /* MHL_RST : MP0_4[7] XM0ADDR_7 output mode */
943         gpio_direction_output(&gpio->mp0_4, 7, 0);
944
945         /* 10ms required after reset */
946         udelay(10000);
947
948         /* output enable */
949         gpio_set_value(&gpio->mp0_4, 7, 1);
950
951         i2c_set_bus_num(I2C_GPIO5);
952
953         /* set usb path */
954         if (i2c_probe(addr)) {
955                 puts("Can't found MHL Chip\n");
956                 return;
957         }
958
959         /*
960          * System Control #1
961          * set to Normal operation
962          */
963         val[0] = 0x35;
964         i2c_write((0x72 >> 1), 0x08, 1, val, 1);
965         i2c_read((0x72 >> 1), 0x08, 1, val, 1);
966
967         /*
968          * MHL TX Control #1
969          * TERM_MODE [7:6]
970          * 00 = MHL termination ON
971          * 11 = MHL termination OFF
972          */
973         val[0] = 0xd0;
974         i2c_write((0x72 >> 1), 0xa0, 1, val, 1);
975         i2c_read((0x72 >> 1), 0xa0, 1, val, 1);
976 }
977
978 static int max8998_probe(void)
979 {
980         unsigned char addr = 0xCC >> 1;
981
982         i2c_set_bus_num(I2C_PMIC);
983
984         if (i2c_probe(addr)) {
985                 puts("Can't found max8998\n");
986                 return 1;
987         }
988
989         return 0;
990 }
991
992 #define CHARGER_ANIMATION_FRAME         6
993 static void max8998_clear_interrupt(void)
994 {
995         unsigned char addr, val[2];
996         addr = 0xCC >> 1;
997
998         if (max8998_probe())
999                 return;
1000
1001         i2c_read(addr, 0x00, 1, val, 1);
1002         i2c_read(addr, 0x01, 1, val, 1);
1003         i2c_read(addr, 0x02, 1, val, 1);
1004         i2c_read(addr, 0x03, 1, val, 1);
1005 }
1006
1007 int check_exit_key(void)
1008 {
1009         return pmic_get_irq(PWRON1S);
1010 }
1011
1012 #define KBR3            (1 << 3)
1013 #define KBR2            (1 << 2)
1014 #define KBR1            (1 << 1)
1015 #define KBR0            (1 << 0)
1016
1017 static void check_keypad(void)
1018 {
1019         unsigned int reg, value;
1020         unsigned int col_num, row_num;
1021         unsigned int col_mask;
1022         unsigned int col_mask_shift;
1023         unsigned int row_state[4];
1024         unsigned int i, power_key;
1025         unsigned int auto_download = 0;
1026
1027         if (mach_is_wmg160())
1028                 return;
1029
1030         if (board_is_limo_real() || board_is_limo_universal()) {
1031                 row_num = 2;
1032                 col_num = 3;
1033         } else {
1034                 row_num = 4;
1035                 col_num = 4;
1036         }
1037
1038         for (i = 0; i < row_num; i++) {
1039                 if (board_is_sdk() &&
1040                                 (hwrevision(3) || hwrevision(4)) && i == 0)
1041                         continue;
1042
1043                 /* Set GPH3[3:0] to KP_ROW[3:0] */
1044                 gpio_cfg_pin(&gpio->h3, i, 0x3);
1045                 gpio_set_pull(&gpio->h3, i, GPIO_PULL_UP);
1046         }
1047
1048         for (i = 0; i < col_num; i++)
1049                 /* Set GPH2[3:0] to KP_COL[3:0] */
1050                 gpio_cfg_pin(&gpio->h2, i, 0x3);
1051
1052         reg = S5PC110_KEYPAD_BASE;
1053         col_mask = S5PC110_KEYIFCOLEN_MASK;
1054         col_mask_shift = 8;
1055
1056         /* KEYIFCOL reg clear */
1057         writel(0, reg + S5PC1XX_KEYIFCOL_OFFSET);
1058
1059         /* power_key check */
1060         power_key = pmic_get_irq(PWRONR);
1061
1062         /* key_scan */
1063         for (i = 0; i < col_num; i++) {
1064                 value = col_mask;
1065                 value &= ~(1 << i) << col_mask_shift;
1066
1067                 writel(value, reg + S5PC1XX_KEYIFCOL_OFFSET);
1068                 udelay(1000);
1069
1070                 value = readl(reg + S5PC1XX_KEYIFROW_OFFSET);
1071                 row_state[i] = ~value & ((1 << row_num) - 1);
1072         }
1073
1074         /* KEYIFCOL reg clear */
1075         writel(0, reg + S5PC1XX_KEYIFCOL_OFFSET);
1076
1077         if (mach_is_aquila() || mach_is_goni()) {
1078                 /* volume down */
1079                 if (row_state[1] & 0x2)
1080                         display_info = 1;
1081                 if (board_is_sdk() && hwrevision(0)) {
1082                         /* home & volume down
1083                          * or hold key & volume down*/
1084                         if ((power_key || (row_state[1] & 0x1))
1085                                                 && (row_state[1] & 0x2))
1086                                 auto_download = 1;
1087                 } else if (board_is_sdk() && hwrevision(2)) {
1088                         /* cam full shot & volume down
1089                          * or hold key & volume down */
1090                         if ((power_key || (row_state[1] & 0x6))
1091                                                 && (row_state[2] & 0x4))
1092                                 auto_download = 1;
1093                 } else if (board_is_sdk() && (hwrevision(3) || hwrevision(4) ||
1094                                                 hwrevision(6))) {
1095                         /* cam full shot & volume down
1096                          * or hold key & volume down */
1097                         if ((power_key || (row_state[1] & 0x6))
1098                                                 && (row_state[2] & 0x4))
1099                                 auto_download = 1;
1100                 } else {
1101                         /* cam full shot & volume down
1102                          * or hold key & volume down */
1103                         if ((power_key || (row_state[0] & 0x1))
1104                                                 && (row_state[1] & 0x2))
1105                                 auto_download = 1;
1106                 }
1107         } else if (mach_is_geminus())
1108                 /* volume down & home or hold key & volume down */
1109                 if ((row_state[1] & 0x2) && ((power_key || row_state[2] & 0x1)))
1110                         auto_download = 1;
1111
1112         if (auto_download)
1113                 setenv("bootcmd", "usbdown");
1114 }
1115
1116
1117 static int max8998_has_ext_power_source(void)
1118 {
1119         unsigned char addr, val[2];
1120         addr = 0xCC >> 1;
1121
1122         if (max8998_probe())
1123                 return 0;
1124
1125         /* Accessing STATUS2 register */
1126         i2c_read(addr, 0x09, 1, val, 1);
1127         if (val[0] & (1 << 5))
1128                 return 1;
1129
1130         return 0;
1131 }
1132
1133 struct thermister_stat {
1134         short centigrade;
1135         unsigned short adc;
1136 };
1137
1138 static struct thermister_stat adc_to_temperature_data[] = {
1139         { .centigrade = -20,    .adc = 1856, },
1140         { .centigrade = -15,    .adc = 1799, },
1141         { .centigrade = -10,    .adc = 1730, },
1142         { .centigrade = -5,     .adc = 1649, },
1143         { .centigrade = 0,      .adc = 1556, },
1144         { .centigrade = 5,      .adc = 1454, },
1145         { .centigrade = 10,     .adc = 1343, },
1146         { .centigrade = 15,     .adc = 1227, },
1147         { .centigrade = 20,     .adc = 1109, },
1148         { .centigrade = 25,     .adc = 992, },
1149         { .centigrade = 30,     .adc = 880, },
1150         { .centigrade = 35,     .adc = 773, },
1151         { .centigrade = 40,     .adc = 675, },
1152         { .centigrade = 45,     .adc = 586, },
1153         { .centigrade = 50,     .adc = 507, },
1154         { .centigrade = 55,     .adc = 436, },
1155         { .centigrade = 58,     .adc = 399, },
1156         { .centigrade = 63,     .adc = 343, },
1157         { .centigrade = 65,     .adc = 322, },
1158 };
1159
1160 #ifndef USHRT_MAX
1161 #define USHRT_MAX       0xFFFFU
1162 #endif
1163 static int adc_to_temperature_centigrade(unsigned short adc)
1164 {
1165         int i;
1166         int approximation;
1167         /* low_*: Greatest Lower Bound,
1168          *          *          *          * high_*: Smallest Upper Bound */
1169         int low_temp = 0, high_temp = 0;
1170         unsigned short low_adc = 0, high_adc = USHRT_MAX;
1171         for (i = 0; i < ARRAY_SIZE(adc_to_temperature_data); i++) {
1172                 if (adc_to_temperature_data[i].adc <= adc &&
1173                                 adc_to_temperature_data[i].adc >= low_adc) {
1174                         low_temp = adc_to_temperature_data[i].centigrade;
1175                         low_adc = adc_to_temperature_data[i].adc;
1176                 }
1177                 if (adc_to_temperature_data[i].adc >= adc &&
1178                                 adc_to_temperature_data[i].adc <= high_adc) {
1179                         high_temp = adc_to_temperature_data[i].centigrade;
1180                         high_adc = adc_to_temperature_data[i].adc;
1181                 }
1182         }
1183
1184         /* Linear approximation between cloest low and high,
1185          * which is the weighted average of the two. */
1186
1187         /* The following equation is correct only when the two are different */
1188         if (low_adc == high_adc)
1189                 return low_temp;
1190         if (ARRAY_SIZE(adc_to_temperature_data) < 2)
1191                 return 20; /* The room temperature */
1192         if (low_adc == 0)
1193                 return high_temp;
1194         if (high_adc == USHRT_MAX)
1195                 return low_temp;
1196
1197         approximation = low_temp * (adc - low_adc) +
1198                 high_temp * (high_adc - adc);
1199         approximation /= high_adc - low_adc;
1200
1201         return approximation;
1202 }
1203
1204 static int adc_get_average_ambient_temperature(void)
1205 {
1206         if (mach_is_goni()) {
1207                 unsigned short min = USHRT_MAX;
1208                 unsigned short max = 0;
1209                 unsigned int sum = 0;
1210                 unsigned int measured = 0;
1211                 int i;
1212
1213                 run_command("pmic ldo 4 on", 0);
1214
1215                 for (i = 0; i < 7; i++) {
1216                         unsigned short measurement = get_adc_value(6);
1217                         sum += measurement;
1218                         measured++;
1219                         if (min > measurement)
1220                                 min = measurement;
1221                         if (max < measurement)
1222                                 max = measurement;
1223                 }
1224
1225                 run_command("pmic ldo 4 off", 0);
1226
1227                 if (measured >= 3) {
1228                         measured -= 2;
1229                         sum -= min;
1230                         sum -= max;
1231                 }
1232                 sum /= measured;
1233                 printf("Average Ambient Temperature = %d(ADC=%d)\n",
1234                                 adc_to_temperature_centigrade(sum), sum);
1235                 return adc_to_temperature_centigrade(sum);
1236         }
1237
1238         return 20; /* 20 Centigrade */
1239 }
1240
1241 enum temperature_level {
1242         _TEMP_OK,
1243         _TEMP_OK_HIGH,
1244         _TEMP_OK_LOW,
1245         _TEMP_TOO_HIGH,
1246         _TEMP_TOO_LOW,
1247 };
1248
1249 static enum temperature_level temperature_check(void)
1250 {
1251         int temp = adc_get_average_ambient_temperature();
1252         if (temp < -5)
1253                 return _TEMP_TOO_LOW;
1254         if (temp < 0)
1255                 return _TEMP_OK_LOW;
1256         if (temp > 63)
1257                 return _TEMP_TOO_HIGH;
1258         if (temp > 58)
1259                 return _TEMP_OK_HIGH;
1260         return _TEMP_OK;
1261 }
1262
1263 static void charger_en(int enable)
1264 {
1265         /* 0: disable
1266          * 600: 600mA
1267          * 475: 475mA
1268          */
1269         unsigned char addr = 0xCC >> 1; /* max8998 */
1270         unsigned char val[2];
1271
1272         if (max8998_probe())
1273                 return;
1274
1275         if (!enable) {
1276                 puts("Disable the charger.\n");
1277                 i2c_read(addr, 0x0D, 1, val, 1);
1278                 val[0] &= ~(0x1);
1279                 val[0] |= 0x1;
1280                 i2c_write(addr, 0x0D, 1, val, 1);
1281         } else {
1282                 i2c_read(addr, 0x0C, 1, val, 1);
1283                 val[0] &= ~(0x7 << 0);
1284                 val[0] &= ~(0x7 << 5);
1285                 if (enable == 600) {
1286                         val[0] |= 5; /* 600mA */
1287                         val[0] |= (3 << 5); /* Stop at 150mA (25%) */
1288                 } else { /* Assume 475 mA */
1289                         enable = 475;
1290                         val[0] |= 2; /* 475mA */
1291                         val[0] |= (4 << 5); /* Stop at 142.5mA (30%) */
1292                 }
1293                 i2c_write(addr, 0x0C, 1, val, 1);
1294
1295                 i2c_read(addr, 0x0D, 1, val, 1);
1296                 val[0] &= ~(0x1);
1297                 i2c_write(addr, 0x0D, 1, val, 1);
1298                 printf("Enable the charger @ %dmA\n", enable);
1299         }
1300 }
1301
1302 void lcd_power_on(unsigned int onoff);
1303 extern int do_sleep(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
1304 extern int drv_lcd_init_resume(void);
1305
1306 static void into_charge_mode(void)
1307 {
1308         struct s5pc110_rtc *rtc = (struct s5pc110_rtc *)S5PC110_RTC_BASE;
1309         enum temperature_level previous_state = _TEMP_OK;
1310         unsigned int level;
1311         int i, j;
1312         bmp_image_t *bmp;
1313         unsigned long len;
1314         ulong bmp_addr[CHARGER_ANIMATION_FRAME];
1315         unsigned int reg, wakeup_stat;
1316         int charger_speed = 600;
1317
1318         max8998_clear_interrupt();
1319
1320         puts("Charge Mode\n");
1321         charger_en(charger_speed);
1322
1323 #ifdef CONFIG_S5PC1XXFB
1324         init_font();
1325
1326         /* TODO: write the image-text for the charger */
1327
1328         level = battery_soc * CHARGER_ANIMATION_FRAME / 100;
1329         if (level >= CHARGER_ANIMATION_FRAME)
1330                 level = CHARGER_ANIMATION_FRAME - 1;
1331
1332         for (i = 0; i < CHARGER_ANIMATION_FRAME; i++)
1333                 bmp_addr[i] = (ulong)battery_charging_animation[i];
1334
1335         lcd_display_clear();
1336         for (i = 0; i < 3; i++) {
1337                 for (j = level; j < CHARGER_ANIMATION_FRAME; j++) {
1338                         int k;
1339
1340                         bmp = gunzip_bmp(bmp_addr[j], &len);
1341                         lcd_display_bitmap((ulong)bmp, 140, 202);
1342                         free(bmp);
1343
1344                         for (k = 0; k < 10; k++) {
1345                                 if (pmic_get_irq(PWRONF)) {
1346                                         lcd_display_clear();
1347                                         goto restore_screen;
1348                                 } else if (!max8998_has_ext_power_source()) {
1349                                         lcd_display_clear();
1350                                         goto restore_screen;
1351                                 } else {
1352                                         udelay(100 * 1000);
1353                                 }
1354                         }
1355                 }
1356         }
1357         exit_font();
1358
1359         /* Disable the display to prevent flickering */
1360         /* TODO: how to reenable the display later? */
1361         lcd_power_on(0);
1362 #endif
1363
1364         do {
1365                 unsigned int org, org_ip3;
1366
1367                 empty_device_info_buffer();
1368                 if (pmic_get_irq(PWRONF))
1369                         break;
1370                 else if (!max8998_has_ext_power_source())
1371                         break;
1372
1373                 /* Enable RTC, SYSTIMER, ADC at CLKGATE IP3 */
1374                 org_ip3 = readl(0xE010046C);
1375                 writel(org_ip3 | (1 << 15) | (1 << 16) | (1 << 24), 0xE010046C);
1376
1377                 reg = org = readl(&rtc->rtccon);
1378                 reg |= (1 << 0);
1379                 writel(reg, &rtc->rtccon);
1380
1381                 reg = readl(&rtc->rtccon);
1382                 writel(reg | (1 << 3), &rtc->rtccon);
1383                 udelay(10);
1384                 writel(reg & ~(1 << 3), &rtc->rtccon);
1385                 udelay(10);
1386
1387                 reg = readl(&rtc->rtccon);
1388                 reg &= ~((1 << 8) | (0xF << 4));
1389                 reg |= (1 << 8) | (0xD << 4); /* D: 4 Hz, 9: 64 Hz */
1390                 writel(reg, &rtc->rtccon);
1391
1392                 reg = 15 * 4 - 1; /* 15 sec */
1393                 writel(reg, &rtc->ticcnt);
1394
1395                 /* EVT0: sleep 1, EVT1: sleep */
1396                 if (cpu_is_s5pc110()) {
1397                         char *name = "dummy";
1398                         char *usage = "N/A";
1399                         char *help = NULL;
1400                         cmd_tbl_t ctt;
1401                         ctt.name = name;
1402                         ctt.usage = usage;
1403                         ctt.help = help;
1404
1405                         if (s5p_get_cpu_rev() == 0) {
1406                                 char *argv[] = {"1", "1"};
1407                                 wakeup_stat = do_sleep(&ctt, 0, 2, argv);
1408                         } else {
1409                                 char *argv[] = {"0", "0"};
1410                                 wakeup_stat = do_sleep(&ctt, 0, 1, argv);
1411                         }
1412                 }
1413
1414                 /* Check TEMP HIGH/LOW */
1415                 switch (temperature_check()) {
1416                 case _TEMP_OK:
1417                         charger_en(charger_speed);
1418                         previous_state = _TEMP_OK;
1419                         break;
1420                 case _TEMP_TOO_LOW:
1421                         charger_en(0);
1422                         previous_state = _TEMP_TOO_LOW;
1423                         break;
1424                 case _TEMP_TOO_HIGH:
1425                         charger_en(0);
1426                         previous_state = _TEMP_TOO_HIGH;
1427                         break;
1428                 case _TEMP_OK_LOW:
1429                         if (previous_state == _TEMP_TOO_LOW) {
1430                                 charger_en(0);
1431                         } else {
1432                                 charger_en(charger_speed);
1433                                 previous_state = _TEMP_OK;
1434                         }
1435                         break;
1436                 case _TEMP_OK_HIGH:
1437                         if (previous_state == _TEMP_TOO_HIGH) {
1438                                 charger_en(0);
1439                         } else {
1440                                 charger_en(charger_speed);
1441                                 previous_state = _TEMP_OK;
1442                         }
1443                         break;
1444                 }
1445
1446                 writel(org, &rtc->rtccon);
1447                 writel(org_ip3, 0xE010046C);
1448
1449         } while (wakeup_stat == 0x04); /* RTC TICK */
1450
1451 #ifdef CONFIG_S5PC1XXFB
1452 restore_screen:
1453         /* TODO: Reenable logo display (not working yet) */
1454         lcd_power_on(1);
1455         drv_lcd_init_resume();
1456 #endif
1457 }
1458
1459 #define S5PC110_RST_STAT        0xE010A000
1460
1461 #define SWRESET                 (1 << 3)
1462 #define WDTRESET                (1 << 2)
1463 #define WARMRESET               (1 << 1)
1464 #define EXTRESET                (1 << 0)
1465
1466 static int get_reset_status(void)
1467 {
1468         return readl(S5PC110_RST_STAT) & 0xf;
1469 }
1470
1471 static void check_reset_status(void)
1472 {
1473         int status = get_reset_status();
1474
1475         puts("Reset Status: ");
1476
1477         switch (status) {
1478         case EXTRESET:
1479                 puts("Pin(Ext) Reset\n");
1480                 break;
1481         case WARMRESET:
1482                 puts("Warm Reset\n");
1483                 break;
1484         case WDTRESET:
1485                 puts("Watchdog Reset\n");
1486                 break;
1487         case SWRESET:
1488                 puts("S/W Reset\n");
1489                 break;
1490         default:
1491                 printf("Unknown (0x%x)\n", status);
1492         }
1493 }
1494
1495 static int fsa9480_probe(void)
1496 {
1497         unsigned char addr = 0x25;
1498
1499         if (board_is_limo_real()) {
1500                 if (hwrevision(0) || hwrevision(1))
1501                         return 1;
1502         }
1503
1504         i2c_set_bus_num(I2C_PMIC);
1505
1506         if (mach_is_goni()) {
1507                 i2c_set_bus_num(I2C_GPIO6);
1508         } else if (mach_is_cypress()) {
1509                 i2c_set_bus_num(I2C_GPIO6);
1510         } else if (mach_is_geminus()) {
1511                 if (hwrevision(1))
1512                         i2c_set_bus_num(I2C_GPIO6);
1513         } else if (mach_is_wmg160()) {
1514                 i2c_set_bus_num(I2C_GPIO6);
1515         }
1516
1517         if (i2c_probe(addr)) {
1518                 puts("Can't found fsa9480\n");
1519                 return 1;
1520         }
1521
1522         return 0;
1523 }
1524
1525 static void check_micro_usb(int intr)
1526 {
1527         unsigned char addr;
1528         unsigned char val[2];
1529         static int started_charging_once = 0;
1530         char *path;
1531
1532         if (fsa9480_probe())
1533                 return;
1534
1535         addr = 0x25;            /* fsa9480 */
1536
1537         /* Clear Interrupt */
1538         if (intr) {
1539                 i2c_read(addr, 0x03, 1, val, 2);
1540                 return;
1541         }
1542
1543         /* Read Device Type 1 */
1544         i2c_read(addr, 0x0a, 1, val, 1);
1545
1546 #define FSA_DEV1_CHARGER        (1 << 6)
1547 #define FSA_DEV1_UART           (1 << 3)
1548 #define FSA_DEV1_USB            (1 << 2)
1549 #define FSA_DEV2_JIG_USB_OFF    (1 << 1)
1550 #define FSA_DEV2_JIG_USB_ON     (1 << 0)
1551
1552         /*
1553          * If USB, use default 475mA
1554          * If Charger, use 600mA and go to charge mode
1555          */
1556         if ((val[0] & FSA_DEV1_CHARGER) && !started_charging_once) {
1557                 started_charging_once = 1;
1558
1559                 /* If it's full, do not charge. */
1560                 if (battery_soc < 100)
1561                         into_charge_mode();
1562                 else
1563                         charger_en(0);
1564         } else if (val[0] & FSA_DEV1_USB) {
1565                 if (battery_soc < 100)
1566                         charger_en(475); /* enable charger and keep booting */
1567                 else
1568                         charger_en(0);
1569         }
1570
1571         /* If reset status is watchdog reset then skip it */
1572         if (!(get_reset_status() & SWRESET)) {
1573                 /* If Factory Mode is Boot ON-USB, go to download mode */
1574                 i2c_read(addr, 0x07, 1, val, 1);
1575
1576 #define FSA_ADC_FAC_USB_OFF     0x18
1577 #define FSA_ADC_FAC_USB_ON      0x19
1578 #define FSA_ADC_FAC_UART        0x1d
1579
1580                 if (val[0] == FSA_ADC_FAC_USB_ON ||
1581                         val[0] == FSA_ADC_FAC_USB_OFF)
1582                         setenv("bootcmd", "usbdown");
1583         }
1584
1585         path = getenv("usb");
1586
1587         if (!strncmp(path, "cp", 2))
1588                 run_command("microusb cp", 0);
1589 }
1590
1591 static void micro_usb_switch(int path)
1592 {
1593         unsigned char addr;
1594         unsigned char val[2];
1595
1596         if (fsa9480_probe())
1597                 return;
1598
1599         addr = 0x25;            /* fsa9480 */
1600
1601         if (path)
1602                 val[0] = 0x90;  /* VAUDIO */
1603         else
1604                 val[0] = (1 << 5) | (1 << 2);   /* DHOST */
1605
1606         i2c_write(addr, 0x13, 1, val, 1);       /* MANSW1 */
1607
1608         i2c_read(addr, 0x2, 1, val, 1);
1609         val[0] &= ~(1 << 2);                    /* Manual switching */
1610         i2c_write(addr, 0x2, 1, val, 1);
1611 }
1612
1613 #define FSA_REG_CONTROL 0x02
1614 #define FSA_REG_INT1 0x03
1615 #define FSA_REG_DEV_TYPE1 0x0A
1616
1617 #define FSA_INTB (1 << 0)
1618 #define FSA_INT1_DETACH (1 << 1)
1619 /* Both functions use SW polling technique to obtain the state of FSA9480 device */
1620 /* AFAIK - HW interrupts aren't used on u-boot (at least for this purpose) */
1621
1622 int micro_usb_attached(void)
1623 {
1624         unsigned char addr;
1625         unsigned char val;
1626
1627         if (fsa9480_probe())
1628                 return -1;
1629
1630         addr = 0x25;    /* fsa9480 */
1631
1632         /* Setup control register */
1633         i2c_read(addr, FSA_REG_CONTROL, 1, &val, 1);
1634
1635         val |= FSA_INTB; /* Mask INTB interrupt */
1636         i2c_write(addr, FSA_REG_CONTROL, 1, &val, 1);
1637
1638         i2c_read(addr, FSA_REG_DEV_TYPE1, 1, &val, 1);
1639
1640         if (val & FSA_DEV1_USB)
1641                 return 1;
1642
1643         return 0;
1644 }
1645
1646 int micro_usb_detach(void)
1647 {
1648         unsigned char addr;
1649         unsigned char val[2];
1650
1651         if (fsa9480_probe())
1652                 return -1;
1653
1654         addr = 0x25;    /* fsa9480 */
1655
1656         /* Read interrupt status register */
1657         i2c_read(addr, FSA_REG_INT1, 1, val, 2);
1658
1659         if (val[0] & FSA_INT1_DETACH) {
1660                 puts("USB cable detached !!!\n");
1661                 return 1;
1662         }
1663
1664         return 0;
1665 }
1666
1667 #define MAX8998_REG_ONOFF1      0x11
1668 #define MAX8998_REG_ONOFF2      0x12
1669 #define MAX8998_REG_ONOFF3      0x13
1670 #define MAX8998_REG_ONOFF4      0x14
1671 #define MAX8998_REG_LDO7        0x21
1672 #define MAX8998_REG_LDO17       0x29
1673 /* ONOFF1 */
1674 #define MAX8998_LDO3            (1 << 2)
1675 /* ONOFF2 */
1676 #define MAX8998_LDO6            (1 << 7)
1677 #define MAX8998_LDO7            (1 << 6)
1678 #define MAX8998_LDO8            (1 << 5)
1679 #define MAX8998_LDO9            (1 << 4)
1680 #define MAX8998_LDO10           (1 << 3)
1681 #define MAX8998_LDO11           (1 << 2)
1682 #define MAX8998_LDO12           (1 << 1)
1683 #define MAX8998_LDO13           (1 << 0)
1684 /* ONOFF3 */
1685 #define MAX8998_LDO14           (1 << 7)
1686 #define MAX8998_LDO15           (1 << 6)
1687 #define MAX8998_LDO16           (1 << 5)
1688 #define MAX8998_LDO17           (1 << 4)
1689
1690
1691 static void init_pmic(void)
1692 {
1693         unsigned char addr;
1694         unsigned char val[2];
1695
1696         addr = 0xCC >> 1;       /* max8998 */
1697         if (max8998_probe())
1698                 return;
1699
1700         /* ONOFF1 */
1701         i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1702         val[0] &= ~MAX8998_LDO3;
1703         i2c_write(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1704
1705         /* ONOFF2 */
1706         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1707         /*
1708          * Disable LDO8(USB_3.3V), LDO10(VPLL_1.1V), LDO11(CAM_IO_2.8V),
1709          * LDO12(CAM_ISP_1.2V), LDO13(CAM_A_2.8V)
1710          */
1711         val[0] &= ~(MAX8998_LDO8 | MAX8998_LDO10 | MAX8998_LDO11 |
1712                         MAX8998_LDO12 | MAX8998_LDO13);
1713
1714         if (mach_is_goni())
1715                 val[0] |= MAX8998_LDO7;         /* LDO7: VLCD_1.8V */
1716
1717         i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1718         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1719         /* ONOFF3 */
1720         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1721         /*
1722          * Disable LDO14(CAM_CIF_1.8), LDO15(CAM_AF_3.3V),
1723          * LDO16(VMIPI_1.8V), LDO17(CAM_8M_1.8V)
1724          */
1725         val[0] &= ~(MAX8998_LDO14 | MAX8998_LDO15 |
1726                         MAX8998_LDO16 | MAX8998_LDO17);
1727
1728         if (mach_is_goni())
1729                 val[0] |= MAX8998_LDO17;        /* LDO17: VCC_3.0V_LCD */
1730
1731         i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1732         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1733 }
1734
1735 static void setup_power_down_mode_registers(void)
1736 {
1737         struct s5p_gpio_bank *bank;
1738         struct gpio_powermode *p;
1739         int n_p;
1740         struct gpio_external *ge;
1741         int n_ge;
1742         struct s5pc1xx_gpio_item *mr;
1743         int n_mr;
1744         int i;
1745
1746         /* Only Limo real and kessler supports worked for sleep currnet */
1747         if (mach_is_aquila()) {
1748                 if (board_is_limo_real())
1749                         /* Support */;
1750                 else
1751                         return;
1752         } else if (mach_is_goni()) {
1753                 /* Support */;
1754         } else if (mach_is_geminus()) {
1755                 /* Support */;
1756         } else {
1757                 return;
1758         }
1759
1760         if (mach_is_aquila()) {
1761                 /* Aquila rev 0.8 or lower */
1762                 p = aquila_powerdown_modes;
1763                 ge = aquila_external_powerdown_modes;
1764                 mr = aquila_mirror_powerdown_mode;
1765                 n_p = ARRAY_SIZE(aquila_powerdown_modes);
1766                 n_ge = ARRAY_SIZE(aquila_external_powerdown_modes);
1767                 n_mr = ARRAY_SIZE(aquila_mirror_powerdown_mode);
1768         } else if (mach_is_goni()) {
1769                 /* Aquila rev 0.9 */
1770                 p = kessler_powerdown_modes;
1771                 ge = kessler_external_powerdown_modes;
1772                 mr = kessler_mirror_powerdown_mode;
1773                 n_p = ARRAY_SIZE(kessler_powerdown_modes);
1774                 n_ge = ARRAY_SIZE(kessler_external_powerdown_modes);
1775                 n_mr = ARRAY_SIZE(kessler_mirror_powerdown_mode);
1776         } else if (mach_is_geminus()) {
1777                 if (hwrevision(1)) {
1778                         /* Same as Aquila rev 0.9 */
1779 #if 0
1780                         p = kessler_powerdown_modes;
1781                         ge = kessler_external_powerdown_modes;
1782                         mr = kessler_mirror_powerdown_mode;
1783                         n_p = ARRAY_SIZE(kessler_powerdown_modes);
1784                         n_ge = ARRAY_SIZE(kessler_external_powerdown_modes);
1785                         n_mr = ARRAY_SIZE(kessler_mirror_powerdown_mode);
1786 #else
1787                         p = aquila_powerdown_modes;
1788                         ge = aquila_external_powerdown_modes;
1789                         mr = aquila_mirror_powerdown_mode;
1790                         n_p = ARRAY_SIZE(aquila_powerdown_modes);
1791                         n_ge = ARRAY_SIZE(aquila_external_powerdown_modes);
1792                         n_mr = ARRAY_SIZE(aquila_mirror_powerdown_mode);
1793 #endif
1794                 } else if (hwrevision(0)) {
1795                         /* Same as Aquila rev 0.8 or lower */
1796                         p = aquila_powerdown_modes;
1797                         ge = aquila_external_powerdown_modes;
1798                         mr = aquila_mirror_powerdown_mode;
1799                         n_p = ARRAY_SIZE(aquila_powerdown_modes);
1800                         n_ge = ARRAY_SIZE(aquila_external_powerdown_modes);
1801                         n_mr = ARRAY_SIZE(aquila_mirror_powerdown_mode);
1802                 } else {
1803                         return; /* Not supported */
1804                 }
1805         }
1806
1807         bank = &gpio->a0;
1808
1809         for (i = 0; i < n_p; i++, p++, bank++) {
1810                 writel(p->conpdn, &bank->pdn_con);
1811                 writel(p->pudpdn, &bank->pdn_pull);
1812         }
1813         /* M299 */
1814         writel(0xff0022b0, (unsigned int *)0xF0000000);
1815         writel(0xff0022b0, (unsigned int *)0xF1400000);
1816
1817         bank = &gpio->h0;
1818
1819         for (i = 0; i < n_ge; i++) {
1820                 writel(ge->con, &bank->con);
1821                 writel(ge->dat, &bank->dat);
1822                 writel(ge->pud, &bank->pull);
1823
1824                 bank++;
1825                 ge++;
1826         }
1827
1828         for (i = 0; i < n_mr; i++) {
1829                 unsigned int reg = readl(&mr->bank->pdn_con);
1830                 reg &= ~(0x3 << (mr->number << 1));
1831                 if (readl(&mr->bank->dat) & (1 << mr->number))
1832                         reg |= 0x1 << (mr->number << 1);
1833                 writel(reg, &mr->bank->pdn_con);
1834                 mr++;
1835         }
1836 }
1837
1838 #ifdef CONFIG_LCD
1839
1840 void fimd_clk_set(void)
1841 {
1842         struct s5pc110_clock *clk =
1843                 (struct s5pc110_clock *)samsung_get_base_clock();
1844         unsigned int cfg = 0;
1845
1846         /* set lcd src clock */
1847         cfg = readl(&clk->src1);
1848         cfg &= ~(0xf << 20);
1849         cfg |= (0x6 << 20);
1850         writel(cfg, &clk->src1);
1851
1852         /* set fimd ratio */
1853         cfg = readl(&clk->div1);
1854         cfg &= ~(0xf << 20);
1855         cfg |= (0x2 << 20);
1856         writel(cfg, &clk->div1);
1857 }
1858
1859 void mipi_power_on(void)
1860 {
1861         run_command("pmic ldo 3 on", 0);
1862         run_command("pmic ldo 7 on", 0);
1863 }
1864
1865
1866 extern void s6e63m0_set_platform_data(struct spi_platform_data *pd);
1867 extern void s6d16a0x_set_platform_data(struct spi_platform_data *pd);
1868 extern void ld9040_set_platform_data(struct spi_platform_data *pd);
1869
1870 struct spi_platform_data spi_pd;
1871
1872 void lcd_cfg_gpio(void)
1873 {
1874         unsigned int i, f3_end = 4;
1875
1876         for (i = 0; i < 8; i++) {
1877                 /* set GPF0,1,2[0:7] for RGB Interface and Data lines (32bit) */
1878                 gpio_cfg_pin(&gpio->f0, i, GPIO_FUNC(2));
1879                 gpio_cfg_pin(&gpio->f1, i, GPIO_FUNC(2));
1880                 gpio_cfg_pin(&gpio->f2, i, GPIO_FUNC(2));
1881                 /* pull-up/down disable */
1882                 gpio_set_pull(&gpio->f0, i, GPIO_PULL_NONE);
1883                 gpio_set_pull(&gpio->f1, i, GPIO_PULL_NONE);
1884                 gpio_set_pull(&gpio->f2, i, GPIO_PULL_NONE);
1885
1886                 /* drive strength to max (24bit) */
1887                 gpio_set_drv(&gpio->f0, i, GPIO_DRV_4X);
1888                 gpio_set_rate(&gpio->f0, i, GPIO_DRV_SLOW);
1889                 gpio_set_drv(&gpio->f1, i, GPIO_DRV_4X);
1890                 gpio_set_rate(&gpio->f1, i, GPIO_DRV_SLOW);
1891                 gpio_set_drv(&gpio->f2, i, GPIO_DRV_4X);
1892                 gpio_set_rate(&gpio->f2, i, GPIO_DRV_SLOW);
1893         }
1894
1895         /* set DISPLAY_DE_B pin for dual rgb mode. */
1896         if (board_is_media())
1897                 f3_end = 5;
1898
1899         for (i = 0; i < f3_end; i++) {
1900                 /* set GPF3[0:3] for RGB Interface and Data lines (32bit) */
1901                 gpio_cfg_pin(&gpio->f3, i, GPIO_PULL_UP);
1902                 /* pull-up/down disable */
1903                 gpio_set_pull(&gpio->f3, i, GPIO_PULL_NONE);
1904                 /* drive strength to max (24bit) */
1905                 gpio_set_drv(&gpio->f3, i, GPIO_DRV_4X);
1906                 gpio_set_rate(&gpio->f3, i, GPIO_DRV_SLOW);
1907         }
1908         /* display output path selection (only [1:0] valid) */
1909         writel(0x2, 0xE0107008);
1910
1911         /* gpio pad configuration for LCD reset. */
1912         gpio_cfg_pin(&gpio->mp0_5, 5, GPIO_OUTPUT);
1913
1914         /* gpio pad configuration for LCD ON. */
1915         gpio_cfg_pin(&gpio->j1, 3, GPIO_OUTPUT);
1916
1917         /* LCD_BACKLIGHT_EN */
1918         if (mach_is_geminus())
1919                 gpio_cfg_pin(&gpio->mp0_5, 0, GPIO_OUTPUT);
1920         if (board_is_sdk() && hwrevision(0)) {
1921                 gpio_cfg_pin(&gpio->mp0_4, 4, GPIO_OUTPUT);
1922                 gpio_direction_output(&gpio->mp0_4, 4, 0);
1923         }
1924
1925         /*
1926          * gpio pad configuration for
1927          * DISPLAY_CS, DISPLAY_CLK, DISPLAY_SO, DISPLAY_SI.
1928          */
1929         gpio_cfg_pin(&gpio->mp0_1, 1, GPIO_OUTPUT);
1930         gpio_cfg_pin(&gpio->mp0_4, 1, GPIO_OUTPUT);
1931         gpio_cfg_pin(&gpio->mp0_4, 2, GPIO_INPUT);
1932         gpio_cfg_pin(&gpio->mp0_4, 3, GPIO_OUTPUT);
1933
1934         if (mach_is_aquila() || mach_is_goni()) {
1935                 spi_pd.cs_bank = &gpio->mp0_1;
1936                 spi_pd.cs_num = 1;
1937                 spi_pd.clk_bank = &gpio->mp0_4;
1938                 spi_pd.clk_num = 1;
1939                 spi_pd.si_bank = &gpio->mp0_4;
1940                 spi_pd.si_num = 3;
1941                 spi_pd.so_bank = &gpio->mp0_4;
1942                 spi_pd.so_num = 2;
1943
1944                 spi_pd.mode = SPI_MODE_3;
1945
1946                 spi_pd.cs_active = ACTIVE_LOW;
1947                 spi_pd.word_len = 8;
1948
1949                 if (board_is_sdk() && hwrevision(0))
1950                         s6d16a0x_set_platform_data(&spi_pd);
1951                 else if (board_is_sdk() && (hwrevision(3) || hwrevision(6)))
1952                         ld9040_set_platform_data(&spi_pd);
1953                 else {
1954                         s6e63m0_set_platform_data(&spi_pd);
1955                         if (board_is_media())
1956                                 spi_pd.set_rev = 1;
1957                 }
1958         }
1959
1960         if (mach_is_cypress()) {
1961 #if 0           /* universal cypress */
1962                 /* FLCD_CS */
1963                 gpio_cfg_pin(&gpio_base->gpio_mp0_1, 0, GPIO_OUTPUT);
1964 #endif
1965                 /* FLCD_CS_S */
1966                 gpio_cfg_pin(&gpio->mp0_5, 1, GPIO_OUTPUT);
1967                 /* FLCD_CLK */
1968                 gpio_cfg_pin(&gpio->mp0_4, 0, GPIO_OUTPUT);
1969                 /* FLCD_SDI */
1970                 gpio_cfg_pin(&gpio->mp0_4, 2, GPIO_OUTPUT);
1971                 /* FLCD_RST_S */
1972                 gpio_cfg_pin(&gpio->mp0_4, 5, GPIO_OUTPUT);
1973                 /* FLCD_ON_S */
1974                 gpio_cfg_pin(&gpio->g2, 2, GPIO_OUTPUT);
1975 #if 0           /* universal cypress */
1976                 pd_cs.bank = &gpio_base->gpio_mp0_1;
1977                 pd_cs.num = 0;
1978 #endif
1979                 spi_pd.cs_bank = &gpio->mp0_5;
1980                 spi_pd.cs_num = 1;
1981                 spi_pd.clk_bank = &gpio->mp0_4;
1982                 spi_pd.clk_num = 0;
1983                 spi_pd.si_bank = &gpio->mp0_4;
1984                 spi_pd.si_num = 2;
1985
1986                 spi_pd.set_rev = 1;
1987
1988                 spi_pd.mode = SPI_MODE_3;
1989
1990                 spi_pd.cs_active = ACTIVE_LOW;
1991                 spi_pd.word_len = 8;
1992
1993                 /* these data would be sent to s6e63m0 lcd panel driver. */
1994                 s6e63m0_set_platform_data(&spi_pd);
1995         }
1996
1997         return;
1998 }
1999
2000 #define SWRST_REG               0x00
2001 #define LEDCON_REG              0x01
2002 #define LED_CUR_SET_REG         0x03
2003 #define LED_CUR_TR_REG          0x08
2004
2005 #define SWRST                   0x01
2006 #define NORMAL_MODE             0x09
2007 #define CUR_SET                 0x63
2008 #define TR_SET                  0x00
2009 void backlight_on(unsigned int onoff)
2010 {
2011
2012         unsigned char addr;
2013         unsigned char val[2];
2014
2015         if (onoff) {
2016                 if (mach_is_geminus())
2017                         gpio_set_value(&gpio->mp0_5, 0, 1);
2018         } else {
2019                 if (mach_is_geminus())
2020                         gpio_set_value(&gpio->mp0_5, 0, 0);
2021         }
2022
2023         if (mach_is_goni() && board_is_sdk() && hwrevision(0)) {
2024                 gpio_set_value(&gpio->mp0_4, 4, 1);
2025                 udelay(6);
2026
2027                 i2c_set_bus_num(I2C_GPIO5);
2028
2029                 addr = 0x76;
2030                 if (i2c_probe(addr)) {
2031                         if (i2c_probe(addr)) {
2032                                 puts("Can't found s6d16a0x backlight i2c\n");
2033                                 return;
2034                         }
2035                 }
2036                 val[0] = SWRST;
2037                 i2c_write(addr, SWRST_REG, 1, val, 1);
2038                 /* NORMAL MODE */
2039                 val[0] = CUR_SET;
2040                 i2c_write(addr, LED_CUR_SET_REG, 1, val, 1);
2041                 val[0] = TR_SET;
2042                 i2c_write(addr, LED_CUR_TR_REG, 1, val, 1);
2043                 val[0] = NORMAL_MODE;
2044                 i2c_write(addr, LEDCON_REG, 1, val, 1);
2045                 udelay(5000);
2046         }
2047 }
2048
2049 void reset_lcd(void)
2050 {
2051         if (mach_is_aquila() || mach_is_goni() || mach_is_geminus()) {
2052                 gpio_set_value(&gpio->mp0_5, 5, 1);
2053                 if (board_is_sdk() &&
2054                         (hwrevision(3) || hwrevision(4) || hwrevision(5) ||hwrevision(6))) {
2055                         udelay(10000);
2056                         gpio_set_value(&gpio->mp0_5, 5, 0);
2057                         udelay(10000);
2058                         gpio_set_value(&gpio->mp0_5, 5, 1);
2059                         udelay(100);
2060                 }
2061         }
2062         if (mach_is_cypress())
2063                 gpio_set_value(&gpio->mp0_4, 5, 1);
2064 }
2065
2066 void lcd_power_on(unsigned int onoff)
2067 {
2068         if (onoff) {
2069                 /* TSP_LDO_ON */
2070                 if (mach_is_aquila() || mach_is_geminus())
2071                         gpio_set_value(&gpio->j1, 3, 1);
2072
2073                 if (mach_is_cypress())
2074                         gpio_set_value(&gpio->g2, 2, 1);
2075
2076                 if (mach_is_goni()) {
2077                         unsigned char addr;
2078                         unsigned char val[2];
2079                         unsigned char val2[2];
2080
2081                         gpio_set_value(&gpio->j1, 3, 1);
2082
2083                         addr = 0xCC >> 1;       /* max8998 */
2084                         if (max8998_probe())
2085                                 return;
2086
2087                         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2088                         val[0] &= ~(MAX8998_LDO17);
2089                         val[0] |= MAX8998_LDO17; /* LDO17: VCC_3.0V_LCD */
2090                         i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2091
2092                         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2093                         val[0] |= MAX8998_LDO17;
2094                         val2[0] = 0xE;
2095                         i2c_write(addr, MAX8998_REG_LDO17, 1, val2, 1);
2096                         i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2097
2098                         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2099                         val[0] |= MAX8998_LDO7;
2100                         val2[0] = 0x2;
2101                         i2c_write(addr, MAX8998_REG_LDO7, 1, val2, 1);
2102                         i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2103                 }
2104         } else {
2105                 if (mach_is_aquila() || mach_is_geminus())
2106                         gpio_set_value(&gpio->j1, 3, 0);
2107
2108                 if (mach_is_cypress())
2109                         gpio_set_value(&gpio->g2, 2, 0);
2110
2111                 if (mach_is_goni()) {
2112                         unsigned char addr;
2113                         unsigned char val[2];
2114
2115                         gpio_set_value(&gpio->j1, 3, 0);
2116
2117                         addr = 0xCC >> 1;       /* max8998 */
2118                         if (max8998_probe())
2119                                 return;
2120
2121                         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2122                         val[0] &= ~(MAX8998_LDO7);
2123                         i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2124                         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2125
2126                         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2127                         val[0] &= ~(MAX8998_LDO17);
2128                         i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2129                         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2130                 }
2131         }
2132 }
2133
2134 extern void s6e63m0_cfg_ldo(void);
2135 extern void s6e63m0_enable_ldo(unsigned int onoff);
2136 extern void s6d16a0x_cfg_ldo(void);
2137 extern void s6d16a0x_enable_ldo(unsigned int onoff);
2138 extern void ld9040_cfg_ldo(void);
2139 extern void ld9040_enable_ldo(unsigned int onoff);
2140 extern void s3cfb_set_trigger(void);
2141 extern int s3cfb_is_i80_frame_done(void);
2142
2143 int s5p_no_lcd_support(void)
2144 {
2145         if (mach_is_wmg160())
2146                 return 1;
2147         return 0;
2148 }
2149
2150 static struct dsim_config dsim_info = {
2151         /* main frame fifo auto flush at VSYNC pulse */
2152         .auto_flush = DSIM_FALSE,
2153         .eot_disable = DSIM_FALSE,
2154
2155         .auto_vertical_cnt = DSIM_FALSE,
2156         .hse = DSIM_FALSE,
2157         .hfp = DSIM_FALSE,
2158         .hbp = DSIM_FALSE,
2159         .hsa = DSIM_FALSE,
2160
2161         .e_no_data_lane = DSIM_DATA_LANE_2,
2162         .e_byte_clk = DSIM_PLL_OUT_DIV8,
2163
2164         /* 472MHz: LSI Recommended */
2165         .p = 3,
2166         .m = 118,
2167         .s = 1,
2168
2169         /* D-PHY PLL stable time spec :min = 200usec ~ max 400usec */
2170         .pll_stable_time = 500,
2171
2172         .esc_clk = 10 * 1000000,        /* escape clk : 10MHz */
2173
2174         /* stop state holding counter after bta change count 0 ~ 0xfff */
2175         .stop_holding_cnt = 0x0f,
2176         .bta_timeout = 0xff,            /* bta timeout 0 ~ 0xff */
2177         .rx_timeout = 0xffff,           /* lp rx timeout 0 ~ 0xffff */
2178
2179         .e_lane_swap = DSIM_NO_CHANGE,
2180 };
2181
2182 static struct dsim_lcd_config dsim_lcd_info = {
2183         .e_interface            = DSIM_COMMAND,
2184
2185         .parameter[DSI_VIRTUAL_CH_ID]   = (unsigned int) DSIM_VIRTUAL_CH_0,
2186         .parameter[DSI_FORMAT]          = (unsigned int) DSIM_24BPP_888,
2187         .parameter[DSI_VIDEO_MODE_SEL]  = (unsigned int) DSIM_BURST,
2188
2189         .mipi_ddi_pd            = NULL,
2190 };
2191
2192 struct s5p_platform_dsim s6e39a0x_platform_data = {
2193         .pvid = NULL,
2194         .clk_name = "dsim",
2195         .dsim_info = &dsim_info,
2196         .dsim_lcd_info = &dsim_lcd_info,
2197         .lcd_panel_name = "s6e39a0x",
2198         .platform_rev = 1,
2199
2200         /*
2201          * the stable time of needing to write data on SFR
2202          * when the mipi mode becomes LP mode.
2203          */
2204         .delay_for_stabilization = 600000,
2205 };
2206
2207 extern void s5p_set_dsim_platform_data(struct s5p_platform_dsim *pd);
2208 extern void s6e39a0x_init(void);
2209
2210 void init_panel_info(vidinfo_t *vid)
2211 {
2212         vid->cfg_gpio = NULL;
2213         vid->reset_lcd = NULL;
2214         vid->backlight_on = NULL;
2215         vid->lcd_power_on = NULL;
2216         vid->mipi_power = NULL;
2217
2218         vid->cfg_ldo = NULL;
2219         vid->enable_ldo = NULL;
2220
2221         vid->init_delay = 0;
2222         vid->reset_delay = 0;
2223         vid->power_on_delay = 0;
2224
2225         vid->vl_freq    = 60;
2226         vid->vl_col     = 480;
2227         vid->vl_row     = 800;
2228         vid->vl_width   = 480;
2229         vid->vl_height  = 800;
2230
2231         vid->dual_lcd_enabled = 0;
2232         vid->interface_mode = FIMD_RGB_INTERFACE;
2233
2234         if (board_is_media()) {
2235                 vid->vl_col     = 960;
2236                 vid->vl_row     = 800;
2237                 vid->vl_width   = 960;
2238                 vid->vl_height  = 800;
2239
2240                 /* enable dual lcd mode. */
2241                 vid->dual_lcd_enabled = 1;
2242         }
2243
2244         vid->vl_clkp    = CONFIG_SYS_HIGH;
2245         vid->vl_hsp     = CONFIG_SYS_LOW;
2246         vid->vl_vsp     = CONFIG_SYS_LOW;
2247         vid->vl_dp      = CONFIG_SYS_HIGH;
2248         vid->vl_bpix    = 32;
2249
2250         /* S6E63M0 LCD Panel */
2251         vid->vl_hspw    = 2;
2252         vid->vl_hbpd    = 16;
2253         vid->vl_hfpd    = 16;
2254
2255         vid->vl_vspw    = 2;
2256         vid->vl_vbpd    = 3;
2257         vid->vl_vfpd    = 28;
2258
2259         if (mach_is_aquila() || mach_is_goni()
2260                         || mach_is_cypress()) {
2261                 vid->cfg_gpio = lcd_cfg_gpio;
2262                 vid->reset_lcd = reset_lcd;
2263                 vid->backlight_on = backlight_on;
2264                 vid->lcd_power_on = lcd_power_on;
2265                 vid->cfg_ldo = s6e63m0_cfg_ldo;
2266                 vid->enable_ldo = s6e63m0_enable_ldo;
2267
2268                 vid->init_delay = 25000;
2269                 vid->reset_delay = 120000;
2270         }
2271
2272         if (board_is_sdk() && hwrevision(0)) {
2273                 vid->vl_freq    = 100;
2274                 vid->vl_col     = 320;
2275                 vid->vl_row     = 480;
2276                 vid->vl_width   = 320;
2277                 vid->vl_height  = 480;
2278
2279                 vid->vl_clkp    = CONFIG_SYS_HIGH;
2280                 vid->vl_hsp     = CONFIG_SYS_HIGH;
2281                 vid->vl_vsp     = CONFIG_SYS_HIGH;
2282                 vid->vl_dp      = CONFIG_SYS_LOW;
2283                 vid->vl_bpix    = 32;
2284
2285                 /* disable dual lcd mode. */
2286                 vid->dual_lcd_enabled = 0;
2287
2288                 /* S6D16A0X LCD Panel */
2289                 vid->vl_hspw    = 16;
2290                 vid->vl_hbpd    = 24;
2291                 vid->vl_hfpd    = 16;
2292
2293                 vid->vl_vspw    = 2;
2294                 vid->vl_vbpd    = 2;
2295                 vid->vl_vfpd    = 4;
2296
2297                 vid->cfg_gpio = lcd_cfg_gpio;
2298                 vid->backlight_on = backlight_on;
2299                 vid->lcd_power_on = lcd_power_on;
2300                 vid->reset_lcd = reset_lcd;
2301                 vid->cfg_ldo = s6d16a0x_cfg_ldo;
2302                 vid->enable_ldo = s6d16a0x_enable_ldo;
2303
2304                 vid->init_delay = 10000;
2305                 vid->power_on_delay = 10000;
2306                 vid->reset_delay = 1000;
2307
2308         }
2309         if (board_is_sdk() && (hwrevision(3) || hwrevision(6))) {
2310                 vid->vl_freq    = 60;
2311                 vid->vl_col     = 480;
2312                 vid->vl_row     = 800;
2313                 vid->vl_width   = 480;
2314                 vid->vl_height  = 800;
2315                 vid->vl_clkp    = CONFIG_SYS_HIGH;
2316                 vid->vl_hsp     = CONFIG_SYS_HIGH;
2317                 vid->vl_vsp     = CONFIG_SYS_HIGH;
2318                 vid->vl_dp      = CONFIG_SYS_HIGH;
2319
2320                 vid->vl_bpix    = 32;
2321                 /* disable dual lcd mode. */
2322                 vid->dual_lcd_enabled = 0;
2323
2324                 /* LD9040 LCD Panel */
2325                 vid->vl_hspw    = 2;
2326                 vid->vl_hbpd    = 16;
2327                 vid->vl_hfpd    = 16;
2328
2329                 vid->vl_vspw    = 1;
2330                 vid->vl_vbpd    = 2;
2331                 vid->vl_vfpd    = 28;
2332
2333                 vid->cfg_gpio = lcd_cfg_gpio;
2334                 vid->backlight_on = NULL;
2335                 vid->lcd_power_on = lcd_power_on;
2336                 vid->reset_lcd = reset_lcd;
2337                 vid->cfg_ldo = ld9040_cfg_ldo;
2338                 vid->enable_ldo = ld9040_enable_ldo;
2339
2340                 vid->init_delay = 0;
2341                 vid->power_on_delay = 30000;
2342                 vid->reset_delay = 20000;
2343         } else if (board_is_sdk() && (hwrevision(4) || hwrevision(5))) {
2344                 vid->vl_freq    = 60;
2345                 vid->vl_col     = 600;
2346                 vid->vl_row     = 1024;
2347                 vid->vl_width   = 600;
2348                 vid->vl_height  = 1024;
2349
2350                 vid->vl_bpix    = 32;
2351                 /* disable dual lcd mode. */
2352                 vid->dual_lcd_enabled = 0;
2353
2354                 vid->cs_setup = 0;
2355                 vid->wr_setup = 0;
2356                 vid->wr_act = 1;
2357                 vid->wr_hold = 0;
2358
2359                 vid->cfg_gpio = lcd_cfg_gpio;
2360                 vid->backlight_on = NULL;
2361                 vid->lcd_power_on = lcd_power_on;
2362                 vid->reset_lcd = reset_lcd;
2363                 vid->mipi_power = mipi_power_on;
2364
2365                 vid->init_delay = 0;
2366                 vid->power_on_delay = 30000;
2367                 vid->reset_delay = 20000;
2368                 vid->interface_mode = FIMD_CPU_INTERFACE;
2369
2370                 s6e39a0x_platform_data.part_reset = s5p_dsim_part_reset;
2371                 s6e39a0x_platform_data.init_d_phy = s5p_dsim_init_d_phy;
2372                 s6e39a0x_platform_data.get_fb_frame_done = s3cfb_is_i80_frame_done;
2373                 s6e39a0x_platform_data.trigger = s3cfb_set_trigger;
2374                 s6e39a0x_platform_data.pvid = vid;
2375                 s6e39a0x_init();
2376                 s5p_set_dsim_platform_data(&s6e39a0x_platform_data);
2377         }
2378
2379         if (mach_is_geminus()) {
2380                 vid->vl_freq    = 60;
2381                 vid->vl_col     = 1024,
2382                 vid->vl_row     = 600,
2383                 vid->vl_width   = 1024,
2384                 vid->vl_height  = 600,
2385                 vid->vl_clkp    = CONFIG_SYS_LOW,
2386                 vid->vl_hsp     = CONFIG_SYS_HIGH,
2387                 vid->vl_vsp     = CONFIG_SYS_HIGH,
2388                 vid->vl_dp      = CONFIG_SYS_LOW,
2389                 vid->vl_bpix    = 32,
2390
2391                 vid->vl_hspw    = 32,
2392                 vid->vl_hfpd    = 48,
2393                 vid->vl_hbpd    = 80,
2394
2395                 vid->vl_vspw    = 1,
2396                 vid->vl_vfpd    = 3,
2397                 vid->vl_vbpd    = 4,
2398
2399                 vid->cfg_gpio = lcd_cfg_gpio;
2400                 vid->reset_lcd = reset_lcd;
2401                 vid->backlight_on = backlight_on;
2402                 vid->lcd_power_on = lcd_power_on;
2403         }
2404 #if 0
2405         vid->vl_freq    = 60;
2406         vid->vl_col     = 480,
2407         vid->vl_row     = 800,
2408         vid->vl_width   = 480,
2409         vid->vl_height  = 800,
2410         vid->vl_clkp    = CONFIG_SYS_HIGH,
2411         vid->vl_hsp     = CONFIG_SYS_LOW,
2412         vid->vl_vsp     = CONFIG_SYS_LOW,
2413         vid->vl_dp      = CONFIG_SYS_HIGH,
2414         vid->vl_bpix    = 32,
2415
2416         /* tl2796 panel. */
2417         vid->vl_hpw     = 4,
2418         vid->vl_blw     = 8,
2419         vid->vl_elw     = 8,
2420
2421         vid->vl_vpw     = 4,
2422         vid->vl_bfw     = 8,
2423         vid->vl_efw     = 8,
2424 #endif
2425 #if 0
2426         vid->vl_freq    = 60;
2427         vid->vl_col     = 1024,
2428         vid->vl_row     = 600,
2429         vid->vl_width   = 1024,
2430         vid->vl_height  = 600,
2431         vid->vl_clkp    = CONFIG_SYS_HIGH,
2432         vid->vl_hsp     = CONFIG_SYS_HIGH,
2433         vid->vl_vsp     = CONFIG_SYS_HIGH,
2434         vid->vl_dp      = CONFIG_SYS_LOW,
2435         vid->vl_bpix    = 32,
2436
2437         /* AMS701KA AMOLED Panel. */
2438         vid->vl_hpw     = 30,
2439         vid->vl_blw     = 114,
2440         vid->vl_elw     = 48,
2441
2442         vid->vl_vpw     = 2,
2443         vid->vl_bfw     = 6,
2444         vid->vl_efw     = 8,
2445 #endif
2446 }
2447 #endif
2448
2449 static void setup_meminfo(void)
2450 {
2451         char meminfo[64] = {0, };
2452         int count = 0, size, real;
2453
2454         size = gd->bd->bi_dram[0].size >> 20;
2455         count += sprintf(meminfo + count, "mem=%dM", size);
2456
2457         /* Each Chip Select can't exceed the 256MiB */
2458         size = gd->bd->bi_dram[1].size >> 20;
2459         real = min(size, 256);
2460         count += sprintf(meminfo + count, " mem=%dM@0x%x",
2461                 real, (unsigned int)gd->bd->bi_dram[1].start);
2462
2463         size -= real;
2464         if (size > 0) {
2465                 count += sprintf(meminfo + count, " mem=%dM@0x%x", size,
2466                         (unsigned int)gd->bd->bi_dram[1].start + (real << 20));
2467         }
2468
2469         setenv("meminfo", meminfo);
2470 }
2471
2472 #ifdef CONFIG_CMD_RAMOOPS
2473 static void show_dump_msg(void)
2474 {
2475         int ret;
2476
2477         ret = ramoops_init(samsung_get_base_modem());
2478
2479         if (!ret)
2480                 setenv("bootdelay", "-1");
2481 }
2482 #endif
2483
2484 int misc_init_r(void)
2485 {
2486         check_reset_status();
2487 #ifdef CONFIG_CMD_RAMOOPS
2488         show_dump_msg();
2489 #endif
2490
2491 #ifdef CONFIG_LCD
2492         /* It should be located at first */
2493         lcd_is_enabled = 0;
2494
2495         if (mach_is_aquila() || mach_is_goni()) {
2496                 if (board_is_sdk() && hwrevision(0))
2497                         setenv("lcdinfo", "lcd=s6d16a0x");
2498                 else if (board_is_sdk() && (hwrevision(3) || hwrevision(6)))
2499                         setenv("lcdinfo", "lcd=ld9040");
2500                 else if (board_is_sdk() && (hwrevision(4) || hwrevision(5)))
2501                         setenv("lcdinfo", "lcd=s6e39a0x");
2502                 else if (board_is_media())
2503                         setenv("lcdinfo", "lcd=s6e63m0");
2504                 else
2505                         setenv("lcdinfo", "lcd=s6e63m0");
2506         }
2507         if (mach_is_geminus())
2508                 setenv("lcdinfo", "lcd=lms480jc01");
2509         if (mach_is_cypress())
2510                 setenv("lcdinfo", "lcd=s6e63m0");
2511 #endif
2512         setup_meminfo();
2513
2514         show_hw_revision();
2515
2516         /* Set proper PMIC pins */
2517         pmic_pin_init();
2518
2519         /* Check auto burning */
2520         check_auto_burn();
2521
2522         /* To power up I2C2 */
2523         enable_ldos();
2524
2525         /* Enable T-Flash at Limo Real or Limo Universal */
2526         enable_t_flash();
2527
2528         /* Setup Limo Real board GPIOs */
2529         setup_limo_real_gpios();
2530
2531         /* Setup Media board GPIOs */
2532         setup_media_gpios();
2533
2534         /* check max8998 */
2535         pmic_bus_init(I2C_PMIC);
2536         init_pmic();
2537
2538         /* To usbdown automatically */
2539         check_keypad();
2540
2541 #ifdef CONFIG_S5PC1XXFB
2542         display_device_info();
2543 #endif
2544
2545         setup_power_down_mode_registers();
2546
2547         /* check max17040 */
2548         check_battery(0);
2549
2550         /* check fsa9480 */
2551         check_micro_usb(0);
2552
2553 #ifdef CONFIG_INFO_ACTION
2554         info_action_check();
2555 #endif
2556
2557         return 0;
2558 }
2559 #endif
2560
2561 #ifdef CONFIG_BOARD_EARLY_INIT_F
2562 int board_early_init_f(void)
2563 {
2564         /* Set Initial global variables */
2565         gpio = (struct s5pc110_gpio *)samsung_get_base_gpio();
2566
2567         /* Check H/W Revision */
2568         check_hw_revision();
2569
2570         return 0;
2571 }
2572 #endif
2573
2574 int board_init(void)
2575 {
2576         /* Set Initial global variables */
2577         gpio = (struct s5pc110_gpio *)samsung_get_base_gpio();
2578
2579         /* Check H/W Revision */
2580         check_hw_revision();
2581
2582         gd->bd->bi_arch_number = arch_number;
2583         gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
2584
2585         check_cpu_revision();
2586
2587         return 0;
2588 }
2589
2590 int dram_init(void)
2591 {
2592         gd->ram_size = PHYS_SDRAM_1_SIZE;
2593
2594         return 0;
2595 }
2596
2597 void dram_init_banksize(void)
2598 {
2599         unsigned int base, memconfig0, size;
2600         unsigned int memconfig1, sz = 0;
2601         int mem_3g = 0;
2602
2603         /* In S5PC110, we can't swap the DMC0/1 */
2604         gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
2605         gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
2606
2607         base = S5PC110_DMC1_BASE;
2608         /* DMC configuration */
2609         memconfig0 = readl(base + MEMCONFIG0_OFFSET);
2610         gd->bd->bi_dram[1].start = memconfig0 & 0xFF000000;
2611
2612         size = (memconfig0 >> 16) & 0xFF;
2613         size = ((unsigned char) ~size) + 1;
2614
2615         /*
2616          * (0x07 + 1) * 16 = 128 MiB
2617          * (0x0f + 1) * 16 = 256 MiB
2618          */
2619         size = size << 4;
2620
2621         /*
2622          * Aquila Rev0.5 4G3G1G
2623          * Aquila Rev0.8 4G3G1G
2624          * Aquila Rev0.9 4G3G1G
2625          * Limo SDK Rev 0.2 4G3G1G
2626          * Limo SDK Rev 0.3 4G3G1G
2627          * Limo SDK Rev 0.4 4G3G1G
2628          * WMG160 Rev 0.7 4G3G1G
2629          */
2630         if (mach_is_aquila() || mach_is_goni()) {
2631                 if ((!board_is_sdk() && (hwrevision(5) ||
2632                                                 hwrevision(8) || hwrevision(9))) ||
2633                                 (board_is_sdk() && !hwrevision(1)))
2634                         mem_3g = 1;
2635                 if (mach_is_goni() && board_is_s1()) {
2636                         mem_3g = 0;
2637                         sz = 0;
2638                 }
2639         } else if (mach_is_wmg160() && !hwrevision(5)) {
2640                 mem_3g = 1;
2641         }
2642
2643         if (mem_3g) {
2644                 memconfig1 = readl(base + MEMCONFIG1_OFFSET);
2645
2646                 sz = (memconfig1 >> 16) & 0xFF;
2647                 sz = ((unsigned char) ~sz) + 1;
2648                 sz = sz << 4;
2649         }
2650         /*
2651          * bi_dram[1].size contains all DMC1 memory size
2652          */
2653         gd->bd->bi_dram[1].size = (size + sz) << 20;
2654
2655         /* Set the memory size correctly */
2656         gd->ram_size = gd->bd->bi_dram[0].size + gd->bd->bi_dram[1].size;
2657 }
2658
2659 /* Used for sleep test */
2660 static unsigned char saved_val[4][2];
2661 void board_sleep_init_late(void)
2662 {
2663         /* CODEC_LDO_EN: GPF3[4] */
2664         gpio_direction_output(&gpio->f3, 4, 0);
2665         /* CODEC_XTAL_EN: GPH3[2] */
2666         gpio_direction_output(&gpio->h3, 2, 0);
2667
2668         /* MMC T_FLASH off */
2669         gpio_direction_output(&gpio->mp0_5, 4, 0);
2670         /* MHL off */
2671         gpio_direction_output(&gpio->j2, 2, 0);
2672         gpio_direction_output(&gpio->mp0_4, 7, 0);
2673         /* MHL_ON for REV02 or higher */
2674         gpio_direction_output(&gpio->j2, 3, 0);
2675 }
2676
2677 void board_sleep_init(void)
2678 {
2679         unsigned char addr;
2680         unsigned char val[2];
2681
2682         addr = 0xCC >> 1;
2683         if (max8998_probe())
2684                 return;
2685
2686         if (mach_is_goni()) {
2687                 /* Set ONOFF1 */
2688                 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
2689                 saved_val[0][0] = val[0];
2690                 saved_val[0][1] = val[1];
2691                 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) |
2692                                 (1 << 1) | (1 << 0));
2693                 i2c_write(addr, MAX8998_REG_ONOFF1, 1, val, 1);
2694                 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
2695
2696                 /* Set ONOFF2 */
2697                 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2698                 saved_val[1][0] = val[0];
2699                 saved_val[1][1] = val[1];
2700                 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 3) |
2701                                 (1 << 2) | (1 << 1) | (1 << 0));
2702                 val[0] |= (1 << 7);
2703                 i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2704                 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2705
2706                 /* Set ONOFF3 */
2707                 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2708                 saved_val[2][0] = val[0];
2709                 saved_val[2][1] = val[1];
2710                 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4));
2711                 i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2712                 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2713
2714                 /* Set ONOFF4 */
2715                 i2c_read(addr, MAX8998_REG_ONOFF4, 1, val, 1);
2716                 saved_val[3][0] = val[0];
2717                 saved_val[3][1] = val[1];
2718                 val[0] &= ~((1 << 6) | (1 << 4));
2719                 i2c_write(addr, MAX8998_REG_ONOFF4, 1, val, 1);
2720                 i2c_read(addr, MAX8998_REG_ONOFF4, 1, val, 1);
2721
2722                 printf("Turned off regulators with Kessler setting."
2723                                " Preparing to sleep. [%s:%d]\n",
2724                                 __FILE__, __LINE__);
2725         } else { /* Default */
2726                 /* Set ONOFF1 */
2727                 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
2728                 saved_val[0][0] = val[0];
2729                 saved_val[0][1] = val[1];
2730                 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) |
2731                                 (1 << 1) | (1 << 0));
2732                 i2c_write(addr, MAX8998_REG_ONOFF1, 1, val, 1);
2733                 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
2734
2735                 /* Set ONOFF2 */
2736                 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2737                 saved_val[1][0] = val[0];
2738                 saved_val[1][1] = val[1];
2739                 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 3) |
2740                                 (1 << 2) | (1 << 1) | (1 << 0));
2741                 val[0] |= (1 << 7);
2742                 i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2743                 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2744
2745                 /* Set ONOFF3 */
2746                 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2747                 saved_val[2][0] = val[0];
2748                 saved_val[2][1] = val[1];
2749                 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4));
2750                 i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2751                 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2752
2753                 /* Set ONOFF4 */
2754                 i2c_read(addr, MAX8998_REG_ONOFF4, 1, val, 1);
2755                 saved_val[3][0] = val[0];
2756                 saved_val[3][1] = val[1];
2757                 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4));
2758                 i2c_write(addr, MAX8998_REG_ONOFF4, 1, val, 1);
2759                 i2c_read(addr, MAX8998_REG_ONOFF4, 1, val, 1);
2760
2761                 printf("Turned off regulators with default(Aquila) setting."
2762                                " Preparing to sleep. [%s:%d]\n",
2763                                 __FILE__, __LINE__);
2764         }
2765 }
2766
2767 void board_sleep_resume(void)
2768 {
2769         unsigned char addr;
2770         unsigned char val[2];
2771
2772         check_cpu_revision();
2773         show_hw_revision();
2774
2775         addr = 0xCC >> 1;
2776         if (max8998_probe())
2777                 return;
2778
2779         /* Set ONOFF1 */
2780         i2c_write(addr, MAX8998_REG_ONOFF1, 1, saved_val[0], 1);
2781         i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
2782         /* Set ONOFF2 */
2783         i2c_write(addr, MAX8998_REG_ONOFF2, 1, saved_val[1], 1);
2784         i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
2785         /* Set ONOFF3 */
2786         i2c_write(addr, MAX8998_REG_ONOFF3, 1, saved_val[2], 1);
2787         i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
2788         /* Set ONOFF4 */
2789         i2c_write(addr, MAX8998_REG_ONOFF4, 1, saved_val[3], 1);
2790         i2c_read(addr, MAX8998_REG_ONOFF4, 1, val, 1);
2791         puts("Waked up.\n");
2792
2793         /* check max17040 */
2794         check_battery(0);
2795
2796         /* check fsa9480 */
2797         check_micro_usb(0);
2798 }
2799
2800
2801 static int s5pc1xx_phy_control(int on)
2802 {
2803         static int status;
2804
2805         if (on && !status) {
2806 #ifdef CONFIG_CMD_PMIC
2807                 run_command("pmic ldo 8 on", 0);
2808                 run_command("pmic ldo 3 on", 0);
2809 #endif
2810                 /* S5PC110 */
2811                 if (board_is_limo_universal() ||
2812                         board_is_limo_real() ||
2813                         board_is_media()) {
2814                         /* check usb path */
2815                         if (board_is_limo_real() && !hwrevision(6))
2816                                 check_mhl();
2817                 }
2818
2819                 if (mach_is_tickertape())
2820                         /* USB_SEL: XM0ADDR_0: MP04[0] output mode */
2821                         gpio_direction_output(&gpio->mp0_4, 0, 0);
2822
2823                 /* USB Path to AP */
2824                 micro_usb_switch(0);
2825                 status = 1;
2826         } else if (!on && status) {
2827 #ifdef CONFIG_CMD_PMIC
2828                 run_command("pmic ldo 3 off", 0);
2829                 run_command("pmic ldo 8 off", 0);
2830 #endif
2831                 status = 0;
2832         }
2833         udelay(10000);
2834
2835         return 0;
2836 }
2837
2838 struct s3c_plat_otg_data s5pc110_otg_data = {
2839         .phy_control = s5pc1xx_phy_control,
2840         .regs_phy = S5PC110_PHY_BASE,
2841         .regs_otg = S5PC110_OTG_BASE,
2842 };
2843
2844 #if defined(CONFIG_USB_ETHER)
2845 int board_eth_init(bd_t *bis)
2846 {
2847         int res = -1;
2848
2849         s3c_udc_probe(&s5pc110_otg_data);
2850         if (usb_eth_initialize(bis) >= 0)
2851                 res = 0;
2852         return res;
2853 }
2854 #endif
2855
2856 #ifdef CONFIG_CMD_USB_MASS_STORAGE
2857
2858 static int ums_read_sector(struct ums_device *ums_dev, unsigned int n, void *buf)
2859 {
2860         if (ums_dev->mmc->block_dev.block_read(ums_dev->dev_num,
2861                                                n + ums_dev->offset, 1, buf) != 1)
2862                 return -1;
2863
2864         return 0;
2865 }
2866
2867 static int ums_write_sector(struct ums_device *ums_dev, unsigned int n, void *buf)
2868 {
2869         if (ums_dev->mmc->block_dev.block_write(ums_dev->dev_num,
2870                                                 n + ums_dev->offset, 1, buf) != 1)
2871                 return -1;
2872
2873         return 0;
2874 }
2875
2876 static void ums_get_capacity(struct ums_device *ums_dev, long long int *capacity)
2877 {
2878         long long int tmp_capacity;
2879         
2880         tmp_capacity = (long long int) ((ums_dev->offset + ums_dev->part_size) * SECTOR_SIZE);
2881         *capacity = ums_dev->mmc->capacity - tmp_capacity;
2882 }
2883
2884 static struct ums_board_info ums_board = {
2885         .read_sector = ums_read_sector,
2886         .write_sector = ums_write_sector,
2887         .get_capacity = ums_get_capacity,
2888         .name = "SLP UMS disk",
2889         .ums_dev = {
2890                 .mmc = NULL,
2891                 .dev_num = 0,
2892                 .offset = 0,
2893                 .part_size = 0.
2894         },
2895 };
2896
2897 struct ums_board_info *board_ums_init(unsigned int dev_num, unsigned int offset, 
2898                                       unsigned int part_size)
2899 {
2900         struct mmc *mmc;
2901         
2902         mmc = find_mmc_device(dev_num);
2903         if (!mmc)
2904                 return NULL;
2905
2906         ums_board.ums_dev.mmc = mmc;
2907         ums_board.ums_dev.dev_num = dev_num;
2908         ums_board.ums_dev.offset = offset;
2909         ums_board.ums_dev.part_size = part_size;
2910         
2911         /* Init MMC */
2912         mmc_init(mmc);
2913
2914         s3c_udc_probe(&s5pc110_otg_data);
2915         return &ums_board;
2916 }
2917 #endif
2918
2919 #ifdef CONFIG_CMD_DEVICE_FIRMWARE_UPGRADE
2920 extern void register_flash_areas(void);
2921 extern void unregister_flash_areas(void);
2922
2923 void board_dfu_init(void)
2924 {
2925         register_flash_areas();
2926         s3c_udc_probe(&s5pc110_otg_data);
2927 }
2928
2929 void board_dfu_cleanup(void)
2930 {
2931         unregister_flash_areas();
2932 }
2933 #endif
2934
2935 #ifdef CONFIG_USBDOWNLOAD_GADGET
2936 void usbd_gadget_udc_probe(void) {
2937         puts("USB_udc_probe\n");
2938         s3c_udc_probe(&s5pc110_otg_data);
2939 }
2940 #endif
2941
2942 #ifdef CONFIG_CMD_USBDOWN
2943 int usb_board_init(void)
2944 {
2945         /* interrupt clear */
2946         pmic_get_irq(PWRON1S);
2947
2948 #ifdef CONFIG_CMD_PMIC
2949         run_command("pmic ldo 8 on", 0);
2950         run_command("pmic ldo 3 on", 0);
2951 #endif
2952
2953         /* S5PC110 */
2954         if (board_is_limo_universal() ||
2955                 board_is_limo_real() ||
2956                 board_is_media()) {
2957                 /* check usb path */
2958                 if (board_is_limo_real() && !hwrevision(6))
2959                         check_mhl();
2960         }
2961
2962         if (mach_is_tickertape())
2963                 /* USB_SEL: XM0ADDR_0: MP04[0] output mode */
2964                 gpio_direction_output(&gpio->mp0_4, 0, 0);
2965
2966         /* USB Path to AP */
2967         micro_usb_switch(0);
2968
2969         return 0;
2970 }
2971 #endif
2972
2973 #ifdef CONFIG_GENERIC_MMC
2974 int s5p_no_mmc_support(void)
2975 {
2976         if (mach_is_wmg160() && hwrevision(5))
2977                 return 1;
2978         return 0;
2979 }
2980
2981 int board_mmc_init(bd_t *bis)
2982 {
2983         int i, err;
2984         int buswidth = 4;
2985
2986         if (s5p_no_mmc_support())
2987                 return -1;
2988
2989         /* MASSMEMORY_EN: XMSMDATA7: GPJ2[7] output high */
2990         if (mach_is_goni() || mach_is_wmg160())
2991                 gpio_direction_output(&gpio->j2, 7, 1);
2992
2993         /*
2994          * MMC0 GPIO
2995          * GPG0[0]      SD_0_CLK
2996          * GPG0[1]      SD_0_CMD
2997          * GPG0[2]      SD_0_CDn        -> Not used
2998          * GPG0[3:6]    SD_0_DATA[0:3]
2999          */
3000         for (i = 0; i < 7; i++) {
3001                 if (i == 2)
3002                         continue;
3003                 /* GPG0[0:6] special function 2 */
3004                 gpio_cfg_pin(&gpio->g0, i, 0x2);
3005                 /* GPG0[0:6] pull disable */
3006                 gpio_set_pull(&gpio->g0, i, GPIO_PULL_NONE);
3007                 /* GPG0[0:6] drv 4x */
3008                 gpio_set_drv(&gpio->g0, i, GPIO_DRV_4X);
3009         }
3010
3011         if (board_is_sdk() && hwrevision(6)) {
3012                 for (i = 3; i < 7; i++) {
3013                         /* GPG1[3:6] special function 3 */
3014                         gpio_cfg_pin(&gpio->g1, i, 0x3);
3015                         /* GPG1[3:6] pull disable */
3016                         gpio_set_pull(&gpio->g1,
3017                                         i, GPIO_PULL_NONE);
3018                         /* GPG1[3:6] drv 4x */
3019                         gpio_set_drv(&gpio->g1, i, GPIO_DRV_4X);
3020                 }
3021
3022                 buswidth = 8; /* 8-bit buswidth */
3023         }
3024
3025         if (mach_is_geminus()) {
3026                 gpio_direction_output(&gpio->j2, 7, 1);
3027                 gpio_set_pull(&gpio->j2, 7, GPIO_PULL_NONE);
3028         }
3029
3030         /* T_FLASH_DETECT: EINT28: GPH3[4] interrupt mode */
3031         gpio_cfg_pin(&gpio->h3, 4, GPIO_IRQ);
3032         gpio_set_pull(&gpio->h3, 4, GPIO_PULL_UP);
3033
3034         err = s5p_mmc_init(0, buswidth);
3035
3036         if (!gpio_get_value(&gpio->h3, 4)) {
3037                 for (i = 0; i < 7; i++) {
3038                         if (i == 2)
3039                                 continue;
3040                         /* GPG2[0:6] special function 2 */
3041                         gpio_cfg_pin(&gpio->g2, i, 0x2);
3042                         /* GPG2[0:6] pull disable */
3043                         gpio_set_pull(&gpio->g2, i, GPIO_PULL_NONE);
3044                         /* GPG2[0:6] drv 4x */
3045                         gpio_set_drv(&gpio->g2, i, GPIO_DRV_4X);
3046                 }
3047                 err =s5p_mmc_init(2, 4);
3048         }
3049
3050         return err;
3051 }
3052 #endif
3053
3054 #ifdef CONFIG_CMD_DEVICE_POWER
3055 static int do_microusb(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
3056 {
3057         switch (argc) {
3058         case 2:
3059                 if (strncmp(argv[1], "cp", 2) == 0) {
3060                         micro_usb_switch(1);
3061                         run_command("pmic safeout 2 on", 0);
3062                         setenv("usb", "cp");
3063                 } else if (strncmp(argv[1], "ap", 2) == 0) {
3064                         micro_usb_switch(0);
3065                         run_command("pmic safeout 2 off", 0);
3066                         setenv("usb", "ap");
3067                 }
3068                 break;
3069         default:
3070                 cmd_usage(cmdtp);
3071                 return 1;
3072         }
3073
3074         saveenv();
3075
3076         printf("USB Path is set to %s\n", getenv("usb"));
3077
3078         return 0;
3079 }
3080
3081 U_BOOT_CMD(
3082         microusb,               CONFIG_SYS_MAXARGS,     1, do_microusb,
3083         "Micro USB Switch",
3084         "cp - switch to CP\n"
3085         "microusb ap - switch to AP\n"
3086 );
3087 #endif