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 static int beagle_revision_c; 420a0e4badSJean-Christophe PLAGNIOL-VILLARD 430a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 440a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: board_init 450a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Early hardware init. 460a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 470a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_init(void) 480a0e4badSJean-Christophe PLAGNIOL-VILLARD { 490a0e4badSJean-Christophe PLAGNIOL-VILLARD DECLARE_GLOBAL_DATA_PTR; 500a0e4badSJean-Christophe PLAGNIOL-VILLARD 510a0e4badSJean-Christophe PLAGNIOL-VILLARD gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 520a0e4badSJean-Christophe PLAGNIOL-VILLARD /* board id for Linux */ 530a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_OMAP3_BEAGLE; 540a0e4badSJean-Christophe PLAGNIOL-VILLARD /* boot param addr */ 550a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 560a0e4badSJean-Christophe PLAGNIOL-VILLARD 570a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 580a0e4badSJean-Christophe PLAGNIOL-VILLARD } 590a0e4badSJean-Christophe PLAGNIOL-VILLARD 600a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 610a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: beagle_get_revision 620a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Return the revision of the BeagleBoard this code is running on. 630a0e4badSJean-Christophe PLAGNIOL-VILLARD * If it is a revision Ax/Bx board, this function returns 0, 640a0e4badSJean-Christophe PLAGNIOL-VILLARD * on a revision C board you will get a 1. 650a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 660a0e4badSJean-Christophe PLAGNIOL-VILLARD int beagle_get_revision(void) 670a0e4badSJean-Christophe PLAGNIOL-VILLARD { 680a0e4badSJean-Christophe PLAGNIOL-VILLARD return beagle_revision_c; 690a0e4badSJean-Christophe PLAGNIOL-VILLARD } 700a0e4badSJean-Christophe PLAGNIOL-VILLARD 710a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 720a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: beagle_identify 730a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Detect if we are running on a Beagle revision Ax/Bx or 740a0e4badSJean-Christophe PLAGNIOL-VILLARD * Cx. This can be done by GPIO_171. If this is low, we are 750a0e4badSJean-Christophe PLAGNIOL-VILLARD * running on a revision C board. 760a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 770a0e4badSJean-Christophe PLAGNIOL-VILLARD void beagle_identify(void) 780a0e4badSJean-Christophe PLAGNIOL-VILLARD { 790a0e4badSJean-Christophe PLAGNIOL-VILLARD beagle_revision_c = 0; 800a0e4badSJean-Christophe PLAGNIOL-VILLARD if (!omap_request_gpio(171)) { 810a0e4badSJean-Christophe PLAGNIOL-VILLARD unsigned int val; 820a0e4badSJean-Christophe PLAGNIOL-VILLARD 830a0e4badSJean-Christophe PLAGNIOL-VILLARD omap_set_gpio_direction(171, 1); 840a0e4badSJean-Christophe PLAGNIOL-VILLARD val = omap_get_gpio_datain(171); 850a0e4badSJean-Christophe PLAGNIOL-VILLARD omap_free_gpio(171); 860a0e4badSJean-Christophe PLAGNIOL-VILLARD 870a0e4badSJean-Christophe PLAGNIOL-VILLARD if (val) 880a0e4badSJean-Christophe PLAGNIOL-VILLARD beagle_revision_c = 0; 890a0e4badSJean-Christophe PLAGNIOL-VILLARD else 900a0e4badSJean-Christophe PLAGNIOL-VILLARD beagle_revision_c = 1; 910a0e4badSJean-Christophe PLAGNIOL-VILLARD } 920a0e4badSJean-Christophe PLAGNIOL-VILLARD 930a0e4badSJean-Christophe PLAGNIOL-VILLARD printf("Board revision "); 940a0e4badSJean-Christophe PLAGNIOL-VILLARD if (beagle_revision_c) 950a0e4badSJean-Christophe PLAGNIOL-VILLARD printf("C\n"); 960a0e4badSJean-Christophe PLAGNIOL-VILLARD else 970a0e4badSJean-Christophe PLAGNIOL-VILLARD printf("Ax/Bx\n"); 980a0e4badSJean-Christophe PLAGNIOL-VILLARD } 990a0e4badSJean-Christophe PLAGNIOL-VILLARD 1000a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1010a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 1020a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Configure board specific parts 1030a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1040a0e4badSJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 1050a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1060a0e4badSJean-Christophe PLAGNIOL-VILLARD struct gpio *gpio5_base = (struct gpio *)OMAP34XX_GPIO5_BASE; 1070a0e4badSJean-Christophe PLAGNIOL-VILLARD struct gpio *gpio6_base = (struct gpio *)OMAP34XX_GPIO6_BASE; 1080a0e4badSJean-Christophe PLAGNIOL-VILLARD 1090a0e4badSJean-Christophe PLAGNIOL-VILLARD twl4030_power_init(); 110*ead39d7aSGrazvydas Ignotas twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); 1110a0e4badSJean-Christophe PLAGNIOL-VILLARD 1120a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Configure GPIOs to output */ 1130a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(~(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1), &gpio6_base->oe); 1140a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(~(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 | 1150a0e4badSJean-Christophe PLAGNIOL-VILLARD GPIO15 | GPIO14 | GPIO13 | GPIO12), &gpio5_base->oe); 1160a0e4badSJean-Christophe PLAGNIOL-VILLARD 1170a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Set GPIOs */ 1180a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1, 1190a0e4badSJean-Christophe PLAGNIOL-VILLARD &gpio6_base->setdataout); 1200a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 | 1210a0e4badSJean-Christophe PLAGNIOL-VILLARD GPIO15 | GPIO14 | GPIO13 | GPIO12, &gpio5_base->setdataout); 1220a0e4badSJean-Christophe PLAGNIOL-VILLARD 1230a0e4badSJean-Christophe PLAGNIOL-VILLARD beagle_identify(); 1240a0e4badSJean-Christophe PLAGNIOL-VILLARD 1250a0e4badSJean-Christophe PLAGNIOL-VILLARD dieid_num_r(); 1260a0e4badSJean-Christophe PLAGNIOL-VILLARD 1270a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 1280a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1290a0e4badSJean-Christophe PLAGNIOL-VILLARD 1300a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1310a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: set_muxconf_regs 1320a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration Mux registers specific to the 1330a0e4badSJean-Christophe PLAGNIOL-VILLARD * hardware. Many pins need to be moved from protect to primary 1340a0e4badSJean-Christophe PLAGNIOL-VILLARD * mode. 1350a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1360a0e4badSJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void) 1370a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1380a0e4badSJean-Christophe PLAGNIOL-VILLARD MUX_BEAGLE(); 1390a0e4badSJean-Christophe PLAGNIOL-VILLARD 1400a0e4badSJean-Christophe PLAGNIOL-VILLARD if (beagle_revision_c) { 1410a0e4badSJean-Christophe PLAGNIOL-VILLARD MUX_BEAGLE_C(); 1420a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1430a0e4badSJean-Christophe PLAGNIOL-VILLARD } 144