add support for tl-mr13u
[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 #ifndef COMPRESSED_UBOOT
10 extern void     ar7240_ddr_initial_config(uint32_t refresh);
11 #endif
12 extern int ar7240_ddr_find_size(void);
13 extern void hornet_ddr_tap_init(void);
14
15 #define SETBITVAL(val, pos, bit) do {ulong bitval = (bit) ? 0x1 : 0x0; (val) = ((val) & ~(0x1 << (pos))) | ( (bitval) << (pos));} while(0)
16
17 void led_toggle(void){
18         unsigned int gpio;
19
20         gpio = ar7240_reg_rd(AR7240_GPIO_OUT);
21
22 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
23         gpio ^= 1 << GPIO_WPS_LED_BIT;
24 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined(CONFIG_FOR_TPLINK_WR710N_V1)
25         gpio ^= 1 << GPIO_SYS_LED_BIT;
26 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
27         gpio ^= 1 << GPIO_INTERNET_LED_BIT;
28 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
29         gpio ^= 1 << GPIO_SYS_LED_BIT;
30 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4) || defined(CONFIG_FOR_TPLINK_MR3220_V2)
31         gpio ^= 1 << GPIO_SYS_LED_BIT;
32 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
33         gpio ^= 1 << GPIO_SYS_LED_BIT;
34 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
35         gpio ^= 1 << GPIO_WLAN_LED_BIT;
36 #else
37         #error "Custom GPIO in leg_toggle() not defined!"
38 #endif
39
40         ar7240_reg_wr(AR7240_GPIO_OUT, gpio);
41 }
42
43 void all_led_on(void){
44         unsigned int gpio;
45
46         gpio = ar7240_reg_rd(AR7240_GPIO_OUT);
47
48 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
49         SETBITVAL(gpio, GPIO_WPS_LED_BIT, GPIO_WPS_LED_ON);
50         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
51         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
52         SETBITVAL(gpio, GPIO_ETH_LED_BIT, GPIO_ETH_LED_ON);
53 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined (CONFIG_FOR_TPLINK_WR710N_V1)
54         SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
55 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
56         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
57         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
58         SETBITVAL(gpio, GPIO_ETH_LED_BIT, GPIO_ETH_LED_ON);
59 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
60         SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
61 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4) || defined(CONFIG_FOR_TPLINK_MR3220_V2)
62         SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
63         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
64         SETBITVAL(gpio, GPIO_LAN1_LED_BIT, GPIO_LAN1_LED_ON);
65         SETBITVAL(gpio, GPIO_LAN2_LED_BIT, GPIO_LAN2_LED_ON);
66         SETBITVAL(gpio, GPIO_LAN3_LED_BIT, GPIO_LAN3_LED_ON);
67         SETBITVAL(gpio, GPIO_LAN4_LED_BIT, GPIO_LAN4_LED_ON);
68         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
69         SETBITVAL(gpio, GPIO_QSS_LED_BIT, GPIO_QSS_LED_ON);
70
71         #ifdef CONFIG_FOR_TPLINK_MR3220_V2
72         SETBITVAL(gpio, GPIO_USB_LED_BIT, GPIO_USB_LED_ON);
73         #endif
74 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
75         SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
76 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
77         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
78 #else
79         #error "Custom GPIO in all_led_on() not defined!"
80 #endif
81
82         ar7240_reg_wr(AR7240_GPIO_OUT, gpio);
83 }
84
85 void all_led_off(void){
86         unsigned int gpio;
87
88         gpio = ar7240_reg_rd(AR7240_GPIO_OUT);
89
90 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
91         SETBITVAL(gpio, GPIO_WPS_LED_BIT, !GPIO_WPS_LED_ON);
92         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
93         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
94         SETBITVAL(gpio, GPIO_ETH_LED_BIT, !GPIO_ETH_LED_ON);
95 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined (CONFIG_FOR_TPLINK_WR710N_V1)
96         SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
97 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
98         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
99         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
100         SETBITVAL(gpio, GPIO_ETH_LED_BIT, !GPIO_ETH_LED_ON);
101 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
102         SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
103 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4) || defined(CONFIG_FOR_TPLINK_MR3220_V2)
104         SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
105         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
106         SETBITVAL(gpio, GPIO_LAN1_LED_BIT, !GPIO_LAN1_LED_ON);
107         SETBITVAL(gpio, GPIO_LAN2_LED_BIT, !GPIO_LAN2_LED_ON);
108         SETBITVAL(gpio, GPIO_LAN3_LED_BIT, !GPIO_LAN3_LED_ON);
109         SETBITVAL(gpio, GPIO_LAN4_LED_BIT, !GPIO_LAN4_LED_ON);
110         SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
111         SETBITVAL(gpio, GPIO_QSS_LED_BIT, !GPIO_QSS_LED_ON);
112
113         #ifdef CONFIG_FOR_TPLINK_MR3220_V2
114         SETBITVAL(gpio, GPIO_USB_LED_BIT, !GPIO_USB_LED_ON);
115         #endif
116 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
117         SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
118 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
119         SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
120 #else
121         #error "Custom GPIO in all_led_off() not defined!"
122 #endif
123
124         ar7240_reg_wr(AR7240_GPIO_OUT, gpio);
125 }
126
127 // get button status
128 #ifndef GPIO_RST_BUTTON_BIT
129         #error "GPIO_RST_BUTTON_BIT not defined!"
130 #endif
131 int reset_button_status(void){
132         if(ar7240_reg_rd(AR7240_GPIO_IN) & (1 << GPIO_RST_BUTTON_BIT)){
133 #if defined(GPIO_RST_BUTTON_IS_ACTIVE_LOW)
134                 return(0);
135 #else
136                 return(1);
137 #endif
138         } else {
139 #if defined(GPIO_RST_BUTTON_IS_ACTIVE_LOW)
140                 return(1);
141 #else
142                 return(0);
143 #endif
144         }
145 }
146
147 void gpio_config(void){
148 #if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
149     /* Disable clock obs
150      * clk_obs1(gpio13/bit8),  clk_obs2(gpio14/bit9), clk_obs3(gpio15/bit10),
151      * clk_obs4(gpio16/bit11), clk_obs5(gpio17/bit12)
152      * clk_obs0(gpio1/bit19), 6(gpio11/bit20)
153      */
154     ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & ~((0x1f<<8)|(0x3<<19))));
155
156
157     /* Enable eth Switch LEDs */
158     ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) | (0x1f<<3)));
159
160
161     //Turn on status leds:
162     //set output enable
163     ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) |(1<<0)));
164
165     //set WLAN LED output to low (reverse polarity LED)
166     //ar7240_reg_wr(AR7240_GPIO_CLEAR, (1<<0));
167
168     /* Clear AR7240_GPIO_FUNC BIT2 to ensure that software can control LED5(GPIO16) and LED6(GPIO17)  */
169     ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & ~(0x1<<2)));
170 #else
171         /* Disable clock obs 
172          * clk_obs1(gpio13/bit8),  clk_obs2(gpio14/bit9), clk_obs3(gpio15/bit10),
173          * clk_obs4(gpio16/bit11), clk_obs5(gpio17/bit12)
174          * clk_obs0(gpio1/bit19), 6(gpio11/bit20)
175          */
176
177         ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xEF84E0FB));
178
179         /* Disable EJTAG functionality to enable GPIO functionality */
180         ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) | 0x8001));
181
182         /* Set HORNET_BOOTSTRAP_STATUS BIT18 to ensure that software can control GPIO26 and GPIO27 */
183         ar7240_reg_wr(HORNET_BOOTSTRAP_STATUS, (ar7240_reg_rd(HORNET_BOOTSTRAP_STATUS) | (0x1<<18)));
184 #endif
185
186 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
187
188         /* LED's GPIOs on MR3020:
189          *
190          * 0    => WLAN
191          * 17   => ETH
192          * 26   => WPS
193          * 27   => INTERNET
194          *
195          */
196
197         /* set OE, added by zcf, 20110509 */
198         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC020001));
199
200         /* Disable clock obs, added by zcf, 20110509 */
201         //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
202 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined(CONFIG_FOR_TPLINK_WR710N_V1)
203
204         /* LED's GPIOs on WR703N/WR720Nv3/WR710N:
205          *
206          * 27   => SYS
207          *
208          */
209
210         /* set OE, added by zcf, 20110714 */
211         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x8000000));
212 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
213
214         /* LED's GPIOs on MR3040:
215          *
216          * 26   => WLAN
217          * 17   => ETH
218          * 27   => INTERNET
219          *
220          */
221
222         /* set OE, added by zcf, 20110509 */
223         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC020000));
224
225         /* Disable clock obs, added by zcf, 20110509 */
226         //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
227 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
228
229         /* LED's GPIOs on MR10U:
230          *
231          * 27   => SYS
232          *
233          */
234
235         /* set OE, added by zcf, 20110714 */
236         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x8000000));
237 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4)
238
239         /* LED's GPIOs on WR740Nv4:
240          *
241          * 0    => WLAN
242          * 1    => QSS
243          * 13   => INTERNET
244          * 14   => LAN1
245          * 15   => LAN2
246          * 16   => LAN3
247          * 17   => LAN4
248          * 27   => SYS
249          *
250          */
251
252         /* set OE, added by zcf, 20110509 */
253         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x803E003));
254
255         /* Disable clock obs, added by zcf, 20110509 */
256         //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
257 #elif defined(CONFIG_FOR_TPLINK_MR3220_V2)
258
259         /* LED's GPIOs on MR3220v2:
260          *
261          * 0    => WLAN
262          * 1    => QSS
263          * 13   => INTERNET
264          * 14   => LAN1
265          * 15   => LAN2
266          * 16   => LAN3
267          * 17   => LAN4
268          * 26   => USB
269          * 27   => SYS
270          *
271          */
272
273         /* set OE, added by zcf, 20110509 */
274         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC03E003));
275
276         /* Disable clock obs, added by zcf, 20110509 */
277         //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
278 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
279         // TODO: check GPIO config for C2
280 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
281
282         /* LED's GPIOs on DIR-505:
283          *
284          * 26   => RED LED
285          * 27   => GREEN LED
286          *
287          */
288
289         // set GPIO_OE
290         ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC000000));
291
292         // turn off RED LED, we don't need it
293         ar7240_reg_wr(AR7240_GPIO_OUT, (ar7240_reg_rd(AR7240_GPIO_OUT) | (0x1 << 26)));
294 #else
295         #error "Custom GPIO config in gpio_config() not defined!"
296 #endif
297 }
298
299 int ar7240_mem_config(void){
300 #ifndef COMPRESSED_UBOOT
301         ar7240_ddr_initial_config(CFG_DDR_REFRESH_VAL);
302 #endif
303
304         /* Default tap values for starting the tap_init*/
305         ar7240_reg_wr(AR7240_DDR_TAP_CONTROL0, CFG_DDR_TAP0_VAL);
306         ar7240_reg_wr(AR7240_DDR_TAP_CONTROL1, CFG_DDR_TAP1_VAL);
307
308         gpio_config();
309         all_led_off();
310
311 #ifndef COMPRESSED_UBOOT
312         ar7240_ddr_tap_init();
313 #else
314         hornet_ddr_tap_init();
315 #endif
316
317         // return memory size
318         return(ar7240_ddr_find_size());
319 }
320
321 long int initdram(){
322         return((long int)ar7240_mem_config());
323 }
324
325 #ifndef COMPRESSED_UBOOT
326 int checkboard(void){
327         printf(BOARD_CUSTOM_STRING"\n\n");
328         return(0);
329 }
330 #endif