int board_mmc_init(bd_t *bis) { int i, err; /* * MMC2 SD card GPIO: * * GPK2[0] SD_2_CLK(2) * GPK2[1] SD_2_CMD(2) * GPK2[2] SD_2_CDn * GPK2[3:6] SD_2_DATA[0:3](2) */ for (i = 0; i < 7; i++) { /* GPK2[0:6] special function 2 */ s5p_gpio_cfg_pin(&gpio2->k2, i, GPIO_FUNC(0x2)); /* GPK2[0:6] drv 4x */ s5p_gpio_set_drv(&gpio2->k2, i, GPIO_DRV_4X); /* GPK2[0:1] pull disable */ if (i == 0 || i == 1) { s5p_gpio_set_pull(&gpio2->k2, i, GPIO_PULL_NONE); continue; } /* GPK2[2:6] pull up */ s5p_gpio_set_pull(&gpio2->k2, i, GPIO_PULL_UP); } err = s5p_mmc_init(2, 4); return err; }
static void board_uart_init(void) { struct exynos4_gpio_part1 *gpio1 = (struct exynos4_gpio_part1 *)samsung_get_base_gpio_part1(); struct exynos4_gpio_part2 *gpio2 = (struct exynos4_gpio_part2 *)samsung_get_base_gpio_part2(); int i; /* * UART2 GPIOs * GPA1CON[0] = UART_2_RXD(2) * GPA1CON[1] = UART_2_TXD(2) * GPA1CON[2] = I2C_3_SDA (3) * GPA1CON[3] = I2C_3_SCL (3) */ for (i = 0; i < 4; i++) { s5p_gpio_set_pull(&gpio1->a1, i, GPIO_PULL_NONE); s5p_gpio_cfg_pin(&gpio1->a1, i, GPIO_FUNC((i > 1) ? 0x3 : 0x2)); } /* UART_SEL GPY4[7] (part2) at EXYNOS4 */ s5p_gpio_set_pull(&gpio2->y4, 7, GPIO_PULL_UP); s5p_gpio_direction_output(&gpio2->y4, 7, 1); }
int board_mmc_init(bd_t *bis) { int i, ret, ret_sd = 0; /* MASSMEMORY_EN: XMSMDATA7: GPJ2[7] output high */ s5p_gpio_direction_output(&s5pc110_gpio->j2, 7, 1); /* * MMC0 GPIO * GPG0[0] SD_0_CLK * GPG0[1] SD_0_CMD * GPG0[2] SD_0_CDn -> Not used * GPG0[3:6] SD_0_DATA[0:3] */ for (i = 0; i < 7; i++) { if (i == 2) continue; /* GPG0[0:6] special function 2 */ s5p_gpio_cfg_pin(&s5pc110_gpio->g0, i, 0x2); /* GPG0[0:6] pull disable */ s5p_gpio_set_pull(&s5pc110_gpio->g0, i, GPIO_PULL_NONE); /* GPG0[0:6] drv 4x */ s5p_gpio_set_drv(&s5pc110_gpio->g0, i, GPIO_DRV_4X); } ret = s5p_mmc_init(0, 4); if (ret) error("MMC: Failed to init MMC:0.\n"); /* * SD card (T_FLASH) detect and init * T_FLASH_DETECT: EINT28: GPH3[4] input mode */ s5p_gpio_cfg_pin(&s5pc110_gpio->h3, 4, GPIO_INPUT); s5p_gpio_set_pull(&s5pc110_gpio->h3, 4, GPIO_PULL_UP); if (!s5p_gpio_get_value(&s5pc110_gpio->h3, 4)) { for (i = 0; i < 7; i++) { if (i == 2) continue; /* GPG2[0:6] special function 2 */ s5p_gpio_cfg_pin(&s5pc110_gpio->g2, i, 0x2); /* GPG2[0:6] pull disable */ s5p_gpio_set_pull(&s5pc110_gpio->g2, i, GPIO_PULL_NONE); /* GPG2[0:6] drv 4x */ s5p_gpio_set_drv(&s5pc110_gpio->g2, i, GPIO_DRV_4X); } ret_sd = s5p_mmc_init(2, 4); if (ret_sd) error("MMC: Failed to init SD card (MMC:2).\n"); } return ret & ret_sd; }
static int exynos5_mmc_config(int peripheral, int flags) { struct exynos5_gpio_part1 *gpio1 = (struct exynos5_gpio_part1 *) samsung_get_base_gpio_part1(); struct s5p_gpio_bank *bank, *bank_ext; int i, start = 0, gpio_func = 0; switch (peripheral) { case PERIPH_ID_SDMMC0: bank = &gpio1->c0; bank_ext = &gpio1->c1; start = 0; gpio_func = GPIO_FUNC(0x2); break; case PERIPH_ID_SDMMC1: bank = &gpio1->c2; bank_ext = NULL; break; case PERIPH_ID_SDMMC2: bank = &gpio1->c3; bank_ext = &gpio1->c4; start = 3; gpio_func = GPIO_FUNC(0x3); break; case PERIPH_ID_SDMMC3: bank = &gpio1->c4; bank_ext = NULL; break; } if ((flags & PINMUX_FLAG_8BIT_MODE) && !bank_ext) { debug("SDMMC device %d does not support 8bit mode", peripheral); return -1; } if (flags & PINMUX_FLAG_8BIT_MODE) { for (i = start; i <= (start + 3); i++) { s5p_gpio_cfg_pin(bank_ext, i, gpio_func); s5p_gpio_set_pull(bank_ext, i, GPIO_PULL_UP); s5p_gpio_set_drv(bank_ext, i, GPIO_DRV_4X); } } for (i = 0; i < 2; i++) { s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2)); s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE); s5p_gpio_set_drv(bank, i, GPIO_DRV_4X); } for (i = 3; i <= 6; i++) { s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2)); s5p_gpio_set_pull(bank, i, GPIO_PULL_UP); s5p_gpio_set_drv(bank, i, GPIO_DRV_4X); } return 0; }
/* Set Initial global variables */ s5pc110_gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE; //smc9115_pre_init(); pwm_pre_init(); gd->bd->bi_arch_number = MACH_TYPE_SMDKC100; gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; return 0; } int dram_init(void) { gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE); return 0; } void dram_init_banksize(void) { gd->bd->bi_dram[0].start = PHYS_SDRAM_1; gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; } #ifdef CONFIG_DISPLAY_BOARDINFO int checkboard(void) { printf("\nBoard: FriendlyARM-TINY210\n"); return 0; } #endif int board_eth_init(bd_t *bis) { int rc = 0; #ifdef CONFIG_SMC911X rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); #endif return rc; } ulong virt_to_phy_smdkc110(ulong addr) { if ((0xc0000000 <= addr) && (addr < 0xd0000000)) return (addr - 0xc0000000 + 0x20000000); else printf("The input address don't need "\ "a virtual-to-physical translation : %08lx\n", addr); return addr; } #ifdef CONFIG_GENERIC_MMC #define MOUTMMC (50000000) /* 50MHz */ int board_mmc_init(bd_t *bis) { int i; struct s5pc110_clock *clk = (struct s5pc110_clock *)samsung_get_base_clock(); unsigned long clk_src, clk_div, mpll, div; /* * MMC0 GPIO * GPG0[0] SD_0_CLK * GPG0[1] SD_0_CMD * GPG0[2] SD_0_CDn -> Not used * GPG0[3:6] SD_0_DATA[0:3] * * MMC1 GPIO * GPG1[0] SD_1_CLK * GPG1[1] SD_1_CMD * GPG1[2] SD_1_CDn -> Not used * GPG1[3:6] SD_1_DATA[0:3] */ for (i = 0; i < 7; i++) { if (i == 2) continue; /* GPG0[0:6] special function 2 */ s5p_gpio_cfg_pin(&s5pc110_gpio->g0, i, 0x2); /* GPG0[0:6] pull disable */ s5p_gpio_set_pull(&s5pc110_gpio->g0, i, GPIO_PULL_NONE); /* GPG0[0:6] drv 4x */ s5p_gpio_set_drv(&s5pc110_gpio->g0, i, GPIO_DRV_4X); /* GPG1[0:6] special function 2 */ s5p_gpio_cfg_pin(&s5pc110_gpio->g1, i, 0x2); /* GPG1[0:6] pull disable */ s5p_gpio_set_pull(&s5pc110_gpio->g1, i, GPIO_PULL_NONE); /* GPG1[0:6] drv 4x */ s5p_gpio_set_drv(&s5pc110_gpio->g1, i, GPIO_DRV_4X); } clk_src = readl(&clk->res9[0]); /* CLK_SRC4 */ clk_src &= ~((0xf << 4) | 0xf); clk_src |= (0x6 << 4) | 0x6; /* Set MMC0/1_SEL to SCLK_MPLL */ mpll = get_pll_clk(MPLL); div = ((mpll + MOUTMMC) / MOUTMMC) - 1; clk_div = readl(&clk->div4); clk_div &= ~((0xf << 4) | 0xf); clk_div |= (div << 4) | div; writel(clk_src, &clk->res9[0]); writel(clk_div, &clk->div4); return (s5p_mmc_init(0, 4) || s5p_mmc_init(1, 4)); }
int board_mmc_init(bd_t *bis) { int i; /* MASSMEMORY_EN: XMSMDATA7: GPJ2[7] output high */ s5p_gpio_direction_output(&s5pc110_gpio->j2, 7, 1); /* * MMC0 GPIO * GPG0[0] SD_0_CLK * GPG0[1] SD_0_CMD * GPG0[2] SD_0_CDn -> Not used * GPG0[3:6] SD_0_DATA[0:3] */ for (i = 0; i < 7; i++) { if (i == 2) continue; /* GPG0[0:6] special function 2 */ s5p_gpio_cfg_pin(&s5pc110_gpio->g0, i, 0x2); /* GPG0[0:6] pull disable */ s5p_gpio_set_pull(&s5pc110_gpio->g0, i, GPIO_PULL_NONE); /* GPG0[0:6] drv 4x */ s5p_gpio_set_drv(&s5pc110_gpio->g0, i, GPIO_DRV_4X); } return s5p_mmc_init(0, 4); }
static void exynos4_uart_config(int peripheral) { struct exynos4_gpio_part1 *gpio1 = (struct exynos4_gpio_part1 *) samsung_get_base_gpio_part1(); struct s5p_gpio_bank *bank; int i, start, count; switch (peripheral) { case PERIPH_ID_UART0: bank = &gpio1->a0; start = 0; count = 4; break; case PERIPH_ID_UART1: bank = &gpio1->a0; start = 4; count = 4; break; case PERIPH_ID_UART2: bank = &gpio1->a1; start = 0; count = 4; break; case PERIPH_ID_UART3: bank = &gpio1->a1; start = 4; count = 2; break; } for (i = start; i < start + count; i++) { s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE); s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2)); } }
static void check_hw_revision(void) { int modelrev = 0; int i; gpio2 = (struct exynos4x12_gpio_part2 *)samsung_get_base_gpio_part2(); /* * GPM1[1:0]: MODEL_REV[1:0] * Don't set as pull-none for these N/C pin. * TRM say that it may cause unexcepted state and leakage current. * and pull-none is only for output function. */ for (i = 0; i < 2; i++) s5p_gpio_cfg_pin(&gpio2->m1, i, GPIO_INPUT); /* GPM1[5:2]: HW_REV[3:0] */ for (i = 2; i < 6; i++) { s5p_gpio_cfg_pin(&gpio2->m1, i, GPIO_INPUT); s5p_gpio_set_pull(&gpio2->m1, i, GPIO_PULL_NONE); } /* GPM1[1:0]: MODEL_REV[1:0] */ for (i = 0; i < 2; i++) modelrev |= (s5p_gpio_get_value(&gpio2->m1, i) << i); /* board_rev[15:8] = model */ board_rev = modelrev << 8; }
static void pmic_reset(void) { struct exynos4_gpio_part2 *gpio = (struct exynos4_gpio_part2 *)samsung_get_base_gpio_part2(); s5p_gpio_direction_output(&gpio->x0, 7, 1); s5p_gpio_set_pull(&gpio->x2, 7, GPIO_PULL_NONE); }
static void board_enable_audio_codec(void) { struct exynos5_gpio_part1 *gpio1 = (struct exynos5_gpio_part1 *) samsung_get_base_gpio_part1(); /* Enable MAX98095 Codec */ s5p_gpio_direction_output(&gpio1->x1, 7, 1); s5p_gpio_set_pull(&gpio1->x1, 7, GPIO_PULL_NONE); }
int board_mmc_init(bd_t *bis) { int err; switch (get_hwrev()) { case 0: /* * Set the low to enable LDO_EN * But when you use the test board for eMMC booting * you should set it HIGH since it removes the inverter */ /* MASSMEMORY_EN: XMDMDATA_6: GPE3[6] */ s5p_gpio_direction_output(&gpio1->e3, 6, 0); break; default: /* * Default reset state is High and there's no inverter * But set it as HIGH to ensure */ /* MASSMEMORY_EN: XMDMADDR_3: GPE1[3] */ s5p_gpio_direction_output(&gpio1->e1, 3, 1); break; } /* * MMC device init * mmc0 : eMMC (8-bit buswidth) * mmc2 : SD card (4-bit buswidth) */ err = exynos_pinmux_config(PERIPH_ID_SDMMC0, PINMUX_FLAG_8BIT_MODE); if (err) debug("SDMMC0 not configured\n"); else err = s5p_mmc_init(0, 8); /* T-flash detect */ s5p_gpio_cfg_pin(&gpio2->x3, 4, 0xf); s5p_gpio_set_pull(&gpio2->x3, 4, GPIO_PULL_UP); /* * Check the T-flash detect pin * GPX3[4] T-flash detect pin */ if (!s5p_gpio_get_value(&gpio2->x3, 4)) { err = exynos_pinmux_config(PERIPH_ID_SDMMC2, PINMUX_FLAG_NONE); if (err) debug("SDMMC2 not configured\n"); else err = s5p_mmc_init(2, 4); } return err; }
int board_mmc_init(bd_t *bis) { struct exynos4_gpio_part2 *gpio = (struct exynos4_gpio_part2 *)samsung_get_base_gpio_part2(); int err; /* eMMC_EN: SD_0_CDn: GPK0[2] Output High */ s5p_gpio_direction_output(&gpio->k0, 2, 1); s5p_gpio_set_pull(&gpio->k0, 2, GPIO_PULL_NONE); /* * MMC device init * mmc0 : eMMC (8-bit buswidth) * mmc2 : SD card (4-bit buswidth) */ err = exynos_pinmux_config(PERIPH_ID_SDMMC0, PINMUX_FLAG_8BIT_MODE); if (err) debug("SDMMC0 not configured\n"); else err = s5p_mmc_init(0, 8); /* T-flash detect */ s5p_gpio_cfg_pin(&gpio->x3, 4, 0xf); s5p_gpio_set_pull(&gpio->x3, 4, GPIO_PULL_UP); /* * Check the T-flash detect pin * GPX3[4] T-flash detect pin */ if (!s5p_gpio_get_value(&gpio->x3, 4)) { err = exynos_pinmux_config(PERIPH_ID_SDMMC2, PINMUX_FLAG_NONE); if (err) debug("SDMMC2 not configured\n"); else err = s5p_mmc_init(2, 4); } return err; }
void exynos_cfg_lcd_gpio(void) { unsigned int i, f3_end = 4; for (i = 0; i < 8; i++) { /* set GPF0,1,2[0:7] for RGB Interface and Data lines (32bit) */ s5p_gpio_cfg_pin(&gpio1->f0, i, GPIO_FUNC(2)); s5p_gpio_cfg_pin(&gpio1->f1, i, GPIO_FUNC(2)); s5p_gpio_cfg_pin(&gpio1->f2, i, GPIO_FUNC(2)); /* pull-up/down disable */ s5p_gpio_set_pull(&gpio1->f0, i, GPIO_PULL_NONE); s5p_gpio_set_pull(&gpio1->f1, i, GPIO_PULL_NONE); s5p_gpio_set_pull(&gpio1->f2, i, GPIO_PULL_NONE); /* drive strength to max (24bit) */ s5p_gpio_set_drv(&gpio1->f0, i, GPIO_DRV_4X); s5p_gpio_set_rate(&gpio1->f0, i, GPIO_DRV_SLOW); s5p_gpio_set_drv(&gpio1->f1, i, GPIO_DRV_4X); s5p_gpio_set_rate(&gpio1->f1, i, GPIO_DRV_SLOW); s5p_gpio_set_drv(&gpio1->f2, i, GPIO_DRV_4X); s5p_gpio_set_rate(&gpio1->f0, i, GPIO_DRV_SLOW); } for (i = 0; i < f3_end; i++) { /* set GPF3[0:3] for RGB Interface and Data lines (32bit) */ s5p_gpio_cfg_pin(&gpio1->f3, i, GPIO_FUNC(2)); /* pull-up/down disable */ s5p_gpio_set_pull(&gpio1->f3, i, GPIO_PULL_NONE); /* drive strength to max (24bit) */ s5p_gpio_set_drv(&gpio1->f3, i, GPIO_DRV_4X); s5p_gpio_set_rate(&gpio1->f3, i, GPIO_DRV_SLOW); } /* gpio pad configuration for LCD reset. */ s5p_gpio_cfg_pin(&gpio2->y4, 5, GPIO_OUTPUT); spi_init(); }
void exynos_lcd_power_on(void) { struct pmic *p = pmic_get("MAX77686_PMIC"); gpio1 = (struct exynos4x12_gpio_part1 *)samsung_get_base_gpio_part1(); /* LCD_2.2V_EN: GPC0[1] */ s5p_gpio_set_pull(&gpio1->c0, 1, GPIO_PULL_UP); s5p_gpio_direction_output(&gpio1->c0, 1, 1); /* LDO25 VCC_3.1V_LCD */ pmic_probe(p); max77686_set_ldo_voltage(p, 25, 3100000); max77686_set_ldo_mode(p, 25, OPMODE_LPM); }
static unsigned int get_hw_revision(void) { struct exynos4_gpio_part1 *gpio = (struct exynos4_gpio_part1 *)samsung_get_base_gpio_part1(); int hwrev = 0; int i; /* hw_rev[3:0] == GPE1[3:0] */ for (i = 0; i < 4; i++) { s5p_gpio_cfg_pin(&gpio->e1, i, GPIO_INPUT); s5p_gpio_set_pull(&gpio->e1, i, GPIO_PULL_NONE); } udelay(1); for (i = 0; i < 4; i++) hwrev |= (s5p_gpio_get_value(&gpio->e1, i) << i); debug("hwrev 0x%x\n", hwrev); return hwrev; }
static void exynos5_sromc_config(int flags) { struct exynos5_gpio_part1 *gpio1 = (struct exynos5_gpio_part1 *) samsung_get_base_gpio_part1(); int i; /* * SROM:CS1 and EBI * * GPY0[0] SROM_CSn[0] * GPY0[1] SROM_CSn[1](2) * GPY0[2] SROM_CSn[2] * GPY0[3] SROM_CSn[3] * GPY0[4] EBI_OEn(2) * GPY0[5] EBI_EEn(2) * * GPY1[0] EBI_BEn[0](2) * GPY1[1] EBI_BEn[1](2) * GPY1[2] SROM_WAIT(2) * GPY1[3] EBI_DATA_RDn(2) */ s5p_gpio_cfg_pin(&gpio1->y0, (flags & PINMUX_FLAG_BANK), GPIO_FUNC(2)); s5p_gpio_cfg_pin(&gpio1->y0, 4, GPIO_FUNC(2)); s5p_gpio_cfg_pin(&gpio1->y0, 5, GPIO_FUNC(2)); for (i = 0; i < 4; i++) s5p_gpio_cfg_pin(&gpio1->y1, i, GPIO_FUNC(2)); /* * EBI: 8 Addrss Lines * * GPY3[0] EBI_ADDR[0](2) * GPY3[1] EBI_ADDR[1](2) * GPY3[2] EBI_ADDR[2](2) * GPY3[3] EBI_ADDR[3](2) * GPY3[4] EBI_ADDR[4](2) * GPY3[5] EBI_ADDR[5](2) * GPY3[6] EBI_ADDR[6](2) * GPY3[7] EBI_ADDR[7](2) * * EBI: 16 Data Lines * * GPY5[0] EBI_DATA[0](2) * GPY5[1] EBI_DATA[1](2) * GPY5[2] EBI_DATA[2](2) * GPY5[3] EBI_DATA[3](2) * GPY5[4] EBI_DATA[4](2) * GPY5[5] EBI_DATA[5](2) * GPY5[6] EBI_DATA[6](2) * GPY5[7] EBI_DATA[7](2) * * GPY6[0] EBI_DATA[8](2) * GPY6[1] EBI_DATA[9](2) * GPY6[2] EBI_DATA[10](2) * GPY6[3] EBI_DATA[11](2) * GPY6[4] EBI_DATA[12](2) * GPY6[5] EBI_DATA[13](2) * GPY6[6] EBI_DATA[14](2) * GPY6[7] EBI_DATA[15](2) */ for (i = 0; i < 8; i++) { s5p_gpio_cfg_pin(&gpio1->y3, i, GPIO_FUNC(2)); s5p_gpio_set_pull(&gpio1->y3, i, GPIO_PULL_UP); s5p_gpio_cfg_pin(&gpio1->y5, i, GPIO_FUNC(2)); s5p_gpio_set_pull(&gpio1->y5, i, GPIO_PULL_UP); s5p_gpio_cfg_pin(&gpio1->y6, i, GPIO_FUNC(2)); s5p_gpio_set_pull(&gpio1->y6, i, GPIO_PULL_UP); } }
/* * There is no common GPIO API for pull, drv, pin, rate (yet). These * functions are kept here to preserve function ordering for review. */ void gpio_set_pull(int gpio, int mode) { s5p_gpio_set_pull(s5p_gpio_get_bank(gpio), s5p_gpio_get_pin(gpio), mode); }
int board_mmc_init(bd_t *bis) { int i, err; switch (get_hwrev()) { case 0: /* * Set the low to enable LDO_EN * But when you use the test board for eMMC booting * you should set it HIGH since it removes the inverter */ /* MASSMEMORY_EN: XMDMDATA_6: GPE3[6] */ s5p_gpio_direction_output(&gpio1->e3, 6, 0); break; default: /* * Default reset state is High and there's no inverter * But set it as HIGH to ensure */ /* MASSMEMORY_EN: XMDMADDR_3: GPE1[3] */ s5p_gpio_direction_output(&gpio1->e1, 3, 1); break; } /* * eMMC GPIO: * SDR 8-bit@48MHz at MMC0 * GPK0[0] SD_0_CLK(2) * GPK0[1] SD_0_CMD(2) * GPK0[2] SD_0_CDn -> Not used * GPK0[3:6] SD_0_DATA[0:3](2) * GPK1[3:6] SD_0_DATA[0:3](3) * * DDR 4-bit@26MHz at MMC4 * GPK0[0] SD_4_CLK(3) * GPK0[1] SD_4_CMD(3) * GPK0[2] SD_4_CDn -> Not used * GPK0[3:6] SD_4_DATA[0:3](3) * GPK1[3:6] SD_4_DATA[4:7](4) */ for (i = 0; i < 7; i++) { if (i == 2) continue; /* GPK0[0:6] special function 2 */ s5p_gpio_cfg_pin(&gpio2->k0, i, 0x2); /* GPK0[0:6] pull disable */ s5p_gpio_set_pull(&gpio2->k0, i, GPIO_PULL_NONE); /* GPK0[0:6] drv 4x */ s5p_gpio_set_drv(&gpio2->k0, i, GPIO_DRV_4X); } for (i = 3; i < 7; i++) { /* GPK1[3:6] special function 3 */ s5p_gpio_cfg_pin(&gpio2->k1, i, 0x3); /* GPK1[3:6] pull disable */ s5p_gpio_set_pull(&gpio2->k1, i, GPIO_PULL_NONE); /* GPK1[3:6] drv 4x */ s5p_gpio_set_drv(&gpio2->k1, i, GPIO_DRV_4X); } /* T-flash detect */ s5p_gpio_cfg_pin(&gpio2->x3, 4, 0xf); s5p_gpio_set_pull(&gpio2->x3, 4, GPIO_PULL_UP); /* * MMC device init * mmc0 : eMMC (8-bit buswidth) * mmc2 : SD card (4-bit buswidth) */ err = s5p_mmc_init(0, 8); /* * Check the T-flash detect pin * GPX3[4] T-flash detect pin */ if (!s5p_gpio_get_value(&gpio2->x3, 4)) { /* * SD card GPIO: * GPK2[0] SD_2_CLK(2) * GPK2[1] SD_2_CMD(2) * GPK2[2] SD_2_CDn -> Not used * GPK2[3:6] SD_2_DATA[0:3](2) */ for (i = 0; i < 7; i++) { if (i == 2) continue; /* GPK2[0:6] special function 2 */ s5p_gpio_cfg_pin(&gpio2->k2, i, 0x2); /* GPK2[0:6] pull disable */ s5p_gpio_set_pull(&gpio2->k2, i, GPIO_PULL_NONE); /* GPK2[0:6] drv 4x */ s5p_gpio_set_drv(&gpio2->k2, i, GPIO_DRV_4X); } err = s5p_mmc_init(2, 4); } return err; }
static void board_external_gpio_init(void) { gpio2 = (struct exynos4x12_gpio_part2 *)samsung_get_base_gpio_part2(); /* * some pins which in alive block are connected with external pull-up * but it's default setting is pull-down. * if that pin set as input then that floated */ s5p_gpio_set_pull(&gpio2->x0, 2, GPIO_PULL_NONE); /* PS_ALS_INT */ s5p_gpio_set_pull(&gpio2->x0, 4, GPIO_PULL_NONE); /* TSP_nINT */ s5p_gpio_set_pull(&gpio2->x0, 7, GPIO_PULL_NONE); /* AP_PMIC_IRQ*/ s5p_gpio_set_pull(&gpio2->x1, 5, GPIO_PULL_NONE); /* IF_PMIC_IRQ*/ s5p_gpio_set_pull(&gpio2->x2, 0, GPIO_PULL_NONE); /* VOL_UP */ s5p_gpio_set_pull(&gpio2->x2, 1, GPIO_PULL_NONE); /* VOL_DOWN */ s5p_gpio_set_pull(&gpio2->x2, 3, GPIO_PULL_NONE); /* FUEL_ALERT */ s5p_gpio_set_pull(&gpio2->x2, 4, GPIO_PULL_NONE); /* ADC_INT */ s5p_gpio_set_pull(&gpio2->x2, 7, GPIO_PULL_NONE); /* nPOWER */ s5p_gpio_set_pull(&gpio2->x3, 0, GPIO_PULL_NONE); /* WPC_INT */ s5p_gpio_set_pull(&gpio2->x3, 5, GPIO_PULL_NONE); /* OK_KEY */ s5p_gpio_set_pull(&gpio2->x3, 7, GPIO_PULL_NONE); /* HDMI_HPD */ }