]>
Commit | Line | Data |
---|---|---|
43d9616c WD |
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> | |
47cd00fa | 28 | #include <asm/mach-types.h> |
43d9616c WD |
29 | |
30 | #ifdef CONFIG_SHOW_BOOT_PROGRESS | |
31 | # define SHOW_BOOT_PROGRESS(arg) show_boot_progress(arg) | |
32 | #else | |
33 | # define SHOW_BOOT_PROGRESS(arg) | |
34 | #endif | |
35 | ||
47cd00fa WD |
36 | /** |
37 | * i2c_init_board - reset i2c bus. When the board is powercycled during a | |
38 | * bus transfer it might hang; for details see doc/I2C_Edge_Conditions. | |
39 | * The Innokom board has GPIO70 connected to SCLK which can be toggled | |
40 | * until all chips think that their current cycles are finished. | |
43d9616c | 41 | */ |
dc7c9a1a | 42 | int i2c_init_board(void) |
47cd00fa | 43 | { |
dc7c9a1a | 44 | int i, icr; |
47cd00fa | 45 | |
dc7c9a1a WD |
46 | /* disable I2C controller first, otherwhise it thinks we want to */ |
47 | /* talk to the slave port... */ | |
48 | icr = ICR; ICR &= ~(ICR_SCLE | ICR_IUE); | |
8bde7f77 | 49 | |
dc7c9a1a | 50 | /* set gpio pin low _before_ we change direction to output */ |
3e38691e | 51 | GPCR(70) = GPIO_bit(70); |
8bde7f77 | 52 | |
dc7c9a1a WD |
53 | /* now toggle between output=low and high-impedance */ |
54 | for (i = 0; i < 20; i++) { | |
55 | GPDR(70) |= GPIO_bit(70); /* output */ | |
47cd00fa | 56 | udelay(10); |
dc7c9a1a | 57 | GPDR(70) &= ~GPIO_bit(70); /* input */ |
47cd00fa WD |
58 | udelay(10); |
59 | } | |
dc7c9a1a WD |
60 | |
61 | ICR = icr; | |
62 | ||
63 | return 0; | |
47cd00fa WD |
64 | } |
65 | ||
66 | ||
67 | /** | |
68 | * misc_init_r: - misc initialisation routines | |
69 | */ | |
70 | ||
71 | int misc_init_r(void) | |
72 | { | |
73 | uchar *str; | |
74 | ||
75 | /* determine if the software update key is pressed during startup */ | |
76 | if (GPLR0 & 0x00000800) { | |
77 | printf("using bootcmd_normal (sw-update button not pressed)\n"); | |
78 | str = getenv("bootcmd_normal"); | |
79 | } else { | |
80 | printf("using bootcmd_update (sw-update button pressed)\n"); | |
81 | str = getenv("bootcmd_update"); | |
82 | } | |
83 | ||
84 | setenv("bootcmd",str); | |
85 | ||
86 | return 0; | |
87 | } | |
43d9616c WD |
88 | |
89 | ||
90 | /** | |
91 | * board_init: - setup some data structures | |
92 | * | |
93 | * @return: 0 in case of success | |
94 | */ | |
95 | ||
96 | int board_init (void) | |
97 | { | |
98 | DECLARE_GLOBAL_DATA_PTR; | |
99 | ||
100 | /* memory and cpu-speed are setup before relocation */ | |
101 | /* so we do _nothing_ here */ | |
102 | ||
47cd00fa | 103 | gd->bd->bi_arch_number = MACH_TYPE_INNOKOM; |
43d9616c | 104 | gd->bd->bi_boot_params = 0xa0000100; |
dc7c9a1a WD |
105 | gd->bd->bi_baudrate = CONFIG_BAUDRATE; |
106 | ||
43d9616c WD |
107 | return 0; |
108 | } | |
109 | ||
110 | ||
111 | /** | |
112 | * dram_init: - setup dynamic RAM | |
113 | * | |
114 | * @return: 0 in case of success | |
115 | */ | |
116 | ||
117 | int dram_init (void) | |
118 | { | |
119 | DECLARE_GLOBAL_DATA_PTR; | |
120 | ||
121 | gd->bd->bi_dram[0].start = PHYS_SDRAM_1; | |
122 | gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; | |
123 | ||
124 | return 0; | |
125 | } | |
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 | ||
135 | void 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) { | |
8bde7f77 WD |
147 | GPCR0 |= CSB226_USER_LED1; |
148 | } else if (state==0) { | |
149 | GPSR0 |= CSB226_USER_LED1; | |
150 | } | |
151 | break; | |
43d9616c WD |
152 | |
153 | case 2: if (state==1) { | |
8bde7f77 WD |
154 | GPCR0 |= CSB226_USER_LED2; |
155 | } else if (state==0) { | |
156 | GPSR0 |= CSB226_USER_LED2; | |
157 | } | |
158 | break; | |
43d9616c WD |
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 | ||
175 | void 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 | } |