1*0a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 2*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2004-2008 3*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Texas Instruments, <www.ti.com> 4*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * 5*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Author : 6*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Sunil Kumar <sunilsaini05@gmail.com> 7*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Shashi Ranjan <shashiranjanmca05@gmail.com> 8*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * 9*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Derived from Beagle Board and 3430 SDP code by 10*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Richard Woodruff <r-woodruff2@ti.com> 11*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Syed Mohammed Khasim <khasim@ti.com> 12*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * 13*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * 14*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * See file CREDITS for list of people who contributed to this 15*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * project. 16*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * 17*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or 18*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * modify it under the terms of the GNU General Public License as 19*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * published by the Free Software Foundation; either version 2 of 20*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * the License, or (at your option) any later version. 21*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * 22*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 23*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 24*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 26*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * 27*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 28*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 29*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 30*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * MA 02111-1307 USA 31*0a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 32*0a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <common.h> 33*0a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <twl4030.h> 34*0a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h> 35*0a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h> 36*0a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h> 37*0a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/gpio.h> 38*0a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h> 39*0a0e4badSJean-Christophe PLAGNIOL-VILLARD #include "beagle.h" 40*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 41*0a0e4badSJean-Christophe PLAGNIOL-VILLARD static int beagle_revision_c; 42*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 43*0a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 44*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: board_init 45*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Early hardware init. 46*0a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 47*0a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_init(void) 48*0a0e4badSJean-Christophe PLAGNIOL-VILLARD { 49*0a0e4badSJean-Christophe PLAGNIOL-VILLARD DECLARE_GLOBAL_DATA_PTR; 50*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 51*0a0e4badSJean-Christophe PLAGNIOL-VILLARD gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 52*0a0e4badSJean-Christophe PLAGNIOL-VILLARD /* board id for Linux */ 53*0a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_OMAP3_BEAGLE; 54*0a0e4badSJean-Christophe PLAGNIOL-VILLARD /* boot param addr */ 55*0a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 56*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 57*0a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 58*0a0e4badSJean-Christophe PLAGNIOL-VILLARD } 59*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 60*0a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 61*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: beagle_get_revision 62*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Return the revision of the BeagleBoard this code is running on. 63*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * If it is a revision Ax/Bx board, this function returns 0, 64*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * on a revision C board you will get a 1. 65*0a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 66*0a0e4badSJean-Christophe PLAGNIOL-VILLARD int beagle_get_revision(void) 67*0a0e4badSJean-Christophe PLAGNIOL-VILLARD { 68*0a0e4badSJean-Christophe PLAGNIOL-VILLARD return beagle_revision_c; 69*0a0e4badSJean-Christophe PLAGNIOL-VILLARD } 70*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 71*0a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 72*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: beagle_identify 73*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Detect if we are running on a Beagle revision Ax/Bx or 74*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Cx. This can be done by GPIO_171. If this is low, we are 75*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * running on a revision C board. 76*0a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 77*0a0e4badSJean-Christophe PLAGNIOL-VILLARD void beagle_identify(void) 78*0a0e4badSJean-Christophe PLAGNIOL-VILLARD { 79*0a0e4badSJean-Christophe PLAGNIOL-VILLARD beagle_revision_c = 0; 80*0a0e4badSJean-Christophe PLAGNIOL-VILLARD if (!omap_request_gpio(171)) { 81*0a0e4badSJean-Christophe PLAGNIOL-VILLARD unsigned int val; 82*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 83*0a0e4badSJean-Christophe PLAGNIOL-VILLARD omap_set_gpio_direction(171, 1); 84*0a0e4badSJean-Christophe PLAGNIOL-VILLARD val = omap_get_gpio_datain(171); 85*0a0e4badSJean-Christophe PLAGNIOL-VILLARD omap_free_gpio(171); 86*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 87*0a0e4badSJean-Christophe PLAGNIOL-VILLARD if (val) 88*0a0e4badSJean-Christophe PLAGNIOL-VILLARD beagle_revision_c = 0; 89*0a0e4badSJean-Christophe PLAGNIOL-VILLARD else 90*0a0e4badSJean-Christophe PLAGNIOL-VILLARD beagle_revision_c = 1; 91*0a0e4badSJean-Christophe PLAGNIOL-VILLARD } 92*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 93*0a0e4badSJean-Christophe PLAGNIOL-VILLARD printf("Board revision "); 94*0a0e4badSJean-Christophe PLAGNIOL-VILLARD if (beagle_revision_c) 95*0a0e4badSJean-Christophe PLAGNIOL-VILLARD printf("C\n"); 96*0a0e4badSJean-Christophe PLAGNIOL-VILLARD else 97*0a0e4badSJean-Christophe PLAGNIOL-VILLARD printf("Ax/Bx\n"); 98*0a0e4badSJean-Christophe PLAGNIOL-VILLARD } 99*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 100*0a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 101*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 102*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Configure board specific parts 103*0a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 104*0a0e4badSJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 105*0a0e4badSJean-Christophe PLAGNIOL-VILLARD { 106*0a0e4badSJean-Christophe PLAGNIOL-VILLARD struct gpio *gpio5_base = (struct gpio *)OMAP34XX_GPIO5_BASE; 107*0a0e4badSJean-Christophe PLAGNIOL-VILLARD struct gpio *gpio6_base = (struct gpio *)OMAP34XX_GPIO6_BASE; 108*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 109*0a0e4badSJean-Christophe PLAGNIOL-VILLARD twl4030_power_init(); 110*0a0e4badSJean-Christophe PLAGNIOL-VILLARD twl4030_led_init(); 111*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 112*0a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Configure GPIOs to output */ 113*0a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(~(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1), &gpio6_base->oe); 114*0a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(~(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 | 115*0a0e4badSJean-Christophe PLAGNIOL-VILLARD GPIO15 | GPIO14 | GPIO13 | GPIO12), &gpio5_base->oe); 116*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 117*0a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Set GPIOs */ 118*0a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1, 119*0a0e4badSJean-Christophe PLAGNIOL-VILLARD &gpio6_base->setdataout); 120*0a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 | 121*0a0e4badSJean-Christophe PLAGNIOL-VILLARD GPIO15 | GPIO14 | GPIO13 | GPIO12, &gpio5_base->setdataout); 122*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 123*0a0e4badSJean-Christophe PLAGNIOL-VILLARD beagle_identify(); 124*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 125*0a0e4badSJean-Christophe PLAGNIOL-VILLARD dieid_num_r(); 126*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 127*0a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 128*0a0e4badSJean-Christophe PLAGNIOL-VILLARD } 129*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 130*0a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 131*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: set_muxconf_regs 132*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration Mux registers specific to the 133*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * hardware. Many pins need to be moved from protect to primary 134*0a0e4badSJean-Christophe PLAGNIOL-VILLARD * mode. 135*0a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 136*0a0e4badSJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void) 137*0a0e4badSJean-Christophe PLAGNIOL-VILLARD { 138*0a0e4badSJean-Christophe PLAGNIOL-VILLARD MUX_BEAGLE(); 139*0a0e4badSJean-Christophe PLAGNIOL-VILLARD 140*0a0e4badSJean-Christophe PLAGNIOL-VILLARD if (beagle_revision_c) { 141*0a0e4badSJean-Christophe PLAGNIOL-VILLARD MUX_BEAGLE_C(); 142*0a0e4badSJean-Christophe PLAGNIOL-VILLARD } 143*0a0e4badSJean-Christophe PLAGNIOL-VILLARD } 144