1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (C) Copyright 2008 4 * Grazvydas Ignotas <notasas@gmail.com> 5 * 6 * Derived from Beagle Board, 3430 SDP, and OMAP3EVM code by 7 * Richard Woodruff <r-woodruff2@ti.com> 8 * Syed Mohammed Khasim <khasim@ti.com> 9 * Sunil Kumar <sunilsaini05@gmail.com> 10 * Shashi Ranjan <shashiranjanmca05@gmail.com> 11 * 12 * (C) Copyright 2004-2008 13 * Texas Instruments, <www.ti.com> 14 */ 15 #include <common.h> 16 #include <dm.h> 17 #include <ns16550.h> 18 #include <twl4030.h> 19 #include <asm/io.h> 20 #include <asm/gpio.h> 21 #include <asm/arch/mmc_host_def.h> 22 #include <asm/arch/mux.h> 23 #include <asm/arch/gpio.h> 24 #include <asm/arch/sys_proto.h> 25 #include <asm/mach-types.h> 26 #include "pandora.h" 27 28 DECLARE_GLOBAL_DATA_PTR; 29 30 #define TWL4030_BB_CFG_BBCHEN (1 << 4) 31 #define TWL4030_BB_CFG_BBSEL_3200MV (3 << 2) 32 #define TWL4030_BB_CFG_BBISEL_500UA 2 33 34 #define CONTROL_WKUP_CTRL 0x48002a5c 35 #define GPIO_IO_PWRDNZ (1 << 6) 36 #define PBIASLITEVMODE1 (1 << 8) 37 38 static const struct ns16550_platdata pandora_serial = { 39 .base = OMAP34XX_UART3, 40 .reg_shift = 2, 41 .clock = V_NS16550_CLK, 42 .fcr = UART_FCR_DEFVAL, 43 }; 44 45 U_BOOT_DEVICE(pandora_uart) = { 46 "ns16550_serial", 47 &pandora_serial 48 }; 49 50 /* 51 * Routine: board_init 52 * Description: Early hardware init. 53 */ 54 int board_init(void) 55 { 56 gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 57 /* board id for Linux */ 58 gd->bd->bi_arch_number = MACH_TYPE_OMAP3_PANDORA; 59 /* boot param addr */ 60 gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 61 62 return 0; 63 } 64 65 static void set_output_gpio(unsigned int gpio, int value) 66 { 67 int ret; 68 69 ret = gpio_request(gpio, ""); 70 if (ret != 0) { 71 printf("could not request GPIO %u\n", gpio); 72 return; 73 } 74 ret = gpio_direction_output(gpio, value); 75 if (ret != 0) 76 printf("could not set GPIO %u to %d\n", gpio, value); 77 } 78 79 /* 80 * Routine: misc_init_r 81 * Description: Configure board specific parts 82 */ 83 int misc_init_r(void) 84 { 85 t2_t *t2_base = (t2_t *)T2_BASE; 86 u32 pbias_lite; 87 88 twl4030_led_init(TWL4030_LED_LEDEN_LEDBON); 89 90 /* set up dual-voltage GPIOs to 1.8V */ 91 pbias_lite = readl(&t2_base->pbias_lite); 92 pbias_lite &= ~PBIASLITEVMODE1; 93 pbias_lite |= PBIASLITEPWRDNZ1; 94 writel(pbias_lite, &t2_base->pbias_lite); 95 if (get_cpu_family() == CPU_OMAP36XX) 96 writel(readl(CONTROL_WKUP_CTRL) | GPIO_IO_PWRDNZ, 97 CONTROL_WKUP_CTRL); 98 99 /* make sure audio and BT chips are in powerdown state */ 100 set_output_gpio(14, 0); 101 set_output_gpio(15, 0); 102 set_output_gpio(118, 0); 103 104 /* enable USB supply */ 105 set_output_gpio(164, 1); 106 107 /* wifi needs a short pulse to enter powersave state */ 108 set_output_gpio(23, 1); 109 udelay(5000); 110 gpio_direction_output(23, 0); 111 112 /* Enable battery backup capacitor (3.2V, 0.5mA charge current) */ 113 twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, 114 TWL4030_PM_RECEIVER_BB_CFG, 115 TWL4030_BB_CFG_BBCHEN | TWL4030_BB_CFG_BBSEL_3200MV | 116 TWL4030_BB_CFG_BBISEL_500UA); 117 118 omap_die_id_display(); 119 120 return 0; 121 } 122 123 /* 124 * Routine: set_muxconf_regs 125 * Description: Setting up the configuration Mux registers specific to the 126 * hardware. Many pins need to be moved from protect to primary 127 * mode. 128 */ 129 void set_muxconf_regs(void) 130 { 131 MUX_PANDORA(); 132 if (get_cpu_family() == CPU_OMAP36XX) { 133 MUX_PANDORA_3730(); 134 } 135 } 136 137 #ifdef CONFIG_MMC 138 int board_mmc_init(bd_t *bis) 139 { 140 return omap_mmc_init(0, 0, 0, -1, -1); 141 } 142 143 void board_mmc_power_init(void) 144 { 145 twl4030_power_mmc_init(0); 146 } 147 #endif 148