1 /* 2 * (C) Copyright 2004-2008 3 * Texas Instruments, <www.ti.com> 4 * 5 * Author : 6 * Sunil Kumar <sunilsaini05@gmail.com> 7 * Shashi Ranjan <shashiranjanmca05@gmail.com> 8 * 9 * Derived from Beagle Board and 3430 SDP code by 10 * Richard Woodruff <r-woodruff2@ti.com> 11 * Syed Mohammed Khasim <khasim@ti.com> 12 * 13 * 14 * See file CREDITS for list of people who contributed to this 15 * project. 16 * 17 * This program is free software; you can redistribute it and/or 18 * modify it under the terms of the GNU General Public License as 19 * published by the Free Software Foundation; either version 2 of 20 * the License, or (at your option) any later version. 21 * 22 * This program is distributed in the hope that it will be useful, 23 * but WITHOUT ANY WARRANTY; without even the implied warranty of 24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25 * GNU General Public License for more details. 26 * 27 * You should have received a copy of the GNU General Public License 28 * along with this program; if not, write to the Free Software 29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 30 * MA 02111-1307 USA 31 */ 32 #include <common.h> 33 #ifdef CONFIG_STATUS_LED 34 #include <status_led.h> 35 #endif 36 #include <twl4030.h> 37 #include <asm/io.h> 38 #include <asm/arch/mmc_host_def.h> 39 #include <asm/arch/mux.h> 40 #include <asm/arch/sys_proto.h> 41 #include <asm/arch/gpio.h> 42 #include <asm/mach-types.h> 43 #include "beagle.h" 44 45 #define TWL4030_I2C_BUS 0 46 #define EXPANSION_EEPROM_I2C_BUS 1 47 #define EXPANSION_EEPROM_I2C_ADDRESS 0x50 48 49 #define TINCANTOOLS_ZIPPY 0x01000100 50 #define TINCANTOOLS_ZIPPY2 0x02000100 51 #define TINCANTOOLS_TRAINER 0x04000100 52 #define TINCANTOOLS_SHOWDOG 0x03000100 53 #define KBADC_BEAGLEFPGA 0x01000600 54 55 #define BEAGLE_NO_EEPROM 0xffffffff 56 57 DECLARE_GLOBAL_DATA_PTR; 58 59 static struct { 60 unsigned int device_vendor; 61 unsigned char revision; 62 unsigned char content; 63 char fab_revision[8]; 64 char env_var[16]; 65 char env_setting[64]; 66 } expansion_config; 67 68 /* 69 * Routine: board_init 70 * Description: Early hardware init. 71 */ 72 int board_init(void) 73 { 74 gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 75 /* board id for Linux */ 76 gd->bd->bi_arch_number = MACH_TYPE_OMAP3_BEAGLE; 77 /* boot param addr */ 78 gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 79 80 #if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT) 81 status_led_set (STATUS_LED_BOOT, STATUS_LED_ON); 82 #endif 83 84 return 0; 85 } 86 87 /* 88 * Routine: get_board_revision 89 * Description: Detect if we are running on a Beagle revision Ax/Bx, 90 * C1/2/3, C4 or xM. This can be done by reading 91 * the level of GPIO173, GPIO172 and GPIO171. This should 92 * result in 93 * GPIO173, GPIO172, GPIO171: 1 1 1 => Ax/Bx 94 * GPIO173, GPIO172, GPIO171: 1 1 0 => C1/2/3 95 * GPIO173, GPIO172, GPIO171: 1 0 1 => C4 96 * GPIO173, GPIO172, GPIO171: 0 0 0 => xM 97 */ 98 int get_board_revision(void) 99 { 100 int revision; 101 102 if (!omap_request_gpio(171) && 103 !omap_request_gpio(172) && 104 !omap_request_gpio(173)) { 105 106 omap_set_gpio_direction(171, 1); 107 omap_set_gpio_direction(172, 1); 108 omap_set_gpio_direction(173, 1); 109 110 revision = omap_get_gpio_datain(173) << 2 | 111 omap_get_gpio_datain(172) << 1 | 112 omap_get_gpio_datain(171); 113 114 omap_free_gpio(171); 115 omap_free_gpio(172); 116 omap_free_gpio(173); 117 } else { 118 printf("Error: unable to acquire board revision GPIOs\n"); 119 revision = -1; 120 } 121 122 return revision; 123 } 124 125 /* 126 * Routine: get_expansion_id 127 * Description: This function checks for expansion board by checking I2C 128 * bus 1 for the availability of an AT24C01B serial EEPROM. 129 * returns the device_vendor field from the EEPROM 130 */ 131 unsigned int get_expansion_id(void) 132 { 133 i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS); 134 135 /* return BEAGLE_NO_EEPROM if eeprom doesn't respond */ 136 if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) { 137 i2c_set_bus_num(TWL4030_I2C_BUS); 138 return BEAGLE_NO_EEPROM; 139 } 140 141 /* read configuration data */ 142 i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config, 143 sizeof(expansion_config)); 144 145 i2c_set_bus_num(TWL4030_I2C_BUS); 146 147 return expansion_config.device_vendor; 148 } 149 150 /* 151 * Routine: misc_init_r 152 * Description: Configure board specific parts 153 */ 154 int misc_init_r(void) 155 { 156 struct gpio *gpio5_base = (struct gpio *)OMAP34XX_GPIO5_BASE; 157 struct gpio *gpio6_base = (struct gpio *)OMAP34XX_GPIO6_BASE; 158 159 switch (get_board_revision()) { 160 case REVISION_AXBX: 161 printf("Beagle Rev Ax/Bx\n"); 162 setenv("beaglerev", "AxBx"); 163 setenv("mpurate", "600"); 164 break; 165 case REVISION_CX: 166 printf("Beagle Rev C1/C2/C3\n"); 167 setenv("beaglerev", "Cx"); 168 setenv("mpurate", "600"); 169 MUX_BEAGLE_C(); 170 break; 171 case REVISION_C4: 172 printf("Beagle Rev C4\n"); 173 setenv("beaglerev", "C4"); 174 setenv("mpurate", "720"); 175 MUX_BEAGLE_C(); 176 /* Set VAUX2 to 1.8V for EHCI PHY */ 177 twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED, 178 TWL4030_PM_RECEIVER_VAUX2_VSEL_18, 179 TWL4030_PM_RECEIVER_VAUX2_DEV_GRP, 180 TWL4030_PM_RECEIVER_DEV_GRP_P1); 181 break; 182 case REVISION_XM: 183 printf("Beagle xM Rev A\n"); 184 setenv("beaglerev", "xMA"); 185 setenv("mpurate", "1000"); 186 MUX_BEAGLE_XM(); 187 /* Set VAUX2 to 1.8V for EHCI PHY */ 188 twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED, 189 TWL4030_PM_RECEIVER_VAUX2_VSEL_18, 190 TWL4030_PM_RECEIVER_VAUX2_DEV_GRP, 191 TWL4030_PM_RECEIVER_DEV_GRP_P1); 192 break; 193 default: 194 printf("Beagle unknown 0x%02x\n", get_board_revision()); 195 } 196 197 switch (get_expansion_id()) { 198 case TINCANTOOLS_ZIPPY: 199 printf("Recognized Tincantools Zippy board (rev %d %s)\n", 200 expansion_config.revision, 201 expansion_config.fab_revision); 202 MUX_TINCANTOOLS_ZIPPY(); 203 setenv("buddy", "zippy"); 204 break; 205 case TINCANTOOLS_ZIPPY2: 206 printf("Recognized Tincantools Zippy2 board (rev %d %s)\n", 207 expansion_config.revision, 208 expansion_config.fab_revision); 209 MUX_TINCANTOOLS_ZIPPY(); 210 setenv("buddy", "zippy2"); 211 break; 212 case TINCANTOOLS_TRAINER: 213 printf("Recognized Tincantools Trainer board (rev %d %s)\n", 214 expansion_config.revision, 215 expansion_config.fab_revision); 216 MUX_TINCANTOOLS_ZIPPY(); 217 MUX_TINCANTOOLS_TRAINER(); 218 setenv("buddy", "trainer"); 219 break; 220 case TINCANTOOLS_SHOWDOG: 221 printf("Recognized Tincantools Showdow board (rev %d %s)\n", 222 expansion_config.revision, 223 expansion_config.fab_revision); 224 /* Place holder for DSS2 definition for showdog lcd */ 225 setenv("defaultdisplay", "showdoglcd"); 226 setenv("buddy", "showdog"); 227 break; 228 case KBADC_BEAGLEFPGA: 229 printf("Recognized KBADC Beagle FPGA board\n"); 230 MUX_KBADC_BEAGLEFPGA(); 231 setenv("buddy", "beaglefpga"); 232 break; 233 case BEAGLE_NO_EEPROM: 234 printf("No EEPROM on expansion board\n"); 235 setenv("buddy", "none"); 236 break; 237 default: 238 printf("Unrecognized expansion board: %x\n", 239 expansion_config.device_vendor); 240 setenv("buddy", "unknown"); 241 } 242 243 if (expansion_config.content == 1) 244 setenv(expansion_config.env_var, expansion_config.env_setting); 245 246 twl4030_power_init(); 247 twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); 248 249 /* Configure GPIOs to output */ 250 writel(~(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1), &gpio6_base->oe); 251 writel(~(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 | 252 GPIO15 | GPIO14 | GPIO13 | GPIO12), &gpio5_base->oe); 253 254 /* Set GPIOs */ 255 writel(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1, 256 &gpio6_base->setdataout); 257 writel(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 | 258 GPIO15 | GPIO14 | GPIO13 | GPIO12, &gpio5_base->setdataout); 259 260 dieid_num_r(); 261 262 return 0; 263 } 264 265 /* 266 * Routine: set_muxconf_regs 267 * Description: Setting up the configuration Mux registers specific to the 268 * hardware. Many pins need to be moved from protect to primary 269 * mode. 270 */ 271 void set_muxconf_regs(void) 272 { 273 MUX_BEAGLE(); 274 } 275 276 #ifdef CONFIG_GENERIC_MMC 277 int board_mmc_init(bd_t *bis) 278 { 279 omap_mmc_init(0); 280 return 0; 281 } 282 #endif 283