1/* 2 * (C) Copyright 2002 3 * Robert Schwebel, Pengutronix, r.schwebel@pengutronix.de 4 * Kyle Harris, Nexus Technologies, Inc., kharris@nexus-tech.net 5 * Marius Groeger, Sysgo Real-Time Solutions GmbH, mgroeger@sysgo.de 6 * 7 * See file CREDITS for list of people who contributed to this 8 * project. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License as 12 * published by the Free Software Foundation; either version 2 of 13 * the License, or (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 23 * MA 02111-1307 USA 24 */ 25 26#include <common.h> 27#include <asm/arch/pxa-regs.h> 28#include <asm/mach-types.h> 29 30DECLARE_GLOBAL_DATA_PTR; 31 32#ifdef CONFIG_SHOW_BOOT_PROGRESS 33# define SHOW_BOOT_PROGRESS(arg) show_boot_progress(arg) 34#else 35# define SHOW_BOOT_PROGRESS(arg) 36#endif 37 38/** 39 * i2c_init_board - reset i2c bus. When the board is powercycled during a 40 * bus transfer it might hang; for details see doc/I2C_Edge_Conditions. 41 * The Innokom board has GPIO70 connected to SCLK which can be toggled 42 * until all chips think that their current cycles are finished. 43 */ 44int i2c_init_board(void) 45{ 46 int i, icr; 47 48 /* disable I2C controller first, otherwhise it thinks we want to */ 49 /* talk to the slave port... */ 50 icr = ICR; ICR &= ~(ICR_SCLE | ICR_IUE); 51 52 /* set gpio pin low _before_ we change direction to output */ 53 GPCR(70) = GPIO_bit(70); 54 55 /* now toggle between output=low and high-impedance */ 56 for (i = 0; i < 20; i++) { 57 GPDR(70) |= GPIO_bit(70); /* output */ 58 udelay(10); 59 GPDR(70) &= ~GPIO_bit(70); /* input */ 60 udelay(10); 61 } 62 63 ICR = icr; 64 65 return 0; 66} 67 68 69/** 70 * misc_init_r: - misc initialisation routines 71 */ 72 73int misc_init_r(void) 74{ 75 char *str; 76 77 /* determine if the software update key is pressed during startup */ 78 if (GPLR0 & 0x00000800) { 79 printf("using bootcmd_normal (sw-update button not pressed)\n"); 80 str = getenv("bootcmd_normal"); 81 } else { 82 printf("using bootcmd_update (sw-update button pressed)\n"); 83 str = getenv("bootcmd_update"); 84 } 85 86 setenv("bootcmd",str); 87 88 return 0; 89} 90 91 92/** 93 * board_init: - setup some data structures 94 * 95 * @return: 0 in case of success 96 */ 97 98int board_init (void) 99{ 100 /* memory and cpu-speed are setup before relocation */ 101 /* so we do _nothing_ here */ 102 103 gd->bd->bi_arch_number = MACH_TYPE_INNOKOM; 104 gd->bd->bi_boot_params = 0xa0000100; 105 gd->bd->bi_baudrate = CONFIG_BAUDRATE; 106 107 return 0; 108} 109 110 111/** 112 * dram_init: - setup dynamic RAM 113 * 114 * @return: 0 in case of success 115 */ 116 117int dram_init (void) 118{ 119 gd->bd->bi_dram[0].start = PHYS_SDRAM_1; 120 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 121 122 return 0; 123} 124 125 126/** 127 * innokom_set_led: - switch LEDs on or off 128 * 129 * @param led: LED to switch (0,1,2) 130 * @param state: switch on (1) or off (0) 131 */ 132 133void innokom_set_led(int led, int state) 134{ 135 switch(led) { 136/* 137 case 0: if (state==1) { 138 GPCR0 |= CSB226_USER_LED0; 139 } else if (state==0) { 140 GPSR0 |= CSB226_USER_LED0; 141 } 142 break; 143 144 case 1: if (state==1) { 145 GPCR0 |= CSB226_USER_LED1; 146 } else if (state==0) { 147 GPSR0 |= CSB226_USER_LED1; 148 } 149 break; 150 151 case 2: if (state==1) { 152 GPCR0 |= CSB226_USER_LED2; 153 } else if (state==0) { 154 GPSR0 |= CSB226_USER_LED2; 155 } 156 break; 157*/ 158 } 159 160 return; 161} 162 163 164/** 165 * show_boot_progress: - indicate state of the boot process 166 * 167 * @param status: Status number - see README for details. 168 * 169 * The CSB226 does only have 3 LEDs, so we switch them on at the most 170 * important states (1, 5, 15). 171 */ 172 173void show_boot_progress (int status) 174{ 175 switch(status) { 176/* 177 case 1: csb226_set_led(0,1); break; 178 case 5: csb226_set_led(1,1); break; 179 case 15: csb226_set_led(2,1); break; 180*/ 181 } 182 183 return; 184} 185