2 * Copyright (C) 2009 Samsung Electronics
3 * Kyungmin Park <kyungmin.park@samsung.com>
4 * Minkyu Kang <mk7.kang@samsung.com>
6 * See file CREDITS for list of people who contributed to this
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.
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.
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,
28 #include <asm/arch/clk.h>
29 #include <asm/arch/clock.h>
30 #include <asm/arch/gpio.h>
31 #include <asm/arch/keypad.h>
32 #include <asm/arch/mmc.h>
33 #include <asm/arch/power.h>
34 #include <asm/arch/mem.h>
38 DECLARE_GLOBAL_DATA_PTR;
40 #define C100_MACH_START 3000
41 #define C110_MACH_START 3100
43 static unsigned int board_rev;
44 static unsigned int battery_soc;
60 static struct i2c_gpio_bus_data i2c_2 = {
70 static struct i2c_gpio_bus_data i2c_gpio3 = {
80 static struct i2c_gpio_bus_data i2c_pmic = {
90 static struct i2c_gpio_bus_data i2c_gpio5 = {
100 static struct i2c_gpio_bus_data i2c_gpio6 = {
106 * i2c gpio6 - cypress
110 static struct i2c_gpio_bus_data i2c_cypress_gpio6 = {
116 * i2c gpio7 - cypress
120 static struct i2c_gpio_bus_data i2c_cypress_gpio7 = {
125 static struct i2c_gpio_bus i2c_gpio[] = {
141 u32 get_board_rev(void)
146 static int hwrevision(int rev)
148 return (board_rev & 0xf) == rev;
160 #define SPLIT_SCREEN_FEATURE 0x100
162 /* board is MACH_AQUILA and board is like below. */
163 #define J1_B2_BOARD 0x200
164 #define LIMO_UNIVERSAL_BOARD 0x400
165 #define LIMO_REAL_BOARD 0x800
166 #define MEDIA_BOARD 0x1000
167 /* board is MACH_P1P2 and board is like below. */
168 #define P1_REAL_BOARD 0x200
169 #define P2_REAL_BOARD 0x400
171 #define BOARD_MASK 0xF00
173 static int c110_machine_id(void)
175 return gd->bd->bi_arch_number - C110_MACH_START;
178 static int machine_is_aquila(void)
180 return c110_machine_id() == MACH_AQUILA;
183 static int machine_is_p1p2(void)
185 return c110_machine_id() == MACH_P1P2;
188 static int machine_is_tickertape(void)
190 return c110_machine_id() == MACH_TICKERTAPE;
193 static int machine_is_geminus(void)
195 return c110_machine_id() == MACH_GEMINUS;
198 static int machine_is_cypress(void)
200 return c110_machine_id() == MACH_CYPRESS;
203 static int board_is_limo_universal(void)
205 return machine_is_aquila() && (board_rev & LIMO_UNIVERSAL_BOARD);
208 static int board_is_limo_real(void)
210 return machine_is_aquila() && (board_rev & LIMO_REAL_BOARD);
213 static int board_is_media(void)
215 return machine_is_aquila() && (board_rev & MEDIA_BOARD);
218 static int board_is_j1b2(void)
220 return machine_is_aquila() && (board_rev & J1_B2_BOARD);
223 static int board_is_p2_real(void)
225 return machine_is_p1p2() && (board_rev & P2_REAL_BOARD);
228 static void enable_touchkey(void);
229 static void enable_battery(void);
231 void i2c_init_board(void)
233 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
236 if (cpu_is_s5pc100())
239 num_bus = ARRAY_SIZE(i2c_gpio);
241 if (machine_is_cypress()) {
242 i2c_gpio[I2C_GPIO6].bus = &i2c_cypress_gpio6;
243 i2c_gpio[I2C_GPIO7].bus = &i2c_cypress_gpio7;
244 i2c_gpio[I2C_GPIO7].bus->gpio_base =
245 (unsigned int)&gpio->gpio_mp0_5;
250 i2c_gpio[I2C_2].bus->gpio_base = (unsigned int)&gpio->gpio_d1;
251 i2c_gpio[I2C_GPIO3].bus->gpio_base = (unsigned int)&gpio->gpio_j3;
252 i2c_gpio[I2C_PMIC].bus->gpio_base = (unsigned int)&gpio->gpio_j4;
253 i2c_gpio[I2C_GPIO5].bus->gpio_base = (unsigned int)&gpio->gpio_mp0_5;
254 i2c_gpio[I2C_GPIO6].bus->gpio_base = (unsigned int)&gpio->gpio_j3;
256 i2c_gpio_init(i2c_gpio, num_bus, I2C_PMIC);
258 /* XXX Power on Touckey early (it requires 100 msec power up time) */
261 /* Reset on max17040 early */
262 if (battery_soc == 0)
266 #ifdef CONFIG_MISC_INIT_R
267 #define DEV_INFO_LEN 512
268 static char device_info[DEV_INFO_LEN];
269 static int display_info;
271 static void dprintf(const char *fmt, ...)
278 i = vsprintf(buf, fmt, args);
283 if ((strlen(device_info) + strlen(buf)) > (DEV_INFO_LEN - 1)) {
284 puts("Flushing device info...\n");
288 strcat(device_info, buf);
292 #ifdef CONFIG_S5PC1XXFB
293 static void display_device_info(void)
300 set_font_color(FONT_WHITE);
301 fb_printf(device_info);
304 memset(device_info, 0x0, DEV_INFO_LEN);
306 udelay(5 * 1000 * 1000);
310 static const char *board_name[] = {
325 static char feature_buffer[32];
327 static char *display_features(int board, int board_rev)
330 char *buf = feature_buffer;
332 if (board == MACH_AQUILA) {
333 if (board_rev & SPLIT_SCREEN_FEATURE)
334 count += sprintf(buf + count, " - SplitScreen");
335 if (board_rev & J1_B2_BOARD)
336 count += sprintf(buf + count, " - J1 B2 board");
337 /* Limo Real or Universal */
338 if (board_rev & LIMO_REAL_BOARD)
339 count += sprintf(buf + count, " - Limo Real");
340 else if (board_rev & LIMO_UNIVERSAL_BOARD)
341 count += sprintf(buf + count, " - Limo Universal");
342 if (board_rev & MEDIA_BOARD)
343 count += sprintf(buf + count, " - Media");
344 } else if (board == MACH_P1P2) {
346 if (board_rev & P1_REAL_BOARD)
347 count += sprintf(buf + count, " - P1 Real");
348 else if (board_rev & P2_REAL_BOARD)
349 count += sprintf(buf + count, " - P2 Real");
351 count += sprintf(buf + count, " - Universal");
357 static void check_board_revision(int board, int rev)
361 /* Limo Real or Universal */
362 if (rev & LIMO_UNIVERSAL_BOARD)
363 board_rev &= ~J1_B2_BOARD;
364 if (rev & LIMO_REAL_BOARD) {
365 board_rev &= ~(J1_B2_BOARD |
366 LIMO_UNIVERSAL_BOARD);
368 if (rev & MEDIA_BOARD)
369 board_rev &= ~(J1_B2_BOARD |
370 LIMO_UNIVERSAL_BOARD);
375 /* There's no HWREV_MODE3 */
376 board_rev &= ~(1 << 3);
378 case MACH_TICKERTAPE:
380 board_rev &= ~BOARD_MASK;
387 static unsigned int get_hw_revision(struct s5pc1xx_gpio_bank *bank)
391 gpio_direction_input(bank, 1);
392 gpio_direction_input(bank, 2);
393 gpio_direction_input(bank, 3);
394 gpio_direction_input(bank, 4);
396 gpio_set_pull(bank, 1, GPIO_PULL_NONE); /* HWREV_MODE3 */
397 gpio_set_pull(bank, 2, GPIO_PULL_NONE); /* HWREV_MODE0 */
398 gpio_set_pull(bank, 3, GPIO_PULL_NONE); /* HWREV_MODE1 */
399 gpio_set_pull(bank, 4, GPIO_PULL_NONE); /* HWREV_MODE2 */
401 rev = gpio_get_value(bank, 2);
402 rev |= (gpio_get_value(bank, 3) << 1);
403 rev |= (gpio_get_value(bank, 4) << 2);
404 rev |= (gpio_get_value(bank, 1) << 3);
409 static void check_hw_revision(void)
411 unsigned int board = MACH_UNIVERSAL; /* Default is Universal */
413 if (cpu_is_s5pc100()) {
414 struct s5pc100_gpio *gpio =
415 (struct s5pc100_gpio *)S5PC100_GPIO_BASE;
417 board_rev = get_hw_revision(&gpio->gpio_j0);
419 /* C100 TickerTape */
421 board = MACH_TICKERTAPE;
423 struct s5pc110_gpio *gpio =
424 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
426 board_rev = get_hw_revision(&gpio->gpio_j0);
429 * Note Check 'Aquila' board first
433 * LRA: Limo Real Aquila
434 * LUA: Limo Universal Aquila
439 * ADDR = 0xE0200000 + OFF
441 * OFF Universal LRA LUA OA TT SS P1P2 CYP
442 * J1: 0x0264 0x10 0x00 0x00 0x00 0x00 0x00 0x00
443 * H1: 0x0C24 W 0x28 0xA8 0x1C 0x18 0x0F
444 * H3: 0x0C64 0x03 0x07 0x0F 0xff
445 * D1: 0x00C4 0x0F 0x3F 0x3F 0x0F 0xXC 0x3F
446 * I: 0x0224 0x02 0x00 0x08
447 * MP03: 0x0324 0x9x 0xbx 0x9x
448 * MP05: 0x0364 0x80 0x88
452 if (gpio_get_value(&gpio->gpio_j1, 4) == 0) {
454 board_rev |= J1_B2_BOARD;
456 gpio_set_pull(&gpio->gpio_j2, 6, GPIO_PULL_NONE);
457 gpio_direction_input(&gpio->gpio_j2, 6);
460 if (gpio_get_value(&gpio->gpio_h1, 2) == 0)
461 board_rev |= LIMO_UNIVERSAL_BOARD;
463 if (gpio_get_value(&gpio->gpio_h3, 2) == 0)
464 board_rev |= LIMO_REAL_BOARD;
466 if (gpio_get_value(&gpio->gpio_j2, 6) == 1)
467 board_rev |= MEDIA_BOARD;
469 /* set gpio to default value. */
470 gpio_set_pull(&gpio->gpio_j2, 6, GPIO_PULL_DOWN);
471 gpio_direction_output(&gpio->gpio_j2, 6, 0);
473 /* C110 Aquila SplitScreen */
474 if (gpio_get_value(&gpio->gpio_mp0_3, 5))
475 board_rev |= SPLIT_SCREEN_FEATURE;
477 if (gpio_get_value(&gpio->gpio_i, 3))
478 board_rev |= SPLIT_SCREEN_FEATURE;
482 /* Workaround: C110 Aquila Rev0.6 */
483 if (board_rev == 6) {
485 board_rev |= LIMO_REAL_BOARD;
488 /* C110 TickerTape */
489 if (gpio_get_value(&gpio->gpio_d1, 0) == 0 &&
490 gpio_get_value(&gpio->gpio_d1, 1) == 0)
491 board = MACH_TICKERTAPE;
493 /* C110 Cypress: Do first this than P1P2 */
494 gpio_set_pull(&gpio->gpio_j2, 2, GPIO_PULL_NONE);
495 gpio_direction_input(&gpio->gpio_j2, 2);
496 if (gpio_get_value(&gpio->gpio_j2, 2) == 1)
497 board = MACH_CYPRESS;
498 gpio_set_pull(&gpio->gpio_j2, 2, GPIO_PULL_DOWN);
501 if (gpio_get_value(&gpio->gpio_h3, 7) == 1) {
503 board_rev &= ~BOARD_MASK;
506 /* set gpio configuration for P1P2. */
507 gpio_direction_input(&gpio->gpio_j0, 6);
508 gpio_direction_input(&gpio->gpio_j0, 7);
511 * do not change order below
512 * because it needs delay to get gpio value.
515 gpio_set_pull(&gpio->gpio_j0, 7, GPIO_PULL_NONE);
517 gpio_set_pull(&gpio->gpio_j0, 6, GPIO_PULL_NONE);
519 if (gpio_get_value(&gpio->gpio_j0, 7) == 1) {
521 board_rev &= ~BOARD_MASK;
522 if (gpio_get_value(&gpio->gpio_j0, 6) == 1)
523 board_rev |= P1_REAL_BOARD;
524 if (gpio_get_value(&gpio->gpio_j0, 6) == 0)
525 board_rev |= P2_REAL_BOARD;
528 /* set gpio to default value. */
530 gpio_set_pull(&gpio->gpio_j0, 6, GPIO_PULL_DOWN);
532 gpio_set_pull(&gpio->gpio_j0, 7, GPIO_PULL_DOWN);
535 gpio_set_pull(&gpio->gpio_j1, 2, GPIO_PULL_NONE);
536 gpio_direction_input(&gpio->gpio_j1, 2);
537 if (gpio_get_value(&gpio->gpio_j1, 2) == 1)
538 board = MACH_GEMINUS;
539 gpio_set_pull(&gpio->gpio_j1, 2, GPIO_PULL_DOWN);
540 gpio_direction_output(&gpio->gpio_j1, 2, 0);
544 if (cpu_is_s5pc110())
545 gd->bd->bi_arch_number = C110_MACH_START + board;
547 gd->bd->bi_arch_number = C100_MACH_START + board;
549 /* Architecture Common settings */
550 if (cpu_is_s5pc110()) {
551 setenv("mtdparts", MTDPARTS_DEFAULT_4KB);
553 setenv("bootk", "onenand read 0x30007FC0 0x60000 0x300000; "
555 setenv("updatek", "onenand erase 0x60000 0x300000; "
556 "onenand write 0x31008000 0x60000 0x300000");
560 static void show_hw_revision(void)
565 * Workaround for Rev 0.3 + CP Ver ES 3.1
568 if (board_is_limo_real()) {
570 /* default is Rev 0.4 */
576 if (cpu_is_s5pc110())
577 board = gd->bd->bi_arch_number - C110_MACH_START;
579 board = gd->bd->bi_arch_number - C100_MACH_START;
581 check_board_revision(board, board_rev);
582 dprintf("HW Revision:\t%x (%s%s)\n", board_rev, board_name[board],
583 display_features(board, board_rev));
586 static void check_auto_burn(void)
588 unsigned long magic_base = CONFIG_SYS_SDRAM_BASE + 0x02000000;
589 unsigned int count = 0;
592 if (readl(magic_base) == 0x426f6f74) { /* ASICC: Boot */
593 printf("Auto burning bootloader\n");
594 count += sprintf(buf + count, "run updateb; ");
596 if (readl(magic_base + 0x04) == 0x4b65726e) { /* ASICC: Kern */
597 printf("Auto burning kernel\n");
598 count += sprintf(buf + count, "run updatek; ");
602 count += sprintf(buf + count, "reset");
603 setenv("bootcmd", buf);
606 /* Clear the magic value */
607 writel(0xa5a55a5a, magic_base);
608 writel(0xa5a55a5a, magic_base + 0x4);
611 static void pmic_pin_init(void)
613 unsigned int reg, value;
614 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
616 if (cpu_is_s5pc100())
619 /* AP_PS_HOLD: XEINT_0: GPH0[0]
620 * Note: Don't use GPIO PS_HOLD it doesn't work
622 reg = S5PC110_PS_HOLD_CONTROL;
624 value |= S5PC110_PS_HOLD_DIR_OUTPUT |
625 S5PC110_PS_HOLD_DATA_HIGH |
626 S5PC110_PS_HOLD_OUT_EN;
629 /* nPOWER: XEINT_22: GPH2[6] interrupt mode */
630 gpio_cfg_pin(&gpio->gpio_h2, 6, GPIO_IRQ);
631 gpio_set_pull(&gpio->gpio_h2, 6, GPIO_PULL_UP);
634 static void enable_ldos(void)
636 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
638 if (cpu_is_s5pc100())
641 if (machine_is_p1p2())
644 /* TOUCH_EN: XMMC3DATA_3: GPG3[6] output high */
645 gpio_direction_output(&gpio->gpio_g3, 6, 1);
648 static void enable_t_flash(void)
650 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
652 if (!(board_is_limo_universal() || board_is_limo_real()))
655 /* T_FLASH_EN : XM0ADDR_13: MP0_5[4] output high */
656 gpio_direction_output(&gpio->gpio_mp0_5, 4, 1);
659 static void setup_limo_real_gpios(void)
661 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
663 if (!board_is_limo_real())
667 * Note: Please write GPIO alphabet order
669 /* CODEC_LDO_EN: XVVSYNC_LDI: GPF3[4] output high */
670 gpio_direction_output(&gpio->gpio_f3, 4, 1);
673 /* RESET_REQ_N: XM0BEN_1: MP0_2[1] output high */
674 gpio_direction_output(&gpio->gpio_mp0_2, 1, 1);
676 /* RESET_REQ_N: XM0CSn_2: MP0_1[2] output high */
677 gpio_direction_output(&gpio->gpio_mp0_1, 2, 1);
679 /* T_FLASH_DETECT: EINT28: GPH3[4] interrupt mode */
680 gpio_cfg_pin(&gpio->gpio_h3, 4, GPIO_IRQ);
681 gpio_set_pull(&gpio->gpio_h3, 4, GPIO_PULL_UP);
684 static void setup_media_gpios(void)
686 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
688 if (!board_is_media())
692 * Note: Please write GPIO alphabet order
694 /* RESET_REQ_N: XM0CSn_2: MP0_1[2] output high */
695 gpio_direction_output(&gpio->gpio_mp0_1, 2, 1);
697 /* T_FLASH_DETECT: EINT28: GPH3[4] interrupt mode */
698 gpio_cfg_pin(&gpio->gpio_h3, 4, GPIO_IRQ);
699 gpio_set_pull(&gpio->gpio_h3, 4, GPIO_PULL_UP);
702 static void setup_p1p2_gpios(void)
704 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
706 if (!machine_is_p1p2())
710 * Note: Please write GPIO alphabet order
712 /* RESET_REQ_N: XM0FRnB[1]: MP0_3[5] output high */
713 gpio_direction_output(&gpio->gpio_mp0_3, 5, 1);
714 /* CODEC_LDO_EN: XM0FRnB[2]: MP0_3[6] output high */
715 gpio_direction_output(&gpio->gpio_mp0_3, 6, 1);
718 #define KBR3 (1 << 3)
719 #define KBR2 (1 << 2)
720 #define KBR1 (1 << 1)
721 #define KBR0 (1 << 0)
723 static void enable_touchkey(void)
725 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
727 /* TOUCH_EN - GPIO_J3(0) : (J1B2) */
728 /* TOUCH_EN - GPIO_J3(5) : (not J1B2) */
729 if (board_rev & J1_B2_BOARD)
730 gpio_direction_output(&gpio->gpio_j3, 0, 1);
732 gpio_direction_output(&gpio->gpio_j3, 5, 1);
734 /* TOUCH_CE - GPIO_J2(6) */
735 gpio_direction_output(&gpio->gpio_j2, 6, 1); /* TOUCH_CE */
738 static void check_p2_keypad(void)
740 unsigned int auto_download = 0;
741 unsigned char addr = 0x34, val[2]; /* adp5587 key controller */
743 i2c_set_bus_num(I2C_2);
745 if (i2c_probe(addr)) {
746 printf("Can't found adp5587 key controller\n");
749 /* Row 8, Column 10 */
751 ret = i2c_write(addr, 0x1D, 1, val, 1); /* Set KP_GPIO1 */
753 ret |= i2c_write(addr, 0x1E, 1, val, 1); /* Set KP_GPIO2 */
755 ret |= i2c_write(addr, 0x1F, 1, val, 1); /* Set KP_GPIO3 */
756 val[0] = 0x3f; /* CMP2_INT | CMP1_INT | OVR_FLOW_INT |
757 K_LCK_INT | GPI_INT | KE_INT */
758 ret |= i2c_write(addr, 0x02, 1, val, 1); /* Status is W1C */
759 val[0] = 0x19; /* INT_CFG | OVR_FLOW_IEN | KE_IEN */
760 ret |= i2c_write(addr, 0x01, 1, val, 1);
761 for (i = 0; i < 10; i++) {
762 udelay(1000); /* FIXME */
763 i2c_read(addr, 0x04 + i, 1, val, 1);
768 if (auto_download == 1)
769 setenv("bootcmd", "usbdown");
772 static void check_keypad(void)
774 unsigned int reg, value;
775 unsigned int col_mask, row_mask;
776 unsigned int auto_download = 0;
777 unsigned int col_value[4], i;
779 if (cpu_is_s5pc100()) {
780 struct s5pc100_gpio *gpio =
781 (struct s5pc100_gpio *)S5PC100_GPIO_BASE;
783 /* Set GPH2[2:0] to KP_COL[2:0] */
784 gpio_cfg_pin(&gpio->gpio_h2, 0, 0x3);
785 gpio_cfg_pin(&gpio->gpio_h2, 1, 0x3);
786 gpio_cfg_pin(&gpio->gpio_h2, 2, 0x3);
788 /* Set GPH3[2:0] to KP_ROW[2:0] */
789 gpio_cfg_pin(&gpio->gpio_h3, 0, 0x3);
790 gpio_cfg_pin(&gpio->gpio_h3, 1, 0x3);
791 gpio_cfg_pin(&gpio->gpio_h3, 2, 0x3);
793 reg = S5PC100_KEYPAD_BASE;
795 struct s5pc110_gpio *gpio =
796 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
798 if (board_is_limo_real() || board_is_limo_universal()) {
806 for (i = 0; i < 4; i++) {
807 /* Set GPH3[3:0] to KP_ROW[3:0] */
808 if (row_mask & (0xF << (i << 2))) {
809 gpio_cfg_pin(&gpio->gpio_h3, i, 0x3);
810 if (!machine_is_p1p2())
811 gpio_set_pull(&gpio->gpio_h3,
815 /* Set GPH2[3:0] to KP_COL[3:0] */
816 if (col_mask & (0xF << (i << 2)))
817 gpio_cfg_pin(&gpio->gpio_h2, i, 0x3);
818 if (machine_is_p1p2())
819 gpio_set_pull(&gpio->gpio_h2, i, GPIO_PULL_UP);
822 reg = S5PC110_KEYPAD_BASE;
826 writel(value, reg + S5PC1XX_KEYIFCOL_OFFSET);
827 value = readl(reg + S5PC1XX_KEYIFROW_OFFSET);
828 /* VOLUMEDOWN and CAM(Half shot) Button */
829 if ((value & KBR1) == 0) {
832 value = readl(reg + S5PC1XX_KEYIFCOL_OFFSET);
835 writel(value, reg + S5PC1XX_KEYIFCOL_OFFSET);
837 col_value[i++] = readl(reg + S5PC1XX_KEYIFROW_OFFSET);
839 writel(0x00, reg + S5PC1XX_KEYIFCOL_OFFSET);
841 /* expected value is row_value[0] = 0x00 row_value[1] = 0x01 */
843 if ((col_value[0] & 0x3) == 0x3 && (col_value[1] & 0x3) == 0x3)
846 if ((col_value[0] & 0x3) == 0x3 && (col_value[1] & 0x3) != 0x3)
848 if (machine_is_p1p2()) {
849 if ((col_value[0] & 0xd) == 0xd)
855 setenv("bootcmd", "usbdown");
858 static void check_touchkey(void)
861 unsigned char val[2];
862 unsigned char addr = 0x20; /* mcs5000 3-touchkey */
864 if (!machine_is_aquila())
868 i2c_set_bus_num(I2C_GPIO6);
870 if (i2c_probe(addr)) {
871 printf("Can't found 3 touchkey\n");
875 #define MCS5000_TK_HW_VERSION 0x06
876 #define MCS5000_TK_FW_VERSION 0x0A
877 #define MCS5000_TK_MI_VERSION 0x0B
879 reg = MCS5000_TK_MI_VERSION;
880 i2c_read(addr, reg, 1, val, 1);
881 dprintf("3-touchkey:\tM/I 0x%x, ", val[0]);
882 reg = MCS5000_TK_HW_VERSION;
883 i2c_read(addr, reg, 1, val, 1);
884 dprintf("H/W 0x%x, ", val[0]);
885 reg = MCS5000_TK_FW_VERSION;
886 i2c_read(addr, reg, 1, val, 1);
887 dprintf("F/W 0x%x\n", val[0]);
890 static void enable_battery(void)
892 unsigned char val[2];
893 unsigned char addr = 0x36; /* max17040 fuel gauge */
895 if (machine_is_aquila()) {
900 if (machine_is_tickertape())
903 if (machine_is_cypress())
904 i2c_set_bus_num(I2C_GPIO7);
906 i2c_set_bus_num(I2C_GPIO3);
908 if (i2c_probe(addr)) {
909 printf("Can't found max17040 fuel gauge\n");
915 i2c_write(addr, 0xfe, 1, val, 2);
918 static void check_battery(void)
920 unsigned char val[2];
921 unsigned char addr = 0x36; /* max17040 fuel gauge */
923 if (machine_is_aquila()) {
928 if (machine_is_tickertape())
931 if (machine_is_cypress())
932 i2c_set_bus_num(I2C_GPIO7);
934 i2c_set_bus_num(I2C_GPIO3);
936 if (i2c_probe(addr)) {
937 printf("Can't found max17040 fuel gauge\n");
941 i2c_read(addr, 0x04, 1, val, 1);
943 dprintf("battery:\t%d%%\n", val[0]);
945 battery_soc = val[0];
948 static void check_mhl(void)
950 unsigned char val[2];
951 unsigned char addr = 0x39; /* SIL9230 */
952 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
954 /* MHL Power enable */
955 /* HDMI_EN : GPJ2[2] XMSMDATA_2 output mode */
956 gpio_direction_output(&gpio->gpio_j2, 2, 1);
958 /* MHL_RST : MP0_4[7] XM0ADDR_7 output mode */
959 gpio_direction_output(&gpio->gpio_mp0_4, 7, 0);
961 /* 10ms required after reset */
965 gpio_set_value(&gpio->gpio_mp0_4, 7, 1);
967 i2c_set_bus_num(I2C_GPIO5);
970 if (i2c_probe(addr)) {
971 printf("Can't found MHL Chip\n");
977 * set to Normal operation
980 i2c_write((0x72 >> 1), 0x08, 1, val, 1);
981 i2c_read((0x72 >> 1), 0x08, 1, val, 1);
986 * 00 = MHL termination ON
987 * 11 = MHL termination OFF
990 i2c_write((0x72 >> 1), 0xa0, 1, val, 1);
991 i2c_read((0x72 >> 1), 0xa0, 1, val, 1);
994 static void into_charge_mode(void)
996 unsigned char addr = 0xCC >> 1; /* max8998 */;
997 unsigned char val[2];
1001 i2c_set_bus_num(I2C_PMIC);
1003 if (i2c_probe(addr)) {
1004 printf("Can't found max8998\n");
1008 printf("Charge Mode\n");
1010 i2c_read(addr, 0x0C, 1, val, 1);
1011 val[0] &= ~(0x7 << 0);
1012 val[0] |= 5; /* 600mA */
1013 i2c_write(addr, 0x0C, 1, val, 1);
1015 #ifdef CONFIG_S5PC1XXFB
1016 /* TODO: change to Image animation */
1019 set_font_color(FONT_WHITE);
1020 fb_printf("charging");
1022 level = battery_soc / 25;
1024 for (i = 0; i < 3; i++) {
1026 udelay(1 * 1000 * 1000);
1028 for (j = 0; j < 4; j++) {
1032 udelay(1 * 1000 * 1000);
1036 udelay(1 * 1000 * 1000);
1039 set_font_color(FONT_XOR);
1040 fb_printf("charging........");
1043 set_font_color(FONT_WHITE);
1044 fb_printf("charging");
1050 run_command("sleep 1", 0);
1053 static void check_micro_usb(int intr)
1056 unsigned char val[2];
1058 if (cpu_is_s5pc100())
1061 if (board_is_limo_real()) {
1062 if (hwrevision(0) || hwrevision(1))
1066 if (machine_is_cypress())
1067 i2c_set_bus_num(I2C_GPIO6);
1069 i2c_set_bus_num(I2C_PMIC);
1071 addr = 0x25; /* fsa9480 */
1072 if (i2c_probe(addr)) {
1073 printf("Can't found fsa9480\n");
1077 /* Clear Interrupt */
1079 i2c_read(addr, 0x03, 1, val, 2);
1083 /* Read Device Type 1 */
1084 i2c_read(addr, 0x0a, 1, val, 1);
1086 #define FSA_DEDICATED_CHARGER (1 << 6)
1087 #define FSA_UART (1 << 3)
1088 #define FSA_USB (1 << 2)
1091 * If USB, use default 475mA
1092 * If Charger, use 600mA and go to charge mode
1094 if (val[0] & FSA_DEDICATED_CHARGER)
1097 /* If Factory Mode is Boot ON-USB, go to download mode */
1098 i2c_read(addr, 0x07, 1, val, 1);
1100 #define FSA_ADC_FAC_USB 0x19
1101 #define FSA_ADC_FAC_UART 0x1d
1103 if (val[0] == FSA_ADC_FAC_USB)
1104 setenv("bootcmd", "usbdown");
1107 #define MAX8998_REG_ONOFF1 0x11
1108 #define MAX8998_REG_ONOFF2 0x12
1109 #define MAX8998_REG_ONOFF3 0x13
1110 #define MAX8998_LDO10 (1 << 3)
1111 #define MAX8998_LDO11 (1 << 2)
1112 #define MAX8998_LDO12 (1 << 1)
1113 #define MAX8998_LDO13 (1 << 0)
1114 #define MAX8998_LDO14 (1 << 7)
1115 #define MAX8998_LDO15 (1 << 6)
1116 #define MAX8998_LDO16 (1 << 5)
1117 #define MAX8998_LDO17 (1 << 4)
1119 static void init_pmic(void)
1122 unsigned char val[2];
1124 if (cpu_is_s5pc100())
1127 i2c_set_bus_num(I2C_PMIC);
1129 addr = 0xCC >> 1; /* max8998 */
1130 if (i2c_probe(addr)) {
1131 printf("Can't found max8998\n");
1137 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1139 * Disable LDO10(VPLL_1.1V), LDO11(CAM_IO_2.8V),
1140 * LDO12(CAM_ISP_1.2V), LDO13(CAM_A_2.8V)
1142 val[0] &= ~(MAX8998_LDO10 | MAX8998_LDO11 |
1143 MAX8998_LDO12 | MAX8998_LDO13);
1145 i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1146 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1148 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1150 * Disable LDO14(CAM_CIF_1.8), LDO15(CAM_AF_3.3V),
1151 * LDO16(VMIPI_1.8V), LDO17(CAM_8M_1.8V)
1153 val[0] &= ~(MAX8998_LDO14 | MAX8998_LDO15 |
1154 MAX8998_LDO16 | MAX8998_LDO17);
1155 i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1156 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1159 #define PDN_MASK(x) (0x3 << ((x) << 1))
1161 #define CON_INPUT(x) (0x0 << ((x) << 2))
1162 #define CON_OUTPUT(x) (0x1 << ((x) << 2))
1163 #define CON_IRQ(x) (0xf << ((x) << 2))
1165 #define DAT_SET(x) (0x1 << (x))
1166 #define DAT_CLEAR(x) (0x0 << (x))
1168 #define OUTPUT0(x) (0x0 << ((x) << 1))
1169 #define OUTPUT1(x) (0x1 << ((x) << 1))
1170 #define INPUT(x) (0x2 << ((x) << 1))
1172 #define PULL_DIS(x) (0x0 << ((x) << 1))
1173 #define PULL_DOWN(x) (0x1 << ((x) << 1))
1174 #define PULL_UP(x) (0x2 << ((x) << 1))
1176 #define PREVIOUS(x) (0x3 << ((x) << 1))
1178 struct gpio_powermode {
1179 unsigned int conpdn;
1180 unsigned int pudpdn;
1183 struct gpio_external {
1189 static struct gpio_powermode powerdown_modes[] = {
1190 { /* S5PC110_GPIO_A0_OFFSET */
1191 INPUT(0) | OUTPUT0(1) | INPUT(2) | OUTPUT0(3) |
1192 INPUT(4) | OUTPUT0(5) | INPUT(6) | OUTPUT0(7),
1193 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1194 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1195 }, { /* S5PC110_GPIO_A1_OFFSET */
1196 INPUT(0) | OUTPUT0(1) | INPUT(2) | OUTPUT0(3),
1197 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3),
1198 }, { /* S5PC110_GPIO_B_OFFSET */
1199 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1200 INPUT(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1201 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1202 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1203 }, { /* S5PC110_GPIO_C0_OFFSET */
1204 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1206 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1208 }, { /* S5PC110_GPIO_C1_OFFSET */
1209 /* OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1211 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1213 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1215 }, { /* S5PC110_GPIO_D0_OFFSET */
1216 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3),
1217 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3),
1218 }, { /* S5PC110_GPIO_D1_OFFSET */
1219 INPUT(0) | INPUT(1) | INPUT(2) | INPUT(3) |
1220 INPUT(4) | INPUT(5),
1221 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1222 PULL_DIS(4) | PULL_DIS(5),
1223 }, { /* S5PC110_GPIO_E0_OFFSET */
1224 INPUT(0) | INPUT(1) | INPUT(2) | INPUT(3) |
1225 INPUT(4) | INPUT(5) | INPUT(6) | INPUT(7),
1226 PULL_DOWN(0) | PULL_DOWN(1) | PULL_DOWN(2) | PULL_DOWN(3) |
1227 PULL_DOWN(4) | PULL_DOWN(5) | PULL_DOWN(6) | PULL_DOWN(7),
1228 }, { /* S5PC110_GPIO_E1_OFFSET */
1229 INPUT(0) | INPUT(1) | INPUT(2) | OUTPUT0(3) |
1231 PULL_DOWN(0) | PULL_DOWN(1) | PULL_DOWN(2) | PULL_DIS(3) |
1233 }, { /* S5PC110_GPIO_F0_OFFSET */
1234 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1235 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1236 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1237 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1238 }, { /* S5PC110_GPIO_F1_OFFSET */
1239 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1240 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1241 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1242 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1243 }, { /* S5PC110_GPIO_F2_OFFSET */
1244 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1245 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1246 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1247 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1248 }, { /* S5PC110_GPIO_F3_OFFSET */
1249 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1250 OUTPUT0(4) | OUTPUT0(5),
1251 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1252 PULL_DIS(4) | PULL_DIS(5),
1253 }, { /* S5PC110_GPIO_G0_OFFSET */
1254 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1255 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1256 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1257 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1258 }, { /* S5PC110_GPIO_G1_OFFSET */
1259 OUTPUT0(0) | INPUT(1) | OUTPUT0(2) | INPUT(3) |
1260 INPUT(4) | INPUT(5) | INPUT(6),
1261 PULL_DIS(0) | PULL_UP(1) | PULL_DIS(2) | PULL_UP(3) |
1262 PULL_UP(4) | PULL_UP(5) | PULL_UP(6),
1263 }, { /* S5PC110_GPIO_G2_OFFSET */
1264 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1265 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1266 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1267 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1268 }, { /* S5PC110_GPIO_G3_OFFSET */
1269 OUTPUT0(0) | OUTPUT0(1) | OUTPUT1(2) | INPUT(3) |
1270 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1271 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1272 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1273 }, { /* S5PC110_GPIO_I_OFFSET */
1274 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1275 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1276 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1277 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1278 }, { /* S5PC110_GPIO_J0_OFFSET */
1279 OUTPUT1(0) | OUTPUT0(1) | INPUT(2) | INPUT(3) |
1280 INPUT(4) | INPUT(5) | OUTPUT0(6) | OUTPUT0(7),
1281 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1282 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1283 }, { /* S5PC110_GPIO_J1_OFFSET */
1284 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1285 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1286 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1287 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1288 }, { /* S5PC110_GPIO_J2_OFFSET */
1289 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1290 INPUT(4) | OUTPUT0(5) | OUTPUT0(6) | INPUT(7),
1291 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1292 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DOWN(7),
1293 }, { /* S5PC110_GPIO_J3_OFFSET */
1294 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1295 OUTPUT1(4) | OUTPUT0(5) | INPUT(6) | INPUT(7),
1296 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1297 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1298 }, { /* S5PC110_GPIO_J4_OFFSET */
1299 INPUT(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1301 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1306 static struct gpio_external external_powerdown_modes[] = {
1307 { /* S5PC110_GPIO_H0_OFFSET */
1308 CON_OUTPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_OUTPUT(3) |
1309 CON_OUTPUT(4) | CON_OUTPUT(5) | CON_INPUT(6) | CON_INPUT(7),
1310 DAT_SET(0) | DAT_CLEAR(2) | DAT_CLEAR(3) |
1311 DAT_CLEAR(4) | DAT_CLEAR(5),
1312 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1313 PULL_DIS(4) | PULL_DIS(5),
1314 }, { /* S5PC110_GPIO_H1_OFFSET */
1315 /* CON_INPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_IRQ(3) |
1316 CON_IRQ(4) | CON_INPUT(5) | CON_INPUT(6) | CON_INPUT(7),
1318 PULL_DOWN(0) | PULL_DOWN(1) |
1320 CON_INPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_IRQ(3) |
1321 CON_INPUT(4) | CON_INPUT(5) | CON_OUTPUT(6) | CON_INPUT(7),
1323 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1325 }, { /* S5PC110_GPIO_H2_OFFSET */
1326 CON_OUTPUT(0) | CON_OUTPUT(1) | CON_OUTPUT(2) | CON_OUTPUT(3) |
1327 CON_IRQ(4) | CON_IRQ(5) | CON_IRQ(6) | CON_IRQ(7),
1328 DAT_CLEAR(0) | DAT_CLEAR(1) | DAT_CLEAR(2) | DAT_CLEAR(3),
1330 }, { /* S5PC110_GPIO_H3_OFFSET */
1331 CON_IRQ(0) | CON_IRQ(1) | CON_IRQ(2) | CON_OUTPUT(3) |
1332 CON_IRQ(4) | CON_INPUT(5) | CON_IRQ(6) | CON_OUTPUT(7),
1333 DAT_CLEAR(3) | DAT_CLEAR(7),
1338 static void setup_power_down_mode_registers(void)
1340 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1341 struct s5pc1xx_gpio_bank *bank;
1342 struct gpio_powermode *p;
1343 struct gpio_external *ge;
1346 if (cpu_is_s5pc100())
1349 if (!(machine_is_aquila() && board_is_limo_real()))
1352 bank = &gpio->gpio_a0;
1353 p = powerdown_modes;
1355 for (i = 0; i < ARRAY_SIZE(powerdown_modes); i++, p++, bank++) {
1356 writel(p->conpdn, &bank->pdn_con);
1357 writel(p->pudpdn, &bank->pdn_pull);
1359 bank = &gpio->gpio_i;
1360 writel(0x0008, &bank->dat);
1361 bank = &gpio->gpio_mp0_1;
1362 writel(0x5100, &bank->pdn_con);
1363 writel(0x0000, &bank->pdn_pull);
1364 bank = &gpio->gpio_mp0_2;
1365 writel(0x0020, &bank->pdn_con);
1366 writel(0x0000, &bank->pdn_pull);
1367 bank = &gpio->gpio_mp0_3;
1368 writel(0x0210, &bank->pdn_con);
1369 writel(0x0000, &bank->pdn_pull);
1370 bank = &gpio->gpio_mp0_4;
1371 writel(0x2280, &bank->pdn_con);
1372 writel(0x1140, &bank->pdn_pull);
1373 bank = &gpio->gpio_mp0_5;
1374 writel(0x00a2, &bank->pdn_con);
1375 writel(0x0001, &bank->pdn_pull);
1376 bank = &gpio->gpio_mp0_6;
1377 writel(0x0000, &bank->pdn_con);
1378 writel(0x0000, &bank->pdn_pull);
1379 bank = &gpio->gpio_mp0_7;
1380 writel(0x0000, &bank->pdn_con);
1381 writel(0x0000, &bank->pdn_pull);
1384 writel(0xff0022b0, (unsigned int *)0xF0000000);
1385 writel(0xff0022b0, (unsigned int *)0xF1400000);
1388 bank = &gpio->gpio_h0;
1389 ge = external_powerdown_modes;
1391 for (i = 0; i < ARRAY_SIZE(external_powerdown_modes); i++) {
1392 writel(ge->con, &bank->con);
1393 writel(ge->dat, &bank->dat);
1394 writel(ge->pud, &bank->pull);
1402 struct s6e63m0_platform_data {
1403 struct s5pc1xx_gpio_bank *bank;
1407 extern void s6e63m0_set_spi_interface(struct s6e63m0_platform_data *cs,
1408 struct s6e63m0_platform_data *clk, struct s6e63m0_platform_data *si,
1409 struct s6e63m0_platform_data *so);
1411 struct s6e63m0_platform_data pd_cs, pd_clk, pd_si, pd_so;
1412 struct s5pc110_gpio *gpio_base = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1414 void lcd_cfg_gpio(void)
1416 unsigned int i, f3_end = 4;
1418 for (i = 0; i < 8; i++) {
1419 /* set GPF0,1,2[0:7] for RGB Interface and Data lines (32bit) */
1420 gpio_cfg_pin(&gpio_base->gpio_f0, i, GPIO_FUNC(2));
1421 gpio_cfg_pin(&gpio_base->gpio_f1, i, GPIO_FUNC(2));
1422 gpio_cfg_pin(&gpio_base->gpio_f2, i, GPIO_FUNC(2));
1423 /* pull-up/down disable */
1424 gpio_set_pull(&gpio_base->gpio_f0, i, GPIO_PULL_NONE);
1425 gpio_set_pull(&gpio_base->gpio_f1, i, GPIO_PULL_NONE);
1426 gpio_set_pull(&gpio_base->gpio_f2, i, GPIO_PULL_NONE);
1428 /* drive strength to max (24bit) */
1429 gpio_set_drv(&gpio_base->gpio_f0, i, GPIO_DRV_4x);
1430 gpio_set_rate(&gpio_base->gpio_f0, i, GPIO_DRV_SLOW);
1431 gpio_set_drv(&gpio_base->gpio_f1, i, GPIO_DRV_4x);
1432 gpio_set_rate(&gpio_base->gpio_f1, i, GPIO_DRV_SLOW);
1433 gpio_set_drv(&gpio_base->gpio_f2, i, GPIO_DRV_4x);
1434 gpio_set_rate(&gpio_base->gpio_f2, i, GPIO_DRV_SLOW);
1437 /* set DISPLAY_DE_B pin for dual rgb mode. */
1438 if (board_is_media())
1441 for (i = 0; i < f3_end; i++) {
1442 /* set GPF3[0:3] for RGB Interface and Data lines (32bit) */
1443 gpio_cfg_pin(&gpio_base->gpio_f3, i, GPIO_PULL_UP);
1444 /* pull-up/down disable */
1445 gpio_set_pull(&gpio_base->gpio_f3, i, GPIO_PULL_NONE);
1446 /* drive strength to max (24bit) */
1447 gpio_set_drv(&gpio_base->gpio_f3, i, GPIO_DRV_4x);
1448 gpio_set_rate(&gpio_base->gpio_f3, i, GPIO_DRV_SLOW);
1450 /* display output path selection (only [1:0] valid) */
1451 writel(0x2, 0xE0107008);
1453 /* gpio pad configuration for LCD reset. */
1454 gpio_cfg_pin(&gpio_base->gpio_mp0_5, 5, GPIO_OUTPUT);
1456 /* gpio pad configuration for LCD ON. */
1457 gpio_cfg_pin(&gpio_base->gpio_j1, 3, GPIO_OUTPUT);
1461 if (board_is_p2_real())
1462 gpio_cfg_pin(&gpio_base->gpio_j1, 4, GPIO_OUTPUT);
1465 /* LCD_BACKLIGHT_EN */
1466 if (machine_is_geminus())
1467 gpio_cfg_pin(&gpio_base->gpio_mp0_5, 0, GPIO_OUTPUT);
1470 * gpio pad configuration for
1471 * DISPLAY_CS, DISPLAY_CLK, DISPLAY_SO, DISPLAY_SI.
1473 gpio_cfg_pin(&gpio_base->gpio_mp0_1, 1, GPIO_OUTPUT);
1474 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 1, GPIO_OUTPUT);
1475 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 2, GPIO_INPUT);
1476 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 3, GPIO_OUTPUT);
1478 if (machine_is_aquila()) {
1479 pd_cs.bank = &gpio_base->gpio_mp0_1;
1481 pd_clk.bank = &gpio_base->gpio_mp0_4;
1483 pd_si.bank = &gpio_base->gpio_mp0_4;
1485 pd_so.bank = &gpio_base->gpio_mp0_4;
1488 /* these data would be sent to s6e63m0 lcd panel driver. */
1489 s6e63m0_set_spi_interface(&pd_cs, &pd_clk, &pd_si, &pd_so);
1492 if (machine_is_cypress()) {
1494 gpio_cfg_pin(&gpio_base->gpio_mp0_1, 0, GPIO_OUTPUT);
1496 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 0, GPIO_OUTPUT);
1498 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 2, GPIO_OUTPUT);
1500 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 5, GPIO_OUTPUT);
1502 gpio_cfg_pin(&gpio_base->gpio_g2, 2, GPIO_OUTPUT);
1504 pd_cs.bank = &gpio_base->gpio_mp0_1;
1506 pd_clk.bank = &gpio_base->gpio_mp0_4;
1508 pd_si.bank = &gpio_base->gpio_mp0_4;
1511 /* these data would be sent to s6e63m0 lcd panel driver. */
1512 s6e63m0_set_spi_interface(&pd_cs, &pd_clk, &pd_si, NULL);
1518 void backlight_on(unsigned int onoff)
1520 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1523 if (machine_is_geminus())
1524 gpio_set_value(&gpio->gpio_mp0_5, 0, 1);
1526 if (machine_is_geminus())
1527 gpio_set_value(&gpio->gpio_mp0_5, 0, 0);
1531 void reset_lcd(void)
1533 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1535 if (machine_is_aquila() || machine_is_geminus())
1536 gpio_set_value(&gpio->gpio_mp0_5, 5, 1);
1537 if (machine_is_cypress())
1538 gpio_set_value(&gpio->gpio_mp0_4, 5, 1);
1541 void lcd_power_on(unsigned int onoff)
1543 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1546 if (machine_is_aquila() || machine_is_geminus())
1547 gpio_set_value(&gpio->gpio_j1, 3, 1);
1549 if (machine_is_cypress())
1550 gpio_set_value(&gpio->gpio_g2, 2, 1);
1553 if (board_is_p2_real())
1554 gpio_set_value(&gpio->gpio_j1, 4, 1);
1557 if (machine_is_aquila() || machine_is_geminus())
1558 gpio_set_value(&gpio->gpio_j1, 3, 0);
1560 if (machine_is_cypress())
1561 gpio_set_value(&gpio->gpio_g2, 2, 0);
1564 if (board_is_p2_real())
1565 gpio_set_value(&gpio->gpio_j1, 4, 0);
1570 extern void s6e63m0_cfg_ldo(void);
1571 extern void s6e63m0_enable_ldo(unsigned int onoff);
1573 void init_panel_info(vidinfo_t *vid)
1575 vid->cfg_gpio = NULL;
1576 vid->reset_lcd = NULL;
1577 vid->backlight_on = NULL;
1578 vid->lcd_power_on = NULL;
1580 vid->cfg_ldo = NULL;
1581 vid->enable_ldo = NULL;
1583 vid->init_delay = 0;
1584 vid->reset_delay = 0;
1585 vid->power_on_delay = 0;
1590 vid->vl_width = 480;
1591 vid->vl_height = 800;
1593 vid->dual_lcd_enabled = 0;
1595 if (board_is_media()) {
1598 vid->vl_width = 960;
1599 vid->vl_height = 800;
1601 /* enable dual lcd mode. */
1602 vid->dual_lcd_enabled = 1;
1605 vid->vl_clkp = CONFIG_SYS_HIGH;
1606 vid->vl_hsp = CONFIG_SYS_LOW;
1607 vid->vl_vsp = CONFIG_SYS_LOW;
1608 vid->vl_dp = CONFIG_SYS_HIGH;
1611 /* S6E63M0 LCD Panel */
1620 if (machine_is_aquila() || machine_is_cypress()) {
1621 vid->cfg_gpio = lcd_cfg_gpio;
1622 vid->reset_lcd = reset_lcd;
1623 vid->backlight_on = backlight_on;
1624 vid->lcd_power_on = lcd_power_on;
1626 vid->cfg_ldo = s6e63m0_cfg_ldo;
1627 vid->enable_ldo = s6e63m0_enable_ldo;
1629 vid->init_delay = 25000;
1630 vid->reset_delay = 120000;
1633 if (machine_is_geminus()) {
1637 vid->vl_width = 1024,
1638 vid->vl_height = 600,
1639 vid->vl_clkp = CONFIG_SYS_LOW,
1640 vid->vl_hsp = CONFIG_SYS_HIGH,
1641 vid->vl_vsp = CONFIG_SYS_HIGH,
1642 vid->vl_dp = CONFIG_SYS_LOW,
1653 vid->cfg_gpio = lcd_cfg_gpio;
1654 vid->reset_lcd = reset_lcd;
1655 vid->backlight_on = backlight_on;
1656 vid->lcd_power_on = lcd_power_on;
1662 vid->vl_width = 480,
1663 vid->vl_height = 800,
1664 vid->vl_clkp = CONFIG_SYS_HIGH,
1665 vid->vl_hsp = CONFIG_SYS_LOW,
1666 vid->vl_vsp = CONFIG_SYS_LOW,
1667 vid->vl_dp = CONFIG_SYS_HIGH,
1683 vid->vl_width = 1024,
1684 vid->vl_height = 600,
1685 vid->vl_clkp = CONFIG_SYS_HIGH,
1686 vid->vl_hsp = CONFIG_SYS_HIGH,
1687 vid->vl_vsp = CONFIG_SYS_HIGH,
1688 vid->vl_dp = CONFIG_SYS_LOW,
1691 /* AMS701KA AMOLED Panel. */
1703 static void setup_meminfo(void)
1705 char meminfo[64] = {0, };
1706 int count = 0, size, real;
1708 size = gd->bd->bi_dram[0].size >> 20;
1709 count += sprintf(meminfo + count, "mem=%dM", size);
1711 /* Each Chip Select can't exceed the 256MiB */
1712 size = gd->bd->bi_dram[1].size >> 20;
1713 real = min(size, 256);
1714 count += sprintf(meminfo + count, " mem=%dM@0x%x",
1715 real, (unsigned int)gd->bd->bi_dram[1].start);
1719 count += sprintf(meminfo + count, " mem=%dM@0x%x", size,
1720 (unsigned int)gd->bd->bi_dram[1].start + (real << 20));
1723 setenv("meminfo", meminfo);
1726 int misc_init_r(void)
1729 /* It should be located at first */
1732 if (board_is_limo_real() ||
1733 board_is_limo_universal() ||
1735 setenv("lcdinfo", "lcd=s6e63m0");
1736 /* it can't classify tl2796 with single-lcd and dual-lcd.
1738 setenv("lcdinfo", "lcd=tl2796-dual");
1742 * env values below should be added in case that lcd panel of geminus,
1743 * p1 and p2 are enabled at u-boot.
1744 * setenv means that lcd panel has been turned on at u-boot.
1746 if (machine_is_geminus())
1747 setenv("lcdinfo", "lcd=lms480jc01");
1750 if (board_is_p2_real())
1751 setenv("lcdinfo", "lcd=ams701");
1758 /* Set proper PMIC pins */
1761 /* Check auto burning */
1764 /* To power up I2C2 */
1767 /* Enable T-Flash at Limo Real or Limo Universal */
1770 /* Setup Limo Real board GPIOs */
1771 setup_limo_real_gpios();
1773 /* Setup Media board GPIOs */
1774 setup_media_gpios();
1776 /* Setup P1P2 board GPIOS */
1779 /* To usbdown automatically */
1780 if (board_is_p2_real())
1788 #ifdef CONFIG_S5PC1XXFB
1789 display_device_info();
1792 setup_power_down_mode_registers();
1794 /* check mcs5000 3-touch key */
1797 /* check max17040 */
1807 int board_init(void)
1809 gd->bd->bi_arch_number = MACH_TYPE;
1810 gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
1812 /* Check H/W Revision */
1813 check_hw_revision();
1820 unsigned int base, memconfig0, size;
1821 unsigned int memconfig1, sz = 0;
1823 if (cpu_is_s5pc100()) {
1824 /* In mem setup, we swap the bank. So below size is correct */
1825 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
1826 gd->bd->bi_dram[0].size = PHYS_SDRAM_2_SIZE;
1827 gd->bd->bi_dram[1].start = S5PC100_PHYS_SDRAM_2;
1830 /* In S5PC110, we can't swap the DMC0/1 */
1831 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
1832 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
1834 base = S5PC110_DMC1_BASE;
1835 /* DMC configuration */
1836 memconfig0 = readl(base + MEMCONFIG0_OFFSET);
1837 gd->bd->bi_dram[1].start = memconfig0 & 0xFF000000;
1839 size = (memconfig0 >> 16) & 0xFF;
1840 size = ((unsigned char) ~size) + 1;
1843 * (0x07 + 1) * 16 = 128 MiB
1844 * (0x0f + 1) * 16 = 256 MiB
1849 * Aquila Rev0.5 4G3G1G
1850 * Aquila Rev0.7 4G3G1G
1852 if (machine_is_aquila() && (hwrevision(5) || hwrevision(7))) {
1853 memconfig1 = readl(base + MEMCONFIG1_OFFSET);
1855 sz = (memconfig1 >> 16) & 0xFF;
1856 sz = ((unsigned char) ~sz) + 1;
1862 * bi_dram[1].size contains all DMC1 memory size
1864 gd->bd->bi_dram[1].size = (size + sz) << 20;
1869 /* Used for sleep test */
1870 static unsigned char saved_val[4][2];
1871 static unsigned int gpio_CP;
1872 static unsigned int gpio_T_FLASH;
1873 void board_sleep_init(void)
1877 unsigned char val[2];
1878 struct s5pc110_gpio *gpio =
1879 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1881 /* Set wakeup mask register */
1883 value &= ~(1 << 4); /* Keypad */
1884 value &= ~(1 << 3); /* RTC */
1885 value &= ~(1 << 2); /* RTC Alarm */
1886 writel(value, S5PC110_WAKEUP_MASK);
1888 /* Set external wakeup mask register */
1890 value &= ~(1 << 18); /* T-Flash */
1891 writel(value, S5PC110_EINT_WAKEUP_MASK);
1893 i2c_set_bus_num(I2C_PMIC);
1895 if (i2c_probe(addr)) {
1896 printf("Can't find max8998\n");
1901 gpio_CP = gpio_get_value(&gpio->gpio_h3, 7);
1902 gpio_set_value(&gpio->gpio_h3, 7, 0);
1903 value = gpio_get_value(&gpio->gpio_h3, 7);
1904 /* MMC T_FLASH off */
1905 gpio_T_FLASH = gpio_get_value(&gpio->gpio_mp0_5, 4);
1906 gpio_set_value(&gpio->gpio_mp0_5, 4, 0);
1907 value = gpio_get_value(&gpio->gpio_mp0_5, 4);
1909 gpio_set_value(&gpio->gpio_j2, 2, 0);
1910 gpio_set_value(&gpio->gpio_mp0_4, 7, 0);
1911 gpio_set_value(&gpio->gpio_j2, 3, 0); /* MHL_ON for REV02 or higher */
1914 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1915 saved_val[0][0] = val[0];
1916 saved_val[0][1] = val[1];
1917 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) |
1918 (1 << 1) | (1 << 0));
1919 i2c_write(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1920 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1922 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1923 saved_val[1][0] = val[0];
1924 saved_val[1][1] = val[1];
1925 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 3) |
1926 (1 << 2) | (1 << 1) | (1 << 0));
1928 i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1929 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1931 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1932 saved_val[2][0] = val[0];
1933 saved_val[2][1] = val[1];
1934 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4));
1935 i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1936 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1938 i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1939 saved_val[3][0] = val[0];
1940 saved_val[3][1] = val[1];
1941 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4));
1942 i2c_write(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1943 i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1944 printf("Turned off regulators. Preparing to sleep. [%s:%d]\n",
1945 __FILE__, __LINE__);
1948 void board_sleep_resume(void)
1952 unsigned char val[2];
1953 struct s5pc110_gpio *gpio =
1954 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1958 i2c_set_bus_num(I2C_PMIC);
1960 if (i2c_probe(addr)) {
1961 printf("Can't find max8998\n");
1966 i2c_write(addr, MAX8998_REG_ONOFF1, 1, saved_val[0], 1);
1967 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1969 i2c_write(addr, MAX8998_REG_ONOFF2, 1, saved_val[1], 1);
1970 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1972 i2c_write(addr, MAX8998_REG_ONOFF3, 1, saved_val[2], 1);
1973 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1975 i2c_write(addr, MAX8998_REG_ONOFF3+1, 1, saved_val[3], 1);
1976 i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1977 printf("Waked up.\n");
1980 gpio_set_value(&gpio->gpio_h3, 7, gpio_CP);
1981 value = gpio_get_value(&gpio->gpio_h3, 7);
1983 gpio_set_value(&gpio->gpio_mp0_5, 4, gpio_T_FLASH);
1984 value = gpio_get_value(&gpio->gpio_mp0_5, 4);
1986 /* check max17040 */
1993 #ifdef CONFIG_CMD_USBDOWN
1994 int usb_board_init(void)
1996 if (cpu_is_s5pc100()) {
1997 #ifdef CONFIG_HARD_I2C
1998 uchar val[2] = {0,};
2001 if (i2c_read(0x66, 0, 1, val, 2)) {
2002 printf("i2c_read error\n");
2009 if (i2c_write(0x66, 0, 1, val, 2)) {
2010 printf("i2c_write error\n");
2013 i2c_read(0x66, 0, 1, val, 2);
2019 if (board_is_limo_universal() ||
2020 board_is_limo_real() ||
2022 /* check usb path */
2023 if (board_is_limo_real() && !hwrevision(6))
2027 if (machine_is_tickertape()) {
2028 struct s5pc110_gpio *gpio =
2029 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
2031 /* USB_SEL: XM0ADDR_0: MP04[0] output mode */
2032 gpio_direction_output(&gpio->gpio_mp0_4, 0, 0);
2039 #ifdef CONFIG_GENERIC_MMC
2040 int board_mmc_init(bd_t *bis)
2044 struct s5pc110_clock *clk = (struct s5pc110_clock *)S5PC1XX_CLOCK_BASE;
2045 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
2048 /* MMC0 Clock source = SCLKMPLL */
2049 reg = readl(&clk->src4);
2052 writel(reg, &clk->src4);
2054 reg = readl(&clk->div4);
2057 /* set div value near 50MHz */
2058 clock = get_pll_clk(MPLL) / 1000000;
2059 for (i = 0; i < 0xf; i++) {
2060 if ((clock / (i + 1)) <= 50) {
2066 writel(reg, &clk->div4);
2073 * GPG0[3:6] SD_0_DATA[0:3]
2075 for (i = 0; i < 7; i++) {
2076 /* GPG0[0:6] special function 2 */
2077 gpio_cfg_pin(&gpio->gpio_g0, i, 0x2);
2078 /* GPG0[0:6] pull up */
2079 gpio_set_pull(&gpio->gpio_g0, i, GPIO_PULL_UP);
2082 return s5pc1xx_mmc_init(0);
2086 #ifdef CONFIG_CMD_PMIC
2087 static int pmic_status(void)
2089 unsigned char addr, val[2];
2092 i2c_set_bus_num(I2C_PMIC);
2094 if (i2c_probe(addr)) {
2095 printf("Can't found max8998\n");
2100 i2c_read(addr, reg, 1, val, 1);
2101 for (i = 7; i >= 4; i--)
2102 printf("BUCK%d %s\n", 7 - i + 1,
2103 val[0] & (1 << i) ? "on" : "off");
2105 printf("LDO%d %s\n", 5 - i,
2106 val[0] & (1 << i) ? "on" : "off");
2108 i2c_read(addr, reg, 1, val, 1);
2109 for (i = 7; i >= 0; i--)
2110 printf("LDO%d %s\n", 7 - i + 6,
2111 val[0] & (1 << i) ? "on" : "off");
2113 i2c_read(addr, reg, 1, val, 1);
2114 for (i = 7; i >= 4; i--)
2115 printf("LDO%d %s\n", 7 - i + 14,
2116 val[0] & (1 << i) ? "on" : "off");
2120 static int pmic_ldo_control(int buck, int ldo, int on)
2122 unsigned char addr, val[2];
2123 unsigned int reg, shift;
2131 } else if (ldo <= 13) {
2134 } else if (ldo <= 17) {
2136 shift = 17 - ldo + 4;
2143 shift = 4 - buck + 4;
2147 i2c_set_bus_num(I2C_PMIC);
2149 if (i2c_probe(addr)) {
2150 printf("Can't found max8998\n");
2154 i2c_read(addr, reg, 1, val, 1);
2156 val[0] |= (1 << shift);
2158 val[0] &= ~(1 << shift);
2159 i2c_write(addr, reg, 1, val, 1);
2160 i2c_read(addr, reg, 1, val, 1);
2161 printf("%s %d value 0x%x, %s\n", buck ? "buck" : "ldo", buck ? : ldo,
2162 val[0], val[0] & (1 << shift) ? "on" : "off");
2167 static int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
2169 int buck = 0, ldo = 0, on = -1;
2173 if (strncmp(argv[1], "status", 6) == 0)
2174 return pmic_status();
2177 if (strncmp(argv[1], "ldo", 3) == 0) {
2178 ldo = simple_strtoul(argv[2], NULL, 10);
2179 if (strncmp(argv[3], "on", 2) == 0)
2181 else if (strncmp(argv[3], "off", 3) == 0)
2185 return pmic_ldo_control(buck, ldo, on);
2187 if (strncmp(argv[1], "buck", 4) == 0) {
2188 buck = simple_strtoul(argv[2], NULL, 10);
2189 if (strncmp(argv[3], "on", 2) == 0)
2191 else if (strncmp(argv[3], "off", 3) == 0)
2195 return pmic_ldo_control(buck, ldo, on);
2207 pmic, CONFIG_SYS_MAXARGS, 1, do_pmic,
2208 "PMIC LDO & BUCK control",
2209 "status - Display PMIC LDO & BUCK status\n"
2210 "pmic ldo num on/off - Turn on/off the LDO\n"
2211 "pmic buck num on/off - Turn on/off the BUCK\n"