10a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 20a0e4badSJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2004-2008 30a0e4badSJean-Christophe PLAGNIOL-VILLARD * Texas Instruments, <www.ti.com> 40a0e4badSJean-Christophe PLAGNIOL-VILLARD * 50a0e4badSJean-Christophe PLAGNIOL-VILLARD * Author : 60a0e4badSJean-Christophe PLAGNIOL-VILLARD * Sunil Kumar <sunilsaini05@gmail.com> 70a0e4badSJean-Christophe PLAGNIOL-VILLARD * Shashi Ranjan <shashiranjanmca05@gmail.com> 80a0e4badSJean-Christophe PLAGNIOL-VILLARD * 90a0e4badSJean-Christophe PLAGNIOL-VILLARD * Derived from Beagle Board and 3430 SDP code by 100a0e4badSJean-Christophe PLAGNIOL-VILLARD * Richard Woodruff <r-woodruff2@ti.com> 110a0e4badSJean-Christophe PLAGNIOL-VILLARD * Syed Mohammed Khasim <khasim@ti.com> 120a0e4badSJean-Christophe PLAGNIOL-VILLARD * 130a0e4badSJean-Christophe PLAGNIOL-VILLARD * 140a0e4badSJean-Christophe PLAGNIOL-VILLARD * See file CREDITS for list of people who contributed to this 150a0e4badSJean-Christophe PLAGNIOL-VILLARD * project. 160a0e4badSJean-Christophe PLAGNIOL-VILLARD * 170a0e4badSJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or 180a0e4badSJean-Christophe PLAGNIOL-VILLARD * modify it under the terms of the GNU General Public License as 190a0e4badSJean-Christophe PLAGNIOL-VILLARD * published by the Free Software Foundation; either version 2 of 200a0e4badSJean-Christophe PLAGNIOL-VILLARD * the License, or (at your option) any later version. 210a0e4badSJean-Christophe PLAGNIOL-VILLARD * 220a0e4badSJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 230a0e4badSJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 240a0e4badSJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 250a0e4badSJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 260a0e4badSJean-Christophe PLAGNIOL-VILLARD * 270a0e4badSJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 280a0e4badSJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 290a0e4badSJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 300a0e4badSJean-Christophe PLAGNIOL-VILLARD * MA 02111-1307 USA 310a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 320a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <common.h> 330a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <twl4030.h> 340a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h> 350a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h> 360a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h> 370a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/gpio.h> 380a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h> 390a0e4badSJean-Christophe PLAGNIOL-VILLARD #include "beagle.h" 400a0e4badSJean-Christophe PLAGNIOL-VILLARD 410a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 420a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: board_init 430a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Early hardware init. 440a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 450a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_init(void) 460a0e4badSJean-Christophe PLAGNIOL-VILLARD { 470a0e4badSJean-Christophe PLAGNIOL-VILLARD DECLARE_GLOBAL_DATA_PTR; 480a0e4badSJean-Christophe PLAGNIOL-VILLARD 490a0e4badSJean-Christophe PLAGNIOL-VILLARD gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 500a0e4badSJean-Christophe PLAGNIOL-VILLARD /* board id for Linux */ 510a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_OMAP3_BEAGLE; 520a0e4badSJean-Christophe PLAGNIOL-VILLARD /* boot param addr */ 530a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 540a0e4badSJean-Christophe PLAGNIOL-VILLARD 550a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 560a0e4badSJean-Christophe PLAGNIOL-VILLARD } 570a0e4badSJean-Christophe PLAGNIOL-VILLARD 580a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 59*06b95bd5SSteve Sakoman * Routine: get_board_revision 60*06b95bd5SSteve Sakoman * Description: Detect if we are running on a Beagle revision Ax/Bx, 61*06b95bd5SSteve Sakoman * C1/2/3, or C4. This can be done by reading 62*06b95bd5SSteve Sakoman * the level of GPIO173, GPIO172 and GPIO171. This should 63*06b95bd5SSteve Sakoman * result in 64*06b95bd5SSteve Sakoman * GPIO173, GPIO172, GPIO171: 1 1 1 => Ax/Bx 65*06b95bd5SSteve Sakoman * GPIO173, GPIO172, GPIO171: 1 1 0 => C1/2/3 66*06b95bd5SSteve Sakoman * GPIO173, GPIO172, GPIO171: 1 0 1 => C4 670a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 68*06b95bd5SSteve Sakoman int get_board_revision(void) 690a0e4badSJean-Christophe PLAGNIOL-VILLARD { 70*06b95bd5SSteve Sakoman int revision; 710a0e4badSJean-Christophe PLAGNIOL-VILLARD 72*06b95bd5SSteve Sakoman if (!omap_request_gpio(171) && 73*06b95bd5SSteve Sakoman !omap_request_gpio(172) && 74*06b95bd5SSteve Sakoman !omap_request_gpio(173)) { 750a0e4badSJean-Christophe PLAGNIOL-VILLARD 760a0e4badSJean-Christophe PLAGNIOL-VILLARD omap_set_gpio_direction(171, 1); 77*06b95bd5SSteve Sakoman omap_set_gpio_direction(172, 1); 78*06b95bd5SSteve Sakoman omap_set_gpio_direction(173, 1); 790a0e4badSJean-Christophe PLAGNIOL-VILLARD 80*06b95bd5SSteve Sakoman revision = omap_get_gpio_datain(173) << 2 | 81*06b95bd5SSteve Sakoman omap_get_gpio_datain(172) << 1 | 82*06b95bd5SSteve Sakoman omap_get_gpio_datain(171); 83*06b95bd5SSteve Sakoman 84*06b95bd5SSteve Sakoman omap_free_gpio(171); 85*06b95bd5SSteve Sakoman omap_free_gpio(172); 86*06b95bd5SSteve Sakoman omap_free_gpio(173); 87*06b95bd5SSteve Sakoman } else { 88*06b95bd5SSteve Sakoman printf("Error: unable to acquire board revision GPIOs\n"); 89*06b95bd5SSteve Sakoman revision = -1; 900a0e4badSJean-Christophe PLAGNIOL-VILLARD } 910a0e4badSJean-Christophe PLAGNIOL-VILLARD 92*06b95bd5SSteve Sakoman return revision; 930a0e4badSJean-Christophe PLAGNIOL-VILLARD } 940a0e4badSJean-Christophe PLAGNIOL-VILLARD 950a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 960a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 970a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Configure board specific parts 980a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 990a0e4badSJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 1000a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1010a0e4badSJean-Christophe PLAGNIOL-VILLARD struct gpio *gpio5_base = (struct gpio *)OMAP34XX_GPIO5_BASE; 1020a0e4badSJean-Christophe PLAGNIOL-VILLARD struct gpio *gpio6_base = (struct gpio *)OMAP34XX_GPIO6_BASE; 1030a0e4badSJean-Christophe PLAGNIOL-VILLARD 104*06b95bd5SSteve Sakoman switch (get_board_revision()) { 105*06b95bd5SSteve Sakoman case REVISION_AXBX: 106*06b95bd5SSteve Sakoman printf("Beagle Rev Ax/Bx\n"); 107*06b95bd5SSteve Sakoman setenv("beaglerev", "AxBx"); 108*06b95bd5SSteve Sakoman setenv("mpurate", "600"); 109*06b95bd5SSteve Sakoman break; 110*06b95bd5SSteve Sakoman case REVISION_CX: 111*06b95bd5SSteve Sakoman printf("Beagle Rev C1/C2/C3\n"); 112*06b95bd5SSteve Sakoman setenv("beaglerev", "Cx"); 113*06b95bd5SSteve Sakoman setenv("mpurate", "600"); 114*06b95bd5SSteve Sakoman MUX_BEAGLE_C(); 115*06b95bd5SSteve Sakoman break; 116*06b95bd5SSteve Sakoman case REVISION_C4: 117*06b95bd5SSteve Sakoman printf("Beagle Rev C4\n"); 118*06b95bd5SSteve Sakoman setenv("beaglerev", "Cx"); 119*06b95bd5SSteve Sakoman setenv("mpurate", "720"); 120*06b95bd5SSteve Sakoman MUX_BEAGLE_C(); 121*06b95bd5SSteve Sakoman /* Set VAUX2 to 1.8V for EHCI PHY */ 122*06b95bd5SSteve Sakoman twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED, 123*06b95bd5SSteve Sakoman TWL4030_PM_RECEIVER_VAUX2_VSEL_18, 124*06b95bd5SSteve Sakoman TWL4030_PM_RECEIVER_VAUX2_DEV_GRP, 125*06b95bd5SSteve Sakoman TWL4030_PM_RECEIVER_DEV_GRP_P1); 126*06b95bd5SSteve Sakoman break; 127*06b95bd5SSteve Sakoman default: 128*06b95bd5SSteve Sakoman printf("Beagle unknown 0x%02x\n", get_board_revision()); 129*06b95bd5SSteve Sakoman } 130*06b95bd5SSteve Sakoman 1310a0e4badSJean-Christophe PLAGNIOL-VILLARD twl4030_power_init(); 132ead39d7aSGrazvydas Ignotas twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); 1330a0e4badSJean-Christophe PLAGNIOL-VILLARD 1340a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Configure GPIOs to output */ 1350a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(~(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1), &gpio6_base->oe); 1360a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(~(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 | 1370a0e4badSJean-Christophe PLAGNIOL-VILLARD GPIO15 | GPIO14 | GPIO13 | GPIO12), &gpio5_base->oe); 1380a0e4badSJean-Christophe PLAGNIOL-VILLARD 1390a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Set GPIOs */ 1400a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1, 1410a0e4badSJean-Christophe PLAGNIOL-VILLARD &gpio6_base->setdataout); 1420a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 | 1430a0e4badSJean-Christophe PLAGNIOL-VILLARD GPIO15 | GPIO14 | GPIO13 | GPIO12, &gpio5_base->setdataout); 1440a0e4badSJean-Christophe PLAGNIOL-VILLARD 1450a0e4badSJean-Christophe PLAGNIOL-VILLARD dieid_num_r(); 1460a0e4badSJean-Christophe PLAGNIOL-VILLARD 1470a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 1480a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1490a0e4badSJean-Christophe PLAGNIOL-VILLARD 1500a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1510a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: set_muxconf_regs 1520a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration Mux registers specific to the 1530a0e4badSJean-Christophe PLAGNIOL-VILLARD * hardware. Many pins need to be moved from protect to primary 1540a0e4badSJean-Christophe PLAGNIOL-VILLARD * mode. 1550a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1560a0e4badSJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void) 1570a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1580a0e4badSJean-Christophe PLAGNIOL-VILLARD MUX_BEAGLE(); 1590a0e4badSJean-Christophe PLAGNIOL-VILLARD } 160