Merge branch 'wr720nv3ch_memory_init_fix'
[oweals/u-boot_mod.git] / u-boot / board / ar7240 / ap121 / ap121.c
1 #include <common.h>
2 #include <command.h>
3 #include <asm/mipsregs.h>
4 #include <asm/addrspace.h>
5 #include <config.h>
6 #include <version.h>
7 #include "ar7240_soc.h"
8
9 #if !defined(COMPRESSED_UBOOT)
10 extern void     hornet_ddr_init(void);
11 #endif
12
13 extern int ar7240_ddr_find_size(void);
14 extern void hornet_ddr_tap_init(void);
15
16 #define SETBITVAL(val, pos, bit) do {ulong bitval = (bit) ? 0x1 : 0x0; (val) = ((val) & ~(0x1 << (pos))) | ( (bitval) << (pos));} while(0)
17
18 void led_toggle(void){
19         unsigned int gpio;
20
21         gpio = ar7240_reg_rd(AR7240_GPIO_OUT);
22
23 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
24         gpio ^= 1 << GPIO_WPS_LED_BIT;
25 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined(CONFIG_FOR_TPLINK_WR710N_V1)
26         gpio ^= 1 << GPIO_SYS_LED_BIT;
27 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
28         gpio ^= 1 << GPIO_INTERNET_LED_BIT;
29 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
30         gpio ^= 1 << GPIO_SYS_LED_BIT;
31 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4) || defined(CONFIG_FOR_TPLINK_MR3220_V2)
32         gpio ^= 1 << GPIO_SYS_LED_BIT;
33 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
34         gpio ^= 1 << GPIO_SYS_LED_BIT;
35 #elif defined(CONFIG_FOR_GS_OOLITE_V1_DEV)
36         gpio ^= 1 << GPIO_SYS_LED_BIT;
37 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
38         gpio ^= 1 << GPIO_WLAN_LED_BIT;
39 #elif defined(CONFIG_FOR_DRAGINO_V2)
40         gpio ^= 1 << GPIO_WLAN_LED_BIT;
41 #else
42         #error "Custom GPIO in leg_toggle() not defined!"
43 #endif
44
45         ar7240_reg_wr(AR7240_GPIO_OUT, gpio);
46 }
47
48 void all_led_on(void){
49         unsigned int gpio;
50
51         gpio = ar7240_reg_rd(AR7240_GPIO_OUT);
52
53 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
54         SETBITVAL(gpio, GPIO_WPS_LED_BIT, GPIO_WPS_LED_ON);
55         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
56         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
57         SETBITVAL(gpio, GPIO_ETH_LED_BIT, GPIO_ETH_LED_ON);
58 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined (CONFIG_FOR_TPLINK_WR710N_V1)
59         SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
60 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
61         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
62         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
63         SETBITVAL(gpio, GPIO_ETH_LED_BIT, GPIO_ETH_LED_ON);
64 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
65         SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
66 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4) || defined(CONFIG_FOR_TPLINK_MR3220_V2)
67         SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
68         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
69         SETBITVAL(gpio, GPIO_LAN1_LED_BIT, GPIO_LAN1_LED_ON);
70         SETBITVAL(gpio, GPIO_LAN2_LED_BIT, GPIO_LAN2_LED_ON);
71         SETBITVAL(gpio, GPIO_LAN3_LED_BIT, GPIO_LAN3_LED_ON);
72         SETBITVAL(gpio, GPIO_LAN4_LED_BIT, GPIO_LAN4_LED_ON);
73         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
74         SETBITVAL(gpio, GPIO_QSS_LED_BIT, GPIO_QSS_LED_ON);
75
76         #ifdef CONFIG_FOR_TPLINK_MR3220_V2
77         SETBITVAL(gpio, GPIO_USB_LED_BIT, GPIO_USB_LED_ON);
78         #endif
79 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
80         SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
81 #elif defined(CONFIG_FOR_GS_OOLITE_V1_DEV)
82         SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
83         SETBITVAL(gpio, GPIO_WAN_LED_BIT, GPIO_WAN_LED_ON);
84         SETBITVAL(gpio, GPIO_LAN1_LED_BIT, GPIO_LAN1_LED_ON);
85         SETBITVAL(gpio, GPIO_LAN2_LED_BIT, GPIO_LAN2_LED_ON);
86 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
87         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
88 #elif defined(CONFIG_FOR_DRAGINO_V2)
89         SETBITVAL(gpio, GPIO_WLAN_LED_BIT,     GPIO_WLAN_LED_ON);
90         SETBITVAL(gpio, GPIO_WAN_LED_BIT,      GPIO_WAN_LED_ON);
91         SETBITVAL(gpio, GPIO_LAN_LED_BIT,      GPIO_LAN_LED_ON);
92         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
93 #else
94         #error "Custom GPIO in all_led_on() not defined!"
95 #endif
96
97         ar7240_reg_wr(AR7240_GPIO_OUT, gpio);
98 }
99
100 void all_led_off(void){
101         unsigned int gpio;
102
103         gpio = ar7240_reg_rd(AR7240_GPIO_OUT);
104
105 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
106         SETBITVAL(gpio, GPIO_WPS_LED_BIT, !GPIO_WPS_LED_ON);
107         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
108         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
109         SETBITVAL(gpio, GPIO_ETH_LED_BIT, !GPIO_ETH_LED_ON);
110 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined (CONFIG_FOR_TPLINK_WR710N_V1)
111         SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
112 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
113         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
114         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
115         SETBITVAL(gpio, GPIO_ETH_LED_BIT, !GPIO_ETH_LED_ON);
116 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
117         SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
118 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4) || defined(CONFIG_FOR_TPLINK_MR3220_V2)
119         SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
120         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
121         SETBITVAL(gpio, GPIO_LAN1_LED_BIT, !GPIO_LAN1_LED_ON);
122         SETBITVAL(gpio, GPIO_LAN2_LED_BIT, !GPIO_LAN2_LED_ON);
123         SETBITVAL(gpio, GPIO_LAN3_LED_BIT, !GPIO_LAN3_LED_ON);
124         SETBITVAL(gpio, GPIO_LAN4_LED_BIT, !GPIO_LAN4_LED_ON);
125         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
126         SETBITVAL(gpio, GPIO_QSS_LED_BIT, !GPIO_QSS_LED_ON);
127
128         #ifdef CONFIG_FOR_TPLINK_MR3220_V2
129         SETBITVAL(gpio, GPIO_USB_LED_BIT, !GPIO_USB_LED_ON);
130         #endif
131 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
132         SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
133 #elif defined(CONFIG_FOR_GS_OOLITE_V1_DEV)
134         SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
135         SETBITVAL(gpio, GPIO_WAN_LED_BIT, !GPIO_WAN_LED_ON);
136         SETBITVAL(gpio, GPIO_LAN1_LED_BIT, !GPIO_LAN1_LED_ON);
137         SETBITVAL(gpio, GPIO_LAN2_LED_BIT, !GPIO_LAN2_LED_ON);
138 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
139         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
140 #elif defined(CONFIG_FOR_DRAGINO_V2)
141         SETBITVAL(gpio, GPIO_WLAN_LED_BIT,     !GPIO_WLAN_LED_ON);
142         SETBITVAL(gpio, GPIO_WAN_LED_BIT,      !GPIO_WAN_LED_ON);
143         SETBITVAL(gpio, GPIO_LAN_LED_BIT,      !GPIO_LAN_LED_ON);
144         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
145 #else
146         #error "Custom GPIO in all_led_off() not defined!"
147 #endif
148
149         ar7240_reg_wr(AR7240_GPIO_OUT, gpio);
150 }
151
152 // get button status
153 #ifndef GPIO_RST_BUTTON_BIT
154         #error "GPIO_RST_BUTTON_BIT not defined!"
155 #endif
156 int reset_button_status(void){
157         unsigned int gpio;
158
159         gpio = ar7240_reg_rd(AR7240_GPIO_IN);
160
161         if(gpio & (1 << GPIO_RST_BUTTON_BIT)){
162 #if defined(GPIO_RST_BUTTON_IS_ACTIVE_LOW)
163                 return(0);
164 #else
165                 return(1);
166 #endif
167         } else {
168 #if defined(GPIO_RST_BUTTON_IS_ACTIVE_LOW)
169                 return(1);
170 #else
171                 return(0);
172 #endif
173         }
174 }
175
176 void gpio_config(void){
177 #if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
178     /* Disable clock obs
179      * clk_obs1(gpio13/bit8),  clk_obs2(gpio14/bit9), clk_obs3(gpio15/bit10),
180      * clk_obs4(gpio16/bit11), clk_obs5(gpio17/bit12)
181      * clk_obs0(gpio1/bit19), 6(gpio11/bit20)
182      */
183     ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & ~((0x1f<<8)|(0x3<<19))));
184
185
186     /* Enable eth Switch LEDs */
187     ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) | (0x1f<<3)));
188
189
190     //Turn on status leds:
191     //set output enable
192     ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) |(1<<0)));
193
194     //set WLAN LED output to low (reverse polarity LED)
195     //ar7240_reg_wr(AR7240_GPIO_CLEAR, (1<<0));
196
197     /* Clear AR7240_GPIO_FUNC BIT2 to ensure that software can control LED5(GPIO16) and LED6(GPIO17)  */
198     ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & ~(0x1<<2)));
199 #else
200         /* Disable clock obs 
201          * clk_obs1(gpio13/bit8),  clk_obs2(gpio14/bit9), clk_obs3(gpio15/bit10),
202          * clk_obs4(gpio16/bit11), clk_obs5(gpio17/bit12)
203          * clk_obs0(gpio1/bit19), 6(gpio11/bit20)
204          */
205
206         ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xEF84E0FB));
207
208         /* Disable EJTAG functionality to enable GPIO functionality */
209         ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) | 0x8001));
210
211         /* Set HORNET_BOOTSTRAP_STATUS BIT18 to ensure that software can control GPIO26 and GPIO27 */
212         ar7240_reg_wr(HORNET_BOOTSTRAP_STATUS, (ar7240_reg_rd(HORNET_BOOTSTRAP_STATUS) | (0x1<<18)));
213 #endif
214
215 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
216
217         /* LED's GPIOs on MR3020:
218          *
219          * 0    => WLAN
220          * 17   => ETH
221          * 26   => WPS
222          * 27   => INTERNET
223          *
224          */
225
226         /* set OE, added by zcf, 20110509 */
227         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC020001));
228
229         /* Disable clock obs, added by zcf, 20110509 */
230         //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
231 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined(CONFIG_FOR_TPLINK_WR710N_V1)
232
233         /* LED's GPIOs on WR703N/WR720Nv3/WR710N:
234          *
235          * 27   => SYS
236          *
237          */
238
239         /* set OE, added by zcf, 20110714 */
240         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x8000000));
241 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
242
243         /* LED's GPIOs on MR3040:
244          *
245          * 26   => WLAN
246          * 17   => ETH
247          * 27   => INTERNET
248          *
249          */
250
251         /* set OE, added by zcf, 20110509 */
252         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC020000));
253
254         /* Disable clock obs, added by zcf, 20110509 */
255         //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
256 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
257
258         /* LED's GPIOs on MR10U/MR13U:
259          *
260          * 27   => SYS
261          *
262          */
263
264         /* set OE, added by zcf, 20110714 */
265         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x8000000));
266 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4)
267
268         /* LED's GPIOs on WR740Nv4:
269          *
270          * 0    => WLAN
271          * 1    => QSS
272          * 13   => INTERNET
273          * 14   => LAN1
274          * 15   => LAN2
275          * 16   => LAN3
276          * 17   => LAN4
277          * 27   => SYS
278          *
279          */
280
281         /* set OE, added by zcf, 20110509 */
282         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x803E003));
283
284         /* Disable clock obs, added by zcf, 20110509 */
285         //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
286 #elif defined(CONFIG_FOR_TPLINK_MR3220_V2)
287
288         /* LED's GPIOs on MR3220v2:
289          *
290          * 0    => WLAN
291          * 1    => QSS
292          * 13   => INTERNET
293          * 14   => LAN1
294          * 15   => LAN2
295          * 16   => LAN3
296          * 17   => LAN4
297          * 26   => USB
298          * 27   => SYS
299          *
300          */
301
302         /* set OE, added by zcf, 20110509 */
303         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC03E003));
304
305         /* Disable clock obs, added by zcf, 20110509 */
306         //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
307 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
308         // TODO: check GPIO config for C2
309 #elif defined(CONFIG_FOR_DRAGINO_V2)
310
311         /* LED's GPIOs on MR3220v2:
312          *
313          * 0    => WLAN
314          * 13   => LAN
315          * 17   => WAN
316          * 28   => INTERNET
317          *
318          */
319
320         /* set GPIO_OE */
321         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x10022001));
322
323 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
324
325         /* LED's GPIOs on DIR-505:
326          *
327          * 26   => RED LED
328          * 27   => GREEN LED
329          *
330          */
331
332         // set GPIO_OE
333         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC000000));
334
335         // turn off RED LED, we don't need it
336         ar7240_reg_wr(AR7240_GPIO_OUT, (ar7240_reg_rd(AR7240_GPIO_OUT) | (0x1 << 26)));
337 #elif defined(CONFIG_FOR_GS_OOLITE_V1_DEV)
338
339         /* LED's GPIOs on GS-Oolite v1 with development board:
340          *
341          * 13   => LAN2
342          * 15   => LAN1
343          * 17   => WAN
344          * 27   => SYS LED (green on dev board, red on module)
345          *
346          * I/O on development board:
347          * 0    => RED LED (active low)
348          * 1    => RED LED (active low)
349          * 6    => Switch 8
350          * 7    => Switch 7
351          * 8    => USB power
352          * 11   => Reset switch
353          * 14   => RED LED (active low)
354          * 16   => RED LED (active low)
355          * 18   => RED LED (active low)
356          * 19   => RED LED (active low)
357          * 20   => RED LED (active low)
358          * 21   => RED LED (active low)
359          * 22   => RED LED (active low)
360          * 23   => Relay 1
361          * 24   => Relay 2
362          * 26   => RED LED (active low)
363          *
364          */
365
366         // set GPIO_OE
367         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xDFFE103));
368
369         // turn on power on USB and turn off RED LEDs
370         ar7240_reg_wr(AR7240_GPIO_SET, 0x47D4103);
371 #else
372         #error "Custom GPIO config in gpio_config() not defined!"
373 #endif
374 }
375
376 int ar7240_mem_config(void){
377 #ifndef COMPRESSED_UBOOT
378         hornet_ddr_init();
379 #endif
380
381         /* Default tap values for starting the tap_init*/
382         ar7240_reg_wr(AR7240_DDR_TAP_CONTROL0, CFG_DDR_TAP0_VAL);
383         ar7240_reg_wr(AR7240_DDR_TAP_CONTROL1, CFG_DDR_TAP1_VAL);
384
385         gpio_config();
386         all_led_off();
387
388         hornet_ddr_tap_init();
389
390         // return memory size
391         return(ar7240_ddr_find_size());
392 }
393
394 long int initdram(){
395         return((long int)ar7240_mem_config());
396 }
397
398 #ifndef COMPRESSED_UBOOT
399 int checkboard(void){
400         printf(BOARD_CUSTOM_STRING"\n\n");
401         return(0);
402 }
403 #endif
404
405 /*
406  * Returns a string with memory type preceded by a space sign
407  */
408 const char* print_mem_type(void){
409 /*
410  * WR720N v3 (CH version) has wrong bootstrap configuration,
411  * so the memory type cannot be recognized automatically
412  */
413 #if defined(CONFIG_FOR_TPLINK_WR720N_V3)
414         return " DDR 16-bit";
415 #else
416         unsigned int reg_val;
417
418         reg_val = (ar7240_reg_rd(HORNET_BOOTSTRAP_STATUS) & HORNET_BOOTSTRAP_MEM_TYPE_MASK) >> HORNET_BOOTSTRAP_MEM_TYPE_SHIFT;
419
420         switch(reg_val){
421                 case 0:
422                         return " SDRAM";
423                         break;
424
425                 case 1:
426                         return " DDR 16-bit";
427                         break;
428
429                 case 2:
430                         return " DDR2 16-bit";
431                         break;
432
433                 default:
434                         return "";
435                         break;
436         }
437 #endif /* defined(CONFIG_FOR_TPLINK_WR720N_V3) */
438 }