innokom.c 4.1 KB
Newer Older
W
wdenk 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/*
 * (C) Copyright 2002
 * Robert Schwebel, Pengutronix, r.schwebel@pengutronix.de
 * Kyle Harris, Nexus Technologies, Inc., kharris@nexus-tech.net
 * Marius Groeger, Sysgo Real-Time Solutions GmbH, mgroeger@sysgo.de
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <common.h>
#include <asm/arch/pxa-regs.h>
28
#include <asm/mach-types.h>
W
wdenk 已提交
29

30 31
DECLARE_GLOBAL_DATA_PTR;

W
wdenk 已提交
32 33 34 35 36 37
#ifdef CONFIG_SHOW_BOOT_PROGRESS
# define SHOW_BOOT_PROGRESS(arg)        show_boot_progress(arg)
#else
# define SHOW_BOOT_PROGRESS(arg)
#endif

38 39 40 41 42
/**
 * i2c_init_board - reset i2c bus. When the board is powercycled during a
 * bus transfer it might hang; for details see doc/I2C_Edge_Conditions.
 * The Innokom board has GPIO70 connected to SCLK which can be toggled
 * until all chips think that their current cycles are finished.
W
wdenk 已提交
43
 */
W
wdenk 已提交
44
int i2c_init_board(void)
45
{
W
wdenk 已提交
46
	int i, icr;
47

W
wdenk 已提交
48 49 50
	/* disable I2C controller first, otherwhise it thinks we want to    */
	/* talk to the slave port...                                        */
	icr = ICR; ICR &= ~(ICR_SCLE | ICR_IUE);
W
wdenk 已提交
51

W
wdenk 已提交
52
	/* set gpio pin low _before_ we change direction to output          */
W
wdenk 已提交
53
	GPCR(70) = GPIO_bit(70);
W
wdenk 已提交
54

W
wdenk 已提交
55 56 57
	/* now toggle between output=low and high-impedance                 */
	for (i = 0; i < 20; i++) {
		GPDR(70) |= GPIO_bit(70);  /* output */
58
		udelay(10);
W
wdenk 已提交
59
		GPDR(70) &= ~GPIO_bit(70); /* input  */
60 61
		udelay(10);
	}
W
wdenk 已提交
62 63 64 65

	ICR = icr;

	return 0;
66 67 68 69 70 71 72 73 74
}


/**
 * misc_init_r: - misc initialisation routines
 */

int misc_init_r(void)
{
75
	char *str;
76 77 78 79 80 81 82 83 84 85 86 87 88 89

	/* determine if the software update key is pressed during startup   */
	if (GPLR0 & 0x00000800) {
		printf("using bootcmd_normal (sw-update button not pressed)\n");
		str = getenv("bootcmd_normal");
	} else {
		printf("using bootcmd_update (sw-update button pressed)\n");
		str = getenv("bootcmd_update");
	}

	setenv("bootcmd",str);

	return 0;
}
W
wdenk 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102


/**
 * board_init: - setup some data structures
 *
 * @return: 0 in case of success
 */

int board_init (void)
{
	/* memory and cpu-speed are setup before relocation */
	/* so we do _nothing_ here */

103
	gd->bd->bi_arch_number = MACH_TYPE_INNOKOM;
W
wdenk 已提交
104
	gd->bd->bi_boot_params = 0xa0000100;
W
wdenk 已提交
105 106
	gd->bd->bi_baudrate = CONFIG_BAUDRATE;

W
wdenk 已提交
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
	return 0;
}


/**
 * dram_init: - setup dynamic RAM
 *
 * @return: 0 in case of success
 */

int dram_init (void)
{
	gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
	gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;

	return 0;
}


/**
 * innokom_set_led: - switch LEDs on or off
 *
 * @param led:   LED to switch (0,1,2)
 * @param state: switch on (1) or off (0)
 */

void innokom_set_led(int led, int state)
{
	switch(led) {
/*
		case 0: if (state==1) {
				GPCR0 |= CSB226_USER_LED0;
			} else if (state==0) {
				GPSR0 |= CSB226_USER_LED0;
			}
			break;

		case 1: if (state==1) {
W
wdenk 已提交
145 146 147 148 149
				GPCR0 |= CSB226_USER_LED1;
			} else if (state==0) {
				GPSR0 |= CSB226_USER_LED1;
			}
			break;
W
wdenk 已提交
150 151

		case 2: if (state==1) {
W
wdenk 已提交
152 153 154 155 156
				GPCR0 |= CSB226_USER_LED2;
			} else if (state==0) {
				GPSR0 |= CSB226_USER_LED2;
			}
			break;
W
wdenk 已提交
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
*/
	}

	return;
}


/**
 * show_boot_progress: - indicate state of the boot process
 *
 * @param status: Status number - see README for details.
 *
 * The CSB226 does only have 3 LEDs, so we switch them on at the most
 * important states (1, 5, 15).
 */

void show_boot_progress (int status)
{
	switch(status) {
/*
		case  1: csb226_set_led(0,1); break;
		case  5: csb226_set_led(1,1); break;
		case 15: csb226_set_led(2,1); break;
*/
	}

	return;
}