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);
534 /* C110 Geminus for rev0.0 */
535 gpio_set_pull(&gpio->gpio_j1, 2, GPIO_PULL_NONE);
536 gpio_direction_input(&gpio->gpio_j1, 2);
537 if (gpio_get_value(&gpio->gpio_j1, 2) == 1) {
538 board = MACH_GEMINUS;
539 if ((board_rev & ~BOARD_MASK) == 3)
542 gpio_set_pull(&gpio->gpio_j1, 2, GPIO_PULL_DOWN);
543 gpio_direction_output(&gpio->gpio_j1, 2, 0);
545 /* C110 Geminus for rev0.1 ~ */
546 gpio_set_pull(&gpio->gpio_j0, 6, GPIO_PULL_NONE);
547 gpio_direction_input(&gpio->gpio_j0, 6);
548 if (gpio_get_value(&gpio->gpio_j0, 6) == 1)
549 board = MACH_GEMINUS;
550 gpio_set_pull(&gpio->gpio_j0, 6, GPIO_PULL_DOWN);
554 if (cpu_is_s5pc110())
555 gd->bd->bi_arch_number = C110_MACH_START + board;
557 gd->bd->bi_arch_number = C100_MACH_START + board;
559 /* Architecture Common settings */
560 if (cpu_is_s5pc110()) {
561 setenv("mtdparts", MTDPARTS_DEFAULT_4KB);
563 setenv("bootk", "onenand read 0x30007FC0 0x60000 0x300000; "
565 setenv("updatek", "onenand erase 0x60000 0x300000; "
566 "onenand write 0x31008000 0x60000 0x300000");
570 static void show_hw_revision(void)
575 * Workaround for Rev 0.3 + CP Ver ES 3.1
578 if (board_is_limo_real()) {
580 /* default is Rev 0.4 */
586 if (cpu_is_s5pc110())
587 board = gd->bd->bi_arch_number - C110_MACH_START;
589 board = gd->bd->bi_arch_number - C100_MACH_START;
591 check_board_revision(board, board_rev);
592 dprintf("HW Revision:\t%x (%s%s)\n", board_rev, board_name[board],
593 display_features(board, board_rev));
596 static void check_auto_burn(void)
598 unsigned long magic_base = CONFIG_SYS_SDRAM_BASE + 0x02000000;
599 unsigned int count = 0;
602 if (readl(magic_base) == 0x426f6f74) { /* ASICC: Boot */
603 printf("Auto burning bootloader\n");
604 count += sprintf(buf + count, "run updateb; ");
606 if (readl(magic_base + 0x04) == 0x4b65726e) { /* ASICC: Kern */
607 printf("Auto burning kernel\n");
608 count += sprintf(buf + count, "run updatek; ");
612 count += sprintf(buf + count, "reset");
613 setenv("bootcmd", buf);
616 /* Clear the magic value */
617 writel(0xa5a55a5a, magic_base);
618 writel(0xa5a55a5a, magic_base + 0x4);
621 static void pmic_pin_init(void)
623 unsigned int reg, value;
624 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
626 if (cpu_is_s5pc100())
629 /* AP_PS_HOLD: XEINT_0: GPH0[0]
630 * Note: Don't use GPIO PS_HOLD it doesn't work
632 reg = S5PC110_PS_HOLD_CONTROL;
634 value |= S5PC110_PS_HOLD_DIR_OUTPUT |
635 S5PC110_PS_HOLD_DATA_HIGH |
636 S5PC110_PS_HOLD_OUT_EN;
639 /* nPOWER: XEINT_22: GPH2[6] interrupt mode */
640 gpio_cfg_pin(&gpio->gpio_h2, 6, GPIO_IRQ);
641 gpio_set_pull(&gpio->gpio_h2, 6, GPIO_PULL_UP);
644 static void enable_ldos(void)
646 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
648 if (cpu_is_s5pc100())
651 if (machine_is_p1p2())
654 /* TOUCH_EN: XMMC3DATA_3: GPG3[6] output high */
655 gpio_direction_output(&gpio->gpio_g3, 6, 1);
658 static void enable_t_flash(void)
660 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
662 if (!(board_is_limo_universal() || board_is_limo_real()))
665 /* T_FLASH_EN : XM0ADDR_13: MP0_5[4] output high */
666 gpio_direction_output(&gpio->gpio_mp0_5, 4, 1);
669 static void setup_limo_real_gpios(void)
671 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
673 if (!board_is_limo_real())
677 * Note: Please write GPIO alphabet order
679 /* CODEC_LDO_EN: XVVSYNC_LDI: GPF3[4] output high */
680 gpio_direction_output(&gpio->gpio_f3, 4, 1);
683 /* RESET_REQ_N: XM0BEN_1: MP0_2[1] output high */
684 gpio_direction_output(&gpio->gpio_mp0_2, 1, 1);
686 /* RESET_REQ_N: XM0CSn_2: MP0_1[2] output high */
687 gpio_direction_output(&gpio->gpio_mp0_1, 2, 1);
689 /* T_FLASH_DETECT: EINT28: GPH3[4] interrupt mode */
690 gpio_cfg_pin(&gpio->gpio_h3, 4, GPIO_IRQ);
691 gpio_set_pull(&gpio->gpio_h3, 4, GPIO_PULL_UP);
694 static void setup_media_gpios(void)
696 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
698 if (!board_is_media())
702 * Note: Please write GPIO alphabet order
704 /* RESET_REQ_N: XM0CSn_2: MP0_1[2] output high */
705 gpio_direction_output(&gpio->gpio_mp0_1, 2, 1);
707 /* T_FLASH_DETECT: EINT28: GPH3[4] interrupt mode */
708 gpio_cfg_pin(&gpio->gpio_h3, 4, GPIO_IRQ);
709 gpio_set_pull(&gpio->gpio_h3, 4, GPIO_PULL_UP);
712 static void setup_p1p2_gpios(void)
714 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
716 if (!machine_is_p1p2())
720 * Note: Please write GPIO alphabet order
722 /* RESET_REQ_N: XM0FRnB[1]: MP0_3[5] output high */
723 gpio_direction_output(&gpio->gpio_mp0_3, 5, 1);
724 /* CODEC_LDO_EN: XM0FRnB[2]: MP0_3[6] output high */
725 gpio_direction_output(&gpio->gpio_mp0_3, 6, 1);
728 #define KBR3 (1 << 3)
729 #define KBR2 (1 << 2)
730 #define KBR1 (1 << 1)
731 #define KBR0 (1 << 0)
733 static void enable_touchkey(void)
735 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
737 /* TOUCH_EN - GPIO_J3(0) : (J1B2) */
738 /* TOUCH_EN - GPIO_J3(5) : (not J1B2) */
739 if (board_rev & J1_B2_BOARD)
740 gpio_direction_output(&gpio->gpio_j3, 0, 1);
742 gpio_direction_output(&gpio->gpio_j3, 5, 1);
744 /* TOUCH_CE - GPIO_J2(6) */
745 gpio_direction_output(&gpio->gpio_j2, 6, 1); /* TOUCH_CE */
748 static void check_p2_keypad(void)
750 unsigned int auto_download = 0;
751 unsigned char addr = 0x34, val[2]; /* adp5587 key controller */
753 i2c_set_bus_num(I2C_2);
755 if (i2c_probe(addr)) {
756 printf("Can't found adp5587 key controller\n");
759 /* Row 8, Column 10 */
761 ret = i2c_write(addr, 0x1D, 1, val, 1); /* Set KP_GPIO1 */
763 ret |= i2c_write(addr, 0x1E, 1, val, 1); /* Set KP_GPIO2 */
765 ret |= i2c_write(addr, 0x1F, 1, val, 1); /* Set KP_GPIO3 */
766 val[0] = 0x3f; /* CMP2_INT | CMP1_INT | OVR_FLOW_INT |
767 K_LCK_INT | GPI_INT | KE_INT */
768 ret |= i2c_write(addr, 0x02, 1, val, 1); /* Status is W1C */
769 val[0] = 0x19; /* INT_CFG | OVR_FLOW_IEN | KE_IEN */
770 ret |= i2c_write(addr, 0x01, 1, val, 1);
771 for (i = 0; i < 10; i++) {
772 udelay(1000); /* FIXME */
773 i2c_read(addr, 0x04 + i, 1, val, 1);
778 if (auto_download == 1)
779 setenv("bootcmd", "usbdown");
782 static void check_keypad(void)
784 unsigned int reg, value;
785 unsigned int col_mask, row_mask;
786 unsigned int auto_download = 0;
787 unsigned int col_value[4], i;
789 if (cpu_is_s5pc100()) {
790 struct s5pc100_gpio *gpio =
791 (struct s5pc100_gpio *)S5PC100_GPIO_BASE;
793 /* Set GPH2[2:0] to KP_COL[2:0] */
794 gpio_cfg_pin(&gpio->gpio_h2, 0, 0x3);
795 gpio_cfg_pin(&gpio->gpio_h2, 1, 0x3);
796 gpio_cfg_pin(&gpio->gpio_h2, 2, 0x3);
798 /* Set GPH3[2:0] to KP_ROW[2:0] */
799 gpio_cfg_pin(&gpio->gpio_h3, 0, 0x3);
800 gpio_cfg_pin(&gpio->gpio_h3, 1, 0x3);
801 gpio_cfg_pin(&gpio->gpio_h3, 2, 0x3);
803 reg = S5PC100_KEYPAD_BASE;
805 struct s5pc110_gpio *gpio =
806 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
808 if (board_is_limo_real() || board_is_limo_universal()) {
816 for (i = 0; i < 4; i++) {
817 /* Set GPH3[3:0] to KP_ROW[3:0] */
818 if (row_mask & (0xF << (i << 2))) {
819 gpio_cfg_pin(&gpio->gpio_h3, i, 0x3);
820 if (!machine_is_p1p2())
821 gpio_set_pull(&gpio->gpio_h3,
825 /* Set GPH2[3:0] to KP_COL[3:0] */
826 if (col_mask & (0xF << (i << 2)))
827 gpio_cfg_pin(&gpio->gpio_h2, i, 0x3);
828 if (machine_is_p1p2())
829 gpio_set_pull(&gpio->gpio_h2, i, GPIO_PULL_UP);
832 reg = S5PC110_KEYPAD_BASE;
836 writel(value, reg + S5PC1XX_KEYIFCOL_OFFSET);
837 value = readl(reg + S5PC1XX_KEYIFROW_OFFSET);
838 /* VOLUMEDOWN and CAM(Half shot) Button */
839 if ((value & KBR1) == 0) {
842 value = readl(reg + S5PC1XX_KEYIFCOL_OFFSET);
845 writel(value, reg + S5PC1XX_KEYIFCOL_OFFSET);
847 col_value[i++] = readl(reg + S5PC1XX_KEYIFROW_OFFSET);
849 writel(0x00, reg + S5PC1XX_KEYIFCOL_OFFSET);
851 /* expected value is row_value[0] = 0x00 row_value[1] = 0x01 */
853 if ((col_value[0] & 0x3) == 0x3 && (col_value[1] & 0x3) == 0x3)
856 if ((col_value[0] & 0x3) == 0x3 && (col_value[1] & 0x3) != 0x3)
858 if (machine_is_p1p2()) {
859 if ((col_value[0] & 0xd) == 0xd)
865 setenv("bootcmd", "usbdown");
868 static void check_touchkey(void)
871 unsigned char val[2];
872 unsigned char addr = 0x20; /* mcs5000 3-touchkey */
874 if (!machine_is_aquila())
878 i2c_set_bus_num(I2C_GPIO6);
880 if (i2c_probe(addr)) {
881 printf("Can't found 3 touchkey\n");
885 #define MCS5000_TK_HW_VERSION 0x06
886 #define MCS5000_TK_FW_VERSION 0x0A
887 #define MCS5000_TK_MI_VERSION 0x0B
889 reg = MCS5000_TK_MI_VERSION;
890 i2c_read(addr, reg, 1, val, 1);
891 dprintf("3-touchkey:\tM/I 0x%x, ", val[0]);
892 reg = MCS5000_TK_HW_VERSION;
893 i2c_read(addr, reg, 1, val, 1);
894 dprintf("H/W 0x%x, ", val[0]);
895 reg = MCS5000_TK_FW_VERSION;
896 i2c_read(addr, reg, 1, val, 1);
897 dprintf("F/W 0x%x\n", val[0]);
900 static void enable_battery(void)
902 unsigned char val[2];
903 unsigned char addr = 0x36; /* max17040 fuel gauge */
905 if (machine_is_aquila()) {
910 if (machine_is_tickertape())
913 if (machine_is_cypress())
914 i2c_set_bus_num(I2C_GPIO7);
916 i2c_set_bus_num(I2C_GPIO3);
918 if (i2c_probe(addr)) {
919 printf("Can't found max17040 fuel gauge\n");
925 i2c_write(addr, 0xfe, 1, val, 2);
928 static void check_battery(void)
930 unsigned char val[2];
931 unsigned char addr = 0x36; /* max17040 fuel gauge */
933 if (machine_is_aquila()) {
938 if (machine_is_tickertape())
941 if (machine_is_cypress())
942 i2c_set_bus_num(I2C_GPIO7);
944 i2c_set_bus_num(I2C_GPIO3);
946 if (i2c_probe(addr)) {
947 printf("Can't found max17040 fuel gauge\n");
951 i2c_read(addr, 0x04, 1, val, 1);
953 dprintf("battery:\t%d%%\n", val[0]);
955 battery_soc = val[0];
958 static void check_mhl(void)
960 unsigned char val[2];
961 unsigned char addr = 0x39; /* SIL9230 */
962 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
964 /* MHL Power enable */
965 /* HDMI_EN : GPJ2[2] XMSMDATA_2 output mode */
966 gpio_direction_output(&gpio->gpio_j2, 2, 1);
968 /* MHL_RST : MP0_4[7] XM0ADDR_7 output mode */
969 gpio_direction_output(&gpio->gpio_mp0_4, 7, 0);
971 /* 10ms required after reset */
975 gpio_set_value(&gpio->gpio_mp0_4, 7, 1);
977 i2c_set_bus_num(I2C_GPIO5);
980 if (i2c_probe(addr)) {
981 printf("Can't found MHL Chip\n");
987 * set to Normal operation
990 i2c_write((0x72 >> 1), 0x08, 1, val, 1);
991 i2c_read((0x72 >> 1), 0x08, 1, val, 1);
996 * 00 = MHL termination ON
997 * 11 = MHL termination OFF
1000 i2c_write((0x72 >> 1), 0xa0, 1, val, 1);
1001 i2c_read((0x72 >> 1), 0xa0, 1, val, 1);
1004 static void into_charge_mode(void)
1006 unsigned char addr = 0xCC >> 1; /* max8998 */;
1007 unsigned char val[2];
1011 i2c_set_bus_num(I2C_PMIC);
1013 if (i2c_probe(addr)) {
1014 printf("Can't found max8998\n");
1018 printf("Charge Mode\n");
1020 i2c_read(addr, 0x0C, 1, val, 1);
1021 val[0] &= ~(0x7 << 0);
1022 val[0] |= 5; /* 600mA */
1023 i2c_write(addr, 0x0C, 1, val, 1);
1025 #ifdef CONFIG_S5PC1XXFB
1026 /* TODO: change to Image animation */
1029 set_font_color(FONT_WHITE);
1030 fb_printf("charging");
1032 level = battery_soc / 25;
1034 for (i = 0; i < 3; i++) {
1036 udelay(1 * 1000 * 1000);
1038 for (j = 0; j < 4; j++) {
1042 udelay(1 * 1000 * 1000);
1046 udelay(1 * 1000 * 1000);
1049 set_font_color(FONT_XOR);
1050 fb_printf("charging........");
1053 set_font_color(FONT_WHITE);
1054 fb_printf("charging");
1060 run_command("sleep 1", 0);
1063 static void check_micro_usb(int intr)
1066 unsigned char val[2];
1068 if (cpu_is_s5pc100())
1071 if (board_is_limo_real()) {
1072 if (hwrevision(0) || hwrevision(1))
1076 if (machine_is_cypress())
1077 i2c_set_bus_num(I2C_GPIO6);
1079 i2c_set_bus_num(I2C_PMIC);
1081 addr = 0x25; /* fsa9480 */
1082 if (i2c_probe(addr)) {
1083 printf("Can't found fsa9480\n");
1087 /* Clear Interrupt */
1089 i2c_read(addr, 0x03, 1, val, 2);
1093 /* Read Device Type 1 */
1094 i2c_read(addr, 0x0a, 1, val, 1);
1096 #define FSA_DEDICATED_CHARGER (1 << 6)
1097 #define FSA_UART (1 << 3)
1098 #define FSA_USB (1 << 2)
1101 * If USB, use default 475mA
1102 * If Charger, use 600mA and go to charge mode
1104 if (val[0] & FSA_DEDICATED_CHARGER)
1107 /* If Factory Mode is Boot ON-USB, go to download mode */
1108 i2c_read(addr, 0x07, 1, val, 1);
1110 #define FSA_ADC_FAC_USB 0x19
1111 #define FSA_ADC_FAC_UART 0x1d
1113 if (val[0] == FSA_ADC_FAC_USB)
1114 setenv("bootcmd", "usbdown");
1117 #define MAX8998_REG_ONOFF1 0x11
1118 #define MAX8998_REG_ONOFF2 0x12
1119 #define MAX8998_REG_ONOFF3 0x13
1120 #define MAX8998_LDO3 (1 << 2)
1121 #define MAX8998_LDO10 (1 << 3)
1122 #define MAX8998_LDO11 (1 << 2)
1123 #define MAX8998_LDO12 (1 << 1)
1124 #define MAX8998_LDO13 (1 << 0)
1125 #define MAX8998_LDO14 (1 << 7)
1126 #define MAX8998_LDO15 (1 << 6)
1127 #define MAX8998_LDO16 (1 << 5)
1128 #define MAX8998_LDO17 (1 << 4)
1130 static void init_pmic(void)
1133 unsigned char val[2];
1135 if (cpu_is_s5pc100())
1138 i2c_set_bus_num(I2C_PMIC);
1140 addr = 0xCC >> 1; /* max8998 */
1141 if (i2c_probe(addr)) {
1142 printf("Can't found max8998\n");
1147 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1148 val[0] &= ~MAX8998_LDO3;
1149 i2c_write(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1152 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1154 * Disable LDO10(VPLL_1.1V), LDO11(CAM_IO_2.8V),
1155 * LDO12(CAM_ISP_1.2V), LDO13(CAM_A_2.8V)
1157 val[0] &= ~(MAX8998_LDO10 | MAX8998_LDO11 |
1158 MAX8998_LDO12 | MAX8998_LDO13);
1160 i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1161 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1163 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1165 * Disable LDO14(CAM_CIF_1.8), LDO15(CAM_AF_3.3V),
1166 * LDO16(VMIPI_1.8V), LDO17(CAM_8M_1.8V)
1168 val[0] &= ~(MAX8998_LDO14 | MAX8998_LDO15 |
1169 MAX8998_LDO16 | MAX8998_LDO17);
1170 i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1171 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1174 #define PDN_MASK(x) (0x3 << ((x) << 1))
1176 #define CON_INPUT(x) (0x0 << ((x) << 2))
1177 #define CON_OUTPUT(x) (0x1 << ((x) << 2))
1178 #define CON_IRQ(x) (0xf << ((x) << 2))
1180 #define DAT_SET(x) (0x1 << (x))
1181 #define DAT_CLEAR(x) (0x0 << (x))
1183 #define OUTPUT0(x) (0x0 << ((x) << 1))
1184 #define OUTPUT1(x) (0x1 << ((x) << 1))
1185 #define INPUT(x) (0x2 << ((x) << 1))
1187 #define PULL_DIS(x) (0x0 << ((x) << 1))
1188 #define PULL_DOWN(x) (0x1 << ((x) << 1))
1189 #define PULL_UP(x) (0x2 << ((x) << 1))
1191 #define PREVIOUS(x) (0x3 << ((x) << 1))
1193 struct gpio_powermode {
1194 unsigned int conpdn;
1195 unsigned int pudpdn;
1198 struct gpio_external {
1204 static struct gpio_powermode powerdown_modes[] = {
1205 { /* S5PC110_GPIO_A0_OFFSET */
1206 INPUT(0) | OUTPUT0(1) | INPUT(2) | OUTPUT0(3) |
1207 INPUT(4) | OUTPUT0(5) | INPUT(6) | OUTPUT0(7),
1208 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1209 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1210 }, { /* S5PC110_GPIO_A1_OFFSET */
1211 INPUT(0) | OUTPUT0(1) | INPUT(2) | OUTPUT0(3),
1212 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3),
1213 }, { /* S5PC110_GPIO_B_OFFSET */
1214 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1215 INPUT(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1216 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1217 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1218 }, { /* S5PC110_GPIO_C0_OFFSET */
1219 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1221 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1223 }, { /* S5PC110_GPIO_C1_OFFSET */
1224 /* OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1226 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1228 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1230 }, { /* S5PC110_GPIO_D0_OFFSET */
1231 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3),
1232 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3),
1233 }, { /* S5PC110_GPIO_D1_OFFSET */
1234 INPUT(0) | INPUT(1) | INPUT(2) | INPUT(3) |
1235 INPUT(4) | INPUT(5),
1236 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1237 PULL_DIS(4) | PULL_DIS(5),
1238 }, { /* S5PC110_GPIO_E0_OFFSET */
1239 INPUT(0) | INPUT(1) | INPUT(2) | INPUT(3) |
1240 INPUT(4) | INPUT(5) | INPUT(6) | INPUT(7),
1241 PULL_DOWN(0) | PULL_DOWN(1) | PULL_DOWN(2) | PULL_DOWN(3) |
1242 PULL_DOWN(4) | PULL_DOWN(5) | PULL_DOWN(6) | PULL_DOWN(7),
1243 }, { /* S5PC110_GPIO_E1_OFFSET */
1244 INPUT(0) | INPUT(1) | INPUT(2) | OUTPUT0(3) |
1246 PULL_DOWN(0) | PULL_DOWN(1) | PULL_DOWN(2) | PULL_DIS(3) |
1248 }, { /* S5PC110_GPIO_F0_OFFSET */
1249 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1250 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1251 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1252 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1253 }, { /* S5PC110_GPIO_F1_OFFSET */
1254 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1255 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1256 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1257 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1258 }, { /* S5PC110_GPIO_F2_OFFSET */
1259 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1260 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1261 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1262 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1263 }, { /* S5PC110_GPIO_F3_OFFSET */
1264 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1265 OUTPUT0(4) | OUTPUT0(5),
1266 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1267 PULL_DIS(4) | PULL_DIS(5),
1268 }, { /* S5PC110_GPIO_G0_OFFSET */
1269 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1270 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1271 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1272 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1273 }, { /* S5PC110_GPIO_G1_OFFSET */
1274 OUTPUT0(0) | INPUT(1) | OUTPUT0(2) | INPUT(3) |
1275 INPUT(4) | INPUT(5) | INPUT(6),
1276 PULL_DIS(0) | PULL_UP(1) | PULL_DIS(2) | PULL_UP(3) |
1277 PULL_UP(4) | PULL_UP(5) | PULL_UP(6),
1278 }, { /* S5PC110_GPIO_G2_OFFSET */
1279 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1280 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1281 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1282 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1283 }, { /* S5PC110_GPIO_G3_OFFSET */
1284 OUTPUT0(0) | OUTPUT0(1) | OUTPUT1(2) | INPUT(3) |
1285 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1286 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1287 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1288 }, { /* S5PC110_GPIO_I_OFFSET */
1289 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1290 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6),
1291 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1292 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6),
1293 }, { /* S5PC110_GPIO_J0_OFFSET */
1294 OUTPUT1(0) | OUTPUT0(1) | INPUT(2) | INPUT(3) |
1295 INPUT(4) | INPUT(5) | OUTPUT0(6) | OUTPUT0(7),
1296 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1297 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1298 }, { /* S5PC110_GPIO_J1_OFFSET */
1299 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1300 OUTPUT0(4) | OUTPUT0(5) | OUTPUT0(6) | OUTPUT0(7),
1301 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1302 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1303 }, { /* S5PC110_GPIO_J2_OFFSET */
1304 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1305 INPUT(4) | OUTPUT0(5) | OUTPUT0(6) | INPUT(7),
1306 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1307 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DOWN(7),
1308 }, { /* S5PC110_GPIO_J3_OFFSET */
1309 OUTPUT0(0) | OUTPUT0(1) | OUTPUT0(2) | OUTPUT0(3) |
1310 OUTPUT1(4) | OUTPUT0(5) | INPUT(6) | INPUT(7),
1311 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1312 PULL_DIS(4) | PULL_DIS(5) | PULL_DIS(6) | PULL_DIS(7),
1313 }, { /* S5PC110_GPIO_J4_OFFSET */
1314 INPUT(0) | OUTPUT0(1) | OUTPUT0(2) | INPUT(3) |
1316 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1321 static struct gpio_external external_powerdown_modes[] = {
1322 { /* S5PC110_GPIO_H0_OFFSET */
1323 CON_OUTPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_OUTPUT(3) |
1324 CON_OUTPUT(4) | CON_OUTPUT(5) | CON_INPUT(6) | CON_INPUT(7),
1325 DAT_SET(0) | DAT_CLEAR(2) | DAT_CLEAR(3) |
1326 DAT_CLEAR(4) | DAT_CLEAR(5),
1327 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1328 PULL_DIS(4) | PULL_DIS(5),
1329 }, { /* S5PC110_GPIO_H1_OFFSET */
1330 /* CON_INPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_IRQ(3) |
1331 CON_IRQ(4) | CON_INPUT(5) | CON_INPUT(6) | CON_INPUT(7),
1333 PULL_DOWN(0) | PULL_DOWN(1) |
1335 CON_INPUT(0) | CON_INPUT(1) | CON_OUTPUT(2) | CON_IRQ(3) |
1336 CON_INPUT(4) | CON_INPUT(5) | CON_OUTPUT(6) | CON_INPUT(7),
1338 PULL_DIS(0) | PULL_DIS(1) | PULL_DIS(2) | PULL_DIS(3) |
1340 }, { /* S5PC110_GPIO_H2_OFFSET */
1341 CON_OUTPUT(0) | CON_OUTPUT(1) | CON_OUTPUT(2) | CON_OUTPUT(3) |
1342 CON_IRQ(4) | CON_IRQ(5) | CON_IRQ(6) | CON_IRQ(7),
1343 DAT_CLEAR(0) | DAT_CLEAR(1) | DAT_CLEAR(2) | DAT_CLEAR(3),
1345 }, { /* S5PC110_GPIO_H3_OFFSET */
1346 CON_IRQ(0) | CON_IRQ(1) | CON_IRQ(2) | CON_OUTPUT(3) |
1347 CON_IRQ(4) | CON_INPUT(5) | CON_IRQ(6) | CON_OUTPUT(7),
1348 DAT_CLEAR(3) | DAT_CLEAR(7),
1353 static void setup_power_down_mode_registers(void)
1355 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1356 struct s5pc1xx_gpio_bank *bank;
1357 struct gpio_powermode *p;
1358 struct gpio_external *ge;
1361 if (cpu_is_s5pc100())
1364 if (!(machine_is_aquila() && board_is_limo_real()))
1367 bank = &gpio->gpio_a0;
1368 p = powerdown_modes;
1370 for (i = 0; i < ARRAY_SIZE(powerdown_modes); i++, p++, bank++) {
1371 writel(p->conpdn, &bank->pdn_con);
1372 writel(p->pudpdn, &bank->pdn_pull);
1374 bank = &gpio->gpio_i;
1375 writel(0x0008, &bank->dat);
1376 bank = &gpio->gpio_mp0_1;
1377 writel(0x5100, &bank->pdn_con);
1378 writel(0x0000, &bank->pdn_pull);
1379 bank = &gpio->gpio_mp0_2;
1380 writel(0x0020, &bank->pdn_con);
1381 writel(0x0000, &bank->pdn_pull);
1382 bank = &gpio->gpio_mp0_3;
1383 writel(0x0210, &bank->pdn_con);
1384 writel(0x0000, &bank->pdn_pull);
1385 bank = &gpio->gpio_mp0_4;
1386 writel(0x2280, &bank->pdn_con);
1387 writel(0x1140, &bank->pdn_pull);
1388 bank = &gpio->gpio_mp0_5;
1389 writel(0x00a2, &bank->pdn_con);
1390 writel(0x0001, &bank->pdn_pull);
1391 bank = &gpio->gpio_mp0_6;
1392 writel(0x0000, &bank->pdn_con);
1393 writel(0x0000, &bank->pdn_pull);
1394 bank = &gpio->gpio_mp0_7;
1395 writel(0x0000, &bank->pdn_con);
1396 writel(0x0000, &bank->pdn_pull);
1399 writel(0xff0022b0, (unsigned int *)0xF0000000);
1400 writel(0xff0022b0, (unsigned int *)0xF1400000);
1403 bank = &gpio->gpio_h0;
1404 ge = external_powerdown_modes;
1406 for (i = 0; i < ARRAY_SIZE(external_powerdown_modes); i++) {
1407 writel(ge->con, &bank->con);
1408 writel(ge->dat, &bank->dat);
1409 writel(ge->pud, &bank->pull);
1417 struct s6e63m0_platform_data {
1418 struct s5pc1xx_gpio_bank *bank;
1422 extern void s6e63m0_set_spi_interface(struct s6e63m0_platform_data *cs,
1423 struct s6e63m0_platform_data *clk, struct s6e63m0_platform_data *si,
1424 struct s6e63m0_platform_data *so);
1426 struct s6e63m0_platform_data pd_cs, pd_clk, pd_si, pd_so;
1427 struct s5pc110_gpio *gpio_base = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1429 void lcd_cfg_gpio(void)
1431 unsigned int i, f3_end = 4;
1433 for (i = 0; i < 8; i++) {
1434 /* set GPF0,1,2[0:7] for RGB Interface and Data lines (32bit) */
1435 gpio_cfg_pin(&gpio_base->gpio_f0, i, GPIO_FUNC(2));
1436 gpio_cfg_pin(&gpio_base->gpio_f1, i, GPIO_FUNC(2));
1437 gpio_cfg_pin(&gpio_base->gpio_f2, i, GPIO_FUNC(2));
1438 /* pull-up/down disable */
1439 gpio_set_pull(&gpio_base->gpio_f0, i, GPIO_PULL_NONE);
1440 gpio_set_pull(&gpio_base->gpio_f1, i, GPIO_PULL_NONE);
1441 gpio_set_pull(&gpio_base->gpio_f2, i, GPIO_PULL_NONE);
1443 /* drive strength to max (24bit) */
1444 gpio_set_drv(&gpio_base->gpio_f0, i, GPIO_DRV_4x);
1445 gpio_set_rate(&gpio_base->gpio_f0, i, GPIO_DRV_SLOW);
1446 gpio_set_drv(&gpio_base->gpio_f1, i, GPIO_DRV_4x);
1447 gpio_set_rate(&gpio_base->gpio_f1, i, GPIO_DRV_SLOW);
1448 gpio_set_drv(&gpio_base->gpio_f2, i, GPIO_DRV_4x);
1449 gpio_set_rate(&gpio_base->gpio_f2, i, GPIO_DRV_SLOW);
1452 /* set DISPLAY_DE_B pin for dual rgb mode. */
1453 if (board_is_media())
1456 for (i = 0; i < f3_end; i++) {
1457 /* set GPF3[0:3] for RGB Interface and Data lines (32bit) */
1458 gpio_cfg_pin(&gpio_base->gpio_f3, i, GPIO_PULL_UP);
1459 /* pull-up/down disable */
1460 gpio_set_pull(&gpio_base->gpio_f3, i, GPIO_PULL_NONE);
1461 /* drive strength to max (24bit) */
1462 gpio_set_drv(&gpio_base->gpio_f3, i, GPIO_DRV_4x);
1463 gpio_set_rate(&gpio_base->gpio_f3, i, GPIO_DRV_SLOW);
1465 /* display output path selection (only [1:0] valid) */
1466 writel(0x2, 0xE0107008);
1468 /* gpio pad configuration for LCD reset. */
1469 gpio_cfg_pin(&gpio_base->gpio_mp0_5, 5, GPIO_OUTPUT);
1471 /* gpio pad configuration for LCD ON. */
1472 gpio_cfg_pin(&gpio_base->gpio_j1, 3, GPIO_OUTPUT);
1476 if (board_is_p2_real())
1477 gpio_cfg_pin(&gpio_base->gpio_j1, 4, GPIO_OUTPUT);
1480 /* LCD_BACKLIGHT_EN */
1481 if (machine_is_geminus())
1482 gpio_cfg_pin(&gpio_base->gpio_mp0_5, 0, GPIO_OUTPUT);
1485 * gpio pad configuration for
1486 * DISPLAY_CS, DISPLAY_CLK, DISPLAY_SO, DISPLAY_SI.
1488 gpio_cfg_pin(&gpio_base->gpio_mp0_1, 1, GPIO_OUTPUT);
1489 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 1, GPIO_OUTPUT);
1490 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 2, GPIO_INPUT);
1491 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 3, GPIO_OUTPUT);
1493 if (machine_is_aquila()) {
1494 pd_cs.bank = &gpio_base->gpio_mp0_1;
1496 pd_clk.bank = &gpio_base->gpio_mp0_4;
1498 pd_si.bank = &gpio_base->gpio_mp0_4;
1500 pd_so.bank = &gpio_base->gpio_mp0_4;
1503 /* these data would be sent to s6e63m0 lcd panel driver. */
1504 s6e63m0_set_spi_interface(&pd_cs, &pd_clk, &pd_si, &pd_so);
1507 if (machine_is_cypress()) {
1509 gpio_cfg_pin(&gpio_base->gpio_mp0_1, 0, GPIO_OUTPUT);
1511 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 0, GPIO_OUTPUT);
1513 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 2, GPIO_OUTPUT);
1515 gpio_cfg_pin(&gpio_base->gpio_mp0_4, 5, GPIO_OUTPUT);
1517 gpio_cfg_pin(&gpio_base->gpio_g2, 2, GPIO_OUTPUT);
1519 pd_cs.bank = &gpio_base->gpio_mp0_1;
1521 pd_clk.bank = &gpio_base->gpio_mp0_4;
1523 pd_si.bank = &gpio_base->gpio_mp0_4;
1526 /* these data would be sent to s6e63m0 lcd panel driver. */
1527 s6e63m0_set_spi_interface(&pd_cs, &pd_clk, &pd_si, NULL);
1533 void backlight_on(unsigned int onoff)
1535 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1538 if (machine_is_geminus())
1539 gpio_set_value(&gpio->gpio_mp0_5, 0, 1);
1541 if (machine_is_geminus())
1542 gpio_set_value(&gpio->gpio_mp0_5, 0, 0);
1546 void reset_lcd(void)
1548 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1550 if (machine_is_aquila() || machine_is_geminus())
1551 gpio_set_value(&gpio->gpio_mp0_5, 5, 1);
1552 if (machine_is_cypress())
1553 gpio_set_value(&gpio->gpio_mp0_4, 5, 1);
1556 void lcd_power_on(unsigned int onoff)
1558 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *) S5PC110_GPIO_BASE;
1561 if (machine_is_aquila() || machine_is_geminus())
1562 gpio_set_value(&gpio->gpio_j1, 3, 1);
1564 if (machine_is_cypress())
1565 gpio_set_value(&gpio->gpio_g2, 2, 1);
1568 if (board_is_p2_real())
1569 gpio_set_value(&gpio->gpio_j1, 4, 1);
1572 if (machine_is_aquila() || machine_is_geminus())
1573 gpio_set_value(&gpio->gpio_j1, 3, 0);
1575 if (machine_is_cypress())
1576 gpio_set_value(&gpio->gpio_g2, 2, 0);
1579 if (board_is_p2_real())
1580 gpio_set_value(&gpio->gpio_j1, 4, 0);
1585 extern void s6e63m0_cfg_ldo(void);
1586 extern void s6e63m0_enable_ldo(unsigned int onoff);
1588 void init_panel_info(vidinfo_t *vid)
1590 vid->cfg_gpio = NULL;
1591 vid->reset_lcd = NULL;
1592 vid->backlight_on = NULL;
1593 vid->lcd_power_on = NULL;
1595 vid->cfg_ldo = NULL;
1596 vid->enable_ldo = NULL;
1598 vid->init_delay = 0;
1599 vid->reset_delay = 0;
1600 vid->power_on_delay = 0;
1605 vid->vl_width = 480;
1606 vid->vl_height = 800;
1608 vid->dual_lcd_enabled = 0;
1610 if (board_is_media()) {
1613 vid->vl_width = 960;
1614 vid->vl_height = 800;
1616 /* enable dual lcd mode. */
1617 vid->dual_lcd_enabled = 1;
1620 vid->vl_clkp = CONFIG_SYS_HIGH;
1621 vid->vl_hsp = CONFIG_SYS_LOW;
1622 vid->vl_vsp = CONFIG_SYS_LOW;
1623 vid->vl_dp = CONFIG_SYS_HIGH;
1626 /* S6E63M0 LCD Panel */
1635 if (machine_is_aquila() || machine_is_cypress()) {
1636 vid->cfg_gpio = lcd_cfg_gpio;
1637 vid->reset_lcd = reset_lcd;
1638 vid->backlight_on = backlight_on;
1639 vid->lcd_power_on = lcd_power_on;
1641 vid->cfg_ldo = s6e63m0_cfg_ldo;
1642 vid->enable_ldo = s6e63m0_enable_ldo;
1644 vid->init_delay = 25000;
1645 vid->reset_delay = 120000;
1648 if (machine_is_geminus()) {
1652 vid->vl_width = 1024,
1653 vid->vl_height = 600,
1654 vid->vl_clkp = CONFIG_SYS_LOW,
1655 vid->vl_hsp = CONFIG_SYS_HIGH,
1656 vid->vl_vsp = CONFIG_SYS_HIGH,
1657 vid->vl_dp = CONFIG_SYS_LOW,
1668 vid->cfg_gpio = lcd_cfg_gpio;
1669 vid->reset_lcd = reset_lcd;
1670 vid->backlight_on = backlight_on;
1671 vid->lcd_power_on = lcd_power_on;
1677 vid->vl_width = 480,
1678 vid->vl_height = 800,
1679 vid->vl_clkp = CONFIG_SYS_HIGH,
1680 vid->vl_hsp = CONFIG_SYS_LOW,
1681 vid->vl_vsp = CONFIG_SYS_LOW,
1682 vid->vl_dp = CONFIG_SYS_HIGH,
1698 vid->vl_width = 1024,
1699 vid->vl_height = 600,
1700 vid->vl_clkp = CONFIG_SYS_HIGH,
1701 vid->vl_hsp = CONFIG_SYS_HIGH,
1702 vid->vl_vsp = CONFIG_SYS_HIGH,
1703 vid->vl_dp = CONFIG_SYS_LOW,
1706 /* AMS701KA AMOLED Panel. */
1718 static void setup_meminfo(void)
1720 char meminfo[64] = {0, };
1721 int count = 0, size, real;
1723 size = gd->bd->bi_dram[0].size >> 20;
1724 count += sprintf(meminfo + count, "mem=%dM", size);
1726 /* Each Chip Select can't exceed the 256MiB */
1727 size = gd->bd->bi_dram[1].size >> 20;
1728 real = min(size, 256);
1729 count += sprintf(meminfo + count, " mem=%dM@0x%x",
1730 real, (unsigned int)gd->bd->bi_dram[1].start);
1734 count += sprintf(meminfo + count, " mem=%dM@0x%x", size,
1735 (unsigned int)gd->bd->bi_dram[1].start + (real << 20));
1738 setenv("meminfo", meminfo);
1741 int misc_init_r(void)
1744 /* It should be located at first */
1747 if (board_is_limo_real() ||
1748 board_is_limo_universal() ||
1750 setenv("lcdinfo", "lcd=s6e63m0");
1751 /* it can't classify tl2796 with single-lcd and dual-lcd.
1753 setenv("lcdinfo", "lcd=tl2796-dual");
1757 * env values below should be added in case that lcd panel of geminus,
1758 * p1 and p2 are enabled at u-boot.
1759 * setenv means that lcd panel has been turned on at u-boot.
1761 if (machine_is_geminus())
1762 setenv("lcdinfo", "lcd=lms480jc01");
1765 if (board_is_p2_real())
1766 setenv("lcdinfo", "lcd=ams701");
1773 /* Set proper PMIC pins */
1776 /* Check auto burning */
1779 /* To power up I2C2 */
1782 /* Enable T-Flash at Limo Real or Limo Universal */
1785 /* Setup Limo Real board GPIOs */
1786 setup_limo_real_gpios();
1788 /* Setup Media board GPIOs */
1789 setup_media_gpios();
1791 /* Setup P1P2 board GPIOS */
1794 /* To usbdown automatically */
1795 if (board_is_p2_real())
1803 #ifdef CONFIG_S5PC1XXFB
1804 display_device_info();
1807 setup_power_down_mode_registers();
1809 /* check mcs5000 3-touch key */
1812 /* check max17040 */
1822 int board_init(void)
1824 gd->bd->bi_arch_number = MACH_TYPE;
1825 gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
1827 /* Check H/W Revision */
1828 check_hw_revision();
1835 unsigned int base, memconfig0, size;
1836 unsigned int memconfig1, sz = 0;
1838 if (cpu_is_s5pc100()) {
1839 /* In mem setup, we swap the bank. So below size is correct */
1840 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
1841 gd->bd->bi_dram[0].size = PHYS_SDRAM_2_SIZE;
1842 gd->bd->bi_dram[1].start = S5PC100_PHYS_SDRAM_2;
1845 /* In S5PC110, we can't swap the DMC0/1 */
1846 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
1847 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
1849 base = S5PC110_DMC1_BASE;
1850 /* DMC configuration */
1851 memconfig0 = readl(base + MEMCONFIG0_OFFSET);
1852 gd->bd->bi_dram[1].start = memconfig0 & 0xFF000000;
1854 size = (memconfig0 >> 16) & 0xFF;
1855 size = ((unsigned char) ~size) + 1;
1858 * (0x07 + 1) * 16 = 128 MiB
1859 * (0x0f + 1) * 16 = 256 MiB
1864 * Aquila Rev0.5 4G3G1G
1865 * Aquila Rev0.7 4G3G1G
1866 * Aquila Rev0.8 4G3G1G
1868 if (machine_is_aquila() &&
1869 (hwrevision(5) || hwrevision(7) || hwrevision(8))) {
1870 memconfig1 = readl(base + MEMCONFIG1_OFFSET);
1872 sz = (memconfig1 >> 16) & 0xFF;
1873 sz = ((unsigned char) ~sz) + 1;
1879 * bi_dram[1].size contains all DMC1 memory size
1881 gd->bd->bi_dram[1].size = (size + sz) << 20;
1886 /* Used for sleep test */
1887 static unsigned char saved_val[4][2];
1888 static unsigned int gpio_CP;
1889 static unsigned int gpio_T_FLASH;
1890 void board_sleep_init(void)
1894 unsigned char val[2];
1895 struct s5pc110_gpio *gpio =
1896 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1898 /* Set wakeup mask register */
1900 value &= ~(1 << 4); /* Keypad */
1901 value &= ~(1 << 3); /* RTC */
1902 value &= ~(1 << 2); /* RTC Alarm */
1903 writel(value, S5PC110_WAKEUP_MASK);
1905 /* Set external wakeup mask register */
1907 value &= ~(1 << 18); /* T-Flash */
1908 writel(value, S5PC110_EINT_WAKEUP_MASK);
1910 i2c_set_bus_num(I2C_PMIC);
1912 if (i2c_probe(addr)) {
1913 printf("Can't find max8998\n");
1918 gpio_CP = gpio_get_value(&gpio->gpio_h3, 7);
1919 gpio_set_value(&gpio->gpio_h3, 7, 0);
1920 value = gpio_get_value(&gpio->gpio_h3, 7);
1921 /* MMC T_FLASH off */
1922 gpio_T_FLASH = gpio_get_value(&gpio->gpio_mp0_5, 4);
1923 gpio_set_value(&gpio->gpio_mp0_5, 4, 0);
1924 value = gpio_get_value(&gpio->gpio_mp0_5, 4);
1926 gpio_set_value(&gpio->gpio_j2, 2, 0);
1927 gpio_set_value(&gpio->gpio_mp0_4, 7, 0);
1928 gpio_set_value(&gpio->gpio_j2, 3, 0); /* MHL_ON for REV02 or higher */
1931 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1932 saved_val[0][0] = val[0];
1933 saved_val[0][1] = val[1];
1934 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) |
1935 (1 << 1) | (1 << 0));
1936 i2c_write(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1937 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1939 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1940 saved_val[1][0] = val[0];
1941 saved_val[1][1] = val[1];
1942 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 3) |
1943 (1 << 2) | (1 << 1) | (1 << 0));
1945 i2c_write(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1946 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1948 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1949 saved_val[2][0] = val[0];
1950 saved_val[2][1] = val[1];
1951 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4));
1952 i2c_write(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1953 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1955 i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1956 saved_val[3][0] = val[0];
1957 saved_val[3][1] = val[1];
1958 val[0] &= ~((1 << 7) | (1 << 6) | (1 << 4));
1959 i2c_write(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1960 i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1961 printf("Turned off regulators. Preparing to sleep. [%s:%d]\n",
1962 __FILE__, __LINE__);
1965 void board_sleep_resume(void)
1969 unsigned char val[2];
1970 struct s5pc110_gpio *gpio =
1971 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
1975 i2c_set_bus_num(I2C_PMIC);
1977 if (i2c_probe(addr)) {
1978 printf("Can't find max8998\n");
1983 i2c_write(addr, MAX8998_REG_ONOFF1, 1, saved_val[0], 1);
1984 i2c_read(addr, MAX8998_REG_ONOFF1, 1, val, 1);
1986 i2c_write(addr, MAX8998_REG_ONOFF2, 1, saved_val[1], 1);
1987 i2c_read(addr, MAX8998_REG_ONOFF2, 1, val, 1);
1989 i2c_write(addr, MAX8998_REG_ONOFF3, 1, saved_val[2], 1);
1990 i2c_read(addr, MAX8998_REG_ONOFF3, 1, val, 1);
1992 i2c_write(addr, MAX8998_REG_ONOFF3+1, 1, saved_val[3], 1);
1993 i2c_read(addr, MAX8998_REG_ONOFF3+1, 1, val, 1);
1994 printf("Waked up.\n");
1997 gpio_set_value(&gpio->gpio_h3, 7, gpio_CP);
1998 value = gpio_get_value(&gpio->gpio_h3, 7);
2000 gpio_set_value(&gpio->gpio_mp0_5, 4, gpio_T_FLASH);
2001 value = gpio_get_value(&gpio->gpio_mp0_5, 4);
2003 /* check max17040 */
2010 #ifdef CONFIG_CMD_USBDOWN
2011 int usb_board_init(void)
2013 #ifdef CONFIG_CMD_PMIC
2014 run_command("pmic ldo 3 on", 0);
2017 if (cpu_is_s5pc100()) {
2018 #ifdef CONFIG_HARD_I2C
2019 uchar val[2] = {0,};
2022 if (i2c_read(0x66, 0, 1, val, 2)) {
2023 printf("i2c_read error\n");
2030 if (i2c_write(0x66, 0, 1, val, 2)) {
2031 printf("i2c_write error\n");
2034 i2c_read(0x66, 0, 1, val, 2);
2040 if (board_is_limo_universal() ||
2041 board_is_limo_real() ||
2043 /* check usb path */
2044 if (board_is_limo_real() && !hwrevision(6))
2048 if (machine_is_tickertape()) {
2049 struct s5pc110_gpio *gpio =
2050 (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
2052 /* USB_SEL: XM0ADDR_0: MP04[0] output mode */
2053 gpio_direction_output(&gpio->gpio_mp0_4, 0, 0);
2060 #ifdef CONFIG_GENERIC_MMC
2061 int board_mmc_init(bd_t *bis)
2065 struct s5pc110_clock *clk = (struct s5pc110_clock *)S5PC1XX_CLOCK_BASE;
2066 struct s5pc110_gpio *gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
2069 /* MMC0 Clock source = SCLKMPLL */
2070 reg = readl(&clk->src4);
2073 writel(reg, &clk->src4);
2075 reg = readl(&clk->div4);
2078 /* set div value near 50MHz */
2079 clock = get_pll_clk(MPLL) / 1000000;
2080 for (i = 0; i < 0xf; i++) {
2081 if ((clock / (i + 1)) <= 50) {
2087 writel(reg, &clk->div4);
2094 * GPG0[3:6] SD_0_DATA[0:3]
2096 for (i = 0; i < 7; i++) {
2097 /* GPG0[0:6] special function 2 */
2098 gpio_cfg_pin(&gpio->gpio_g0, i, 0x2);
2099 /* GPG0[0:6] pull up */
2100 gpio_set_pull(&gpio->gpio_g0, i, GPIO_PULL_UP);
2103 return s5pc1xx_mmc_init(0);
2107 #ifdef CONFIG_CMD_PMIC
2108 static int pmic_status(void)
2110 unsigned char addr, val[2];
2113 i2c_set_bus_num(I2C_PMIC);
2115 if (i2c_probe(addr)) {
2116 printf("Can't found max8998\n");
2121 i2c_read(addr, reg, 1, val, 1);
2122 for (i = 7; i >= 4; i--)
2123 printf("BUCK%d %s\n", 7 - i + 1,
2124 val[0] & (1 << i) ? "on" : "off");
2126 printf("LDO%d %s\n", 5 - i,
2127 val[0] & (1 << i) ? "on" : "off");
2129 i2c_read(addr, reg, 1, val, 1);
2130 for (i = 7; i >= 0; i--)
2131 printf("LDO%d %s\n", 7 - i + 6,
2132 val[0] & (1 << i) ? "on" : "off");
2134 i2c_read(addr, reg, 1, val, 1);
2135 for (i = 7; i >= 4; i--)
2136 printf("LDO%d %s\n", 7 - i + 14,
2137 val[0] & (1 << i) ? "on" : "off");
2141 static int pmic_ldo_control(int buck, int ldo, int on)
2143 unsigned char addr, val[2];
2144 unsigned int reg, shift;
2152 } else if (ldo <= 13) {
2155 } else if (ldo <= 17) {
2157 shift = 17 - ldo + 4;
2164 shift = 4 - buck + 4;
2168 i2c_set_bus_num(I2C_PMIC);
2170 if (i2c_probe(addr)) {
2171 printf("Can't found max8998\n");
2175 i2c_read(addr, reg, 1, val, 1);
2177 val[0] |= (1 << shift);
2179 val[0] &= ~(1 << shift);
2180 i2c_write(addr, reg, 1, val, 1);
2181 i2c_read(addr, reg, 1, val, 1);
2182 printf("%s %d value 0x%x, %s\n", buck ? "buck" : "ldo", buck ? : ldo,
2183 val[0], val[0] & (1 << shift) ? "on" : "off");
2188 static int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
2190 int buck = 0, ldo = 0, on = -1;
2194 if (strncmp(argv[1], "status", 6) == 0)
2195 return pmic_status();
2198 if (strncmp(argv[1], "ldo", 3) == 0) {
2199 ldo = simple_strtoul(argv[2], NULL, 10);
2200 if (strncmp(argv[3], "on", 2) == 0)
2202 else if (strncmp(argv[3], "off", 3) == 0)
2206 return pmic_ldo_control(buck, ldo, on);
2208 if (strncmp(argv[1], "buck", 4) == 0) {
2209 buck = simple_strtoul(argv[2], NULL, 10);
2210 if (strncmp(argv[3], "on", 2) == 0)
2212 else if (strncmp(argv[3], "off", 3) == 0)
2216 return pmic_ldo_control(buck, ldo, on);
2228 pmic, CONFIG_SYS_MAXARGS, 1, do_pmic,
2229 "PMIC LDO & BUCK control",
2230 "status - Display PMIC LDO & BUCK status\n"
2231 "pmic ldo num on/off - Turn on/off the LDO\n"
2232 "pmic buck num on/off - Turn on/off the BUCK\n"