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 <netdev.h> 28#include <asm/arch/pxa-regs.h> 29#include <asm/mach-types.h> 30#include <asm/io.h> 31 32DECLARE_GLOBAL_DATA_PTR; 33 34#ifdef CONFIG_SHOW_BOOT_PROGRESS 35# define SHOW_BOOT_PROGRESS(arg) show_boot_progress(arg) 36#else 37# define SHOW_BOOT_PROGRESS(arg) 38#endif 39 40/** 41 * i2c_init_board - reset i2c bus. When the board is powercycled during a 42 * bus transfer it might hang; for details see doc/I2C_Edge_Conditions. 43 * The Innokom board has GPIO70 connected to SCLK which can be toggled 44 * until all chips think that their current cycles are finished. 45 */ 46int i2c_init_board(void) 47{ 48 int i, icr; 49 50 /* disable I2C controller first, otherwhise it thinks we want to */ 51 /* talk to the slave port... */ 52 icr = readl(ICR); 53 writel(readl(ICR) & ~(ICR_SCLE | ICR_IUE), ICR); 54 55 /* set gpio pin low _before_ we change direction to output */ 56 writel(GPIO_bit(70), GPCR(70)); 57 58 /* now toggle between output=low and high-impedance */ 59 for (i = 0; i < 20; i++) { 60 writel(readl(GPDR(70)) | GPIO_bit(70), GPDR(70)); /* output */ 61 udelay(10); 62 writel(readl(GPDR(70)) & ~GPIO_bit(70), GPDR(70)); /* input */ 63 udelay(10); 64 } 65 66 writel(icr, ICR); 67 68 return 0; 69} 70 71 72/** 73 * misc_init_r: - misc initialisation routines 74 */ 75 76int misc_init_r(void) 77{ 78 char *str; 79 80 /* determine if the software update key is pressed during startup */ 81 if (readl(GPLR0) & 0x00000800) { 82 printf("using bootcmd_normal (sw-update button not pressed)\n"); 83 str = getenv("bootcmd_normal"); 84 } else { 85 printf("using bootcmd_update (sw-update button pressed)\n"); 86 str = getenv("bootcmd_update"); 87 } 88 89 setenv("bootcmd",str); 90 91 return 0; 92} 93 94 95/** 96 * board_init: - setup some data structures 97 * 98 * @return: 0 in case of success 99 */ 100 101int board_init (void) 102{ 103 /* We have RAM, disable cache */ 104 dcache_disable(); 105 icache_disable(); 106 107 gd->bd->bi_arch_number = MACH_TYPE_INNOKOM; 108 gd->bd->bi_boot_params = 0xa0000100; 109 gd->bd->bi_baudrate = CONFIG_BAUDRATE; 110 111 return 0; 112} 113 114extern void pxa_dram_init(void); 115int dram_init(void) 116{ 117 pxa_dram_init(); 118 gd->ram_size = PHYS_SDRAM_1_SIZE; 119 return 0; 120} 121 122void dram_init_banksize(void) 123{ 124 gd->bd->bi_dram[0].start = PHYS_SDRAM_1; 125 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 126} 127 128/** 129 * innokom_set_led: - switch LEDs on or off 130 * 131 * @param led: LED to switch (0,1,2) 132 * @param state: switch on (1) or off (0) 133 */ 134 135void innokom_set_led(int led, int state) 136{ 137 switch(led) { 138/* 139 case 0: if (state==1) { 140 GPCR0 |= CSB226_USER_LED0; 141 } else if (state==0) { 142 GPSR0 |= CSB226_USER_LED0; 143 } 144 break; 145 146 case 1: if (state==1) { 147 GPCR0 |= CSB226_USER_LED1; 148 } else if (state==0) { 149 GPSR0 |= CSB226_USER_LED1; 150 } 151 break; 152 153 case 2: if (state==1) { 154 GPCR0 |= CSB226_USER_LED2; 155 } else if (state==0) { 156 GPSR0 |= CSB226_USER_LED2; 157 } 158 break; 159*/ 160 } 161 162 return; 163} 164 165 166/** 167 * show_boot_progress: - indicate state of the boot process 168 * 169 * @param status: Status number - see README for details. 170 * 171 * The CSB226 does only have 3 LEDs, so we switch them on at the most 172 * important states (1, 5, 15). 173 */ 174 175void show_boot_progress (int status) 176{ 177 switch(status) { 178/* 179 case 1: csb226_set_led(0,1); break; 180 case 5: csb226_set_led(1,1); break; 181 case 15: csb226_set_led(2,1); break; 182*/ 183 } 184 185 return; 186} 187 188#ifdef CONFIG_CMD_NET 189int board_eth_init(bd_t *bis) 190{ 191 int rc = 0; 192#ifdef CONFIG_SMC91111 193 rc = smc91111_initialize(0, CONFIG_SMC91111_BASE); 194#endif 195 return rc; 196} 197#endif 198