Root/target/linux/ar71xx/files/arch/mips/ar71xx/mach-ap121.c

1/*
2 * Atheros AP121 board support
3 *
4 * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published
8 * by the Free Software Foundation.
9 */
10
11#include <linux/mtd/mtd.h>
12#include <linux/mtd/partitions.h>
13#include <linux/spi/flash.h>
14
15#include "machtype.h"
16#include "devices.h"
17#include "dev-ar9xxx-wmac.h"
18#include "dev-gpio-buttons.h"
19#include "dev-leds-gpio.h"
20#include "dev-m25p80.h"
21#include "dev-usb.h"
22
23#define AP121_GPIO_LED_WLAN 0
24#define AP121_GPIO_LED_USB 1
25
26#define AP121_GPIO_BTN_JUMPSTART 11
27#define AP121_GPIO_BTN_RESET 12
28
29#define AP121_KEYS_POLL_INTERVAL 20 /* msecs */
30#define AP121_KEYS_DEBOUNCE_INTERVAL (3 * AP121_KEYS_POLL_INTERVAL)
31
32#define AP121_MAC0_OFFSET 0x0000
33#define AP121_MAC1_OFFSET 0x0006
34#define AP121_CALDATA_OFFSET 0x1000
35#define AP121_WMAC_MAC_OFFSET 0x1002
36
37#define AP121_MINI_GPIO_LED_WLAN 0
38#define AP121_MINI_GPIO_BTN_JUMPSTART 12
39#define AP121_MINI_GPIO_BTN_RESET 11
40
41#ifdef CONFIG_MTD_PARTITIONS
42static struct mtd_partition ap121_parts[] = {
43    {
44        .name = "u-boot",
45        .offset = 0,
46        .size = 0x010000,
47        .mask_flags = MTD_WRITEABLE,
48    },
49    {
50        .name = "rootfs",
51        .offset = 0x010000,
52        .size = 0x130000,
53    },
54    {
55        .name = "uImage",
56        .offset = 0x140000,
57        .size = 0x0a0000,
58    },
59    {
60        .name = "NVRAM",
61        .offset = 0x1e0000,
62        .size = 0x010000,
63    },
64    {
65        .name = "ART",
66        .offset = 0x1f0000,
67        .size = 0x010000,
68        .mask_flags = MTD_WRITEABLE,
69    },
70};
71#define ap121_nr_parts ARRAY_SIZE(ap121_parts)
72
73static struct mtd_partition ap121_mini_parts[] = {
74    {
75        .name = "u-boot",
76        .offset = 0,
77        .size = 0x040000,
78        .mask_flags = MTD_WRITEABLE,
79    },
80    {
81        .name = "u-boot-env",
82        .offset = 0x040000,
83        .size = 0x010000,
84        .mask_flags = MTD_WRITEABLE,
85    },
86    {
87        .name = "rootfs",
88        .offset = 0x050000,
89        .size = 0x2b0000,
90    },
91    {
92        .name = "uImage",
93        .offset = 0x300000,
94        .size = 0x0e0000,
95    },
96    {
97        .name = "NVRAM",
98        .offset = 0x3e0000,
99        .size = 0x010000,
100    },
101    {
102        .name = "ART",
103        .offset = 0x3f0000,
104        .size = 0x010000,
105        .mask_flags = MTD_WRITEABLE,
106    },
107};
108
109#define ap121_mini_nr_parts ARRAY_SIZE(ap121_parts)
110
111#else
112#define ap121_parts NULL
113#define ap121_nr_parts 0
114#define ap121_mini_parts NULL
115#define ap121_mini_nr_parts 0
116#endif /* CONFIG_MTD_PARTITIONS */
117
118static struct flash_platform_data ap121_flash_data = {
119    .parts = ap121_parts,
120    .nr_parts = ap121_nr_parts,
121};
122
123static struct gpio_led ap121_leds_gpio[] __initdata = {
124    {
125        .name = "ap121:green:usb",
126        .gpio = AP121_GPIO_LED_USB,
127        .active_low = 0,
128    },
129    {
130        .name = "ap121:green:wlan",
131        .gpio = AP121_GPIO_LED_WLAN,
132        .active_low = 0,
133    },
134};
135
136static struct gpio_keys_button ap121_gpio_keys[] __initdata = {
137    {
138        .desc = "jumpstart button",
139        .type = EV_KEY,
140        .code = KEY_WPS_BUTTON,
141        .debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,
142        .gpio = AP121_GPIO_BTN_JUMPSTART,
143        .active_low = 1,
144    },
145    {
146        .desc = "reset button",
147        .type = EV_KEY,
148        .code = KEY_RESTART,
149        .debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,
150        .gpio = AP121_GPIO_BTN_RESET,
151        .active_low = 1,
152    }
153};
154
155static struct gpio_led ap121_mini_leds_gpio[] __initdata = {
156    {
157        .name = "ap121:green:wlan",
158        .gpio = AP121_MINI_GPIO_LED_WLAN,
159        .active_low = 0,
160    },
161};
162
163static struct gpio_keys_button ap121_mini_gpio_keys[] __initdata = {
164    {
165        .desc = "jumpstart button",
166        .type = EV_KEY,
167        .code = KEY_WPS_BUTTON,
168        .debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,
169        .gpio = AP121_MINI_GPIO_BTN_JUMPSTART,
170        .active_low = 1,
171    },
172    {
173        .desc = "reset button",
174        .type = EV_KEY,
175        .code = KEY_RESTART,
176        .debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,
177        .gpio = AP121_MINI_GPIO_BTN_RESET,
178        .active_low = 1,
179    }
180};
181
182static void __init ap121_common_setup(void)
183{
184    u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
185
186    ar71xx_add_device_m25p80(&ap121_flash_data);
187
188    ar71xx_init_mac(ar71xx_eth0_data.mac_addr, art + AP121_MAC0_OFFSET, 0);
189    ar71xx_init_mac(ar71xx_eth1_data.mac_addr, art + AP121_MAC1_OFFSET, 0);
190
191    /* WAN port */
192    ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RMII;
193    ar71xx_eth0_data.speed = SPEED_100;
194    ar71xx_eth0_data.duplex = DUPLEX_FULL;
195    ar71xx_eth0_data.phy_mask = BIT(4);
196
197    /* LAN ports */
198    ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII;
199    ar71xx_eth1_data.speed = SPEED_1000;
200    ar71xx_eth1_data.duplex = DUPLEX_FULL;
201    ar71xx_eth1_data.has_ar7240_switch = 1;
202
203    ar71xx_add_device_mdio(0x0);
204    ar71xx_add_device_eth(1);
205    ar71xx_add_device_eth(0);
206
207    ar9xxx_add_device_wmac(art + AP121_CALDATA_OFFSET,
208                   art + AP121_WMAC_MAC_OFFSET);
209}
210
211static void __init ap121_setup(void)
212{
213    ap121_flash_data.parts = ap121_parts;
214    ap121_flash_data.nr_parts = ap121_nr_parts;
215
216    ap121_common_setup();
217
218    ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(ap121_leds_gpio),
219                    ap121_leds_gpio);
220    ar71xx_register_gpio_keys_polled(-1, AP121_KEYS_POLL_INTERVAL,
221                     ARRAY_SIZE(ap121_gpio_keys),
222                     ap121_gpio_keys);
223
224    ar71xx_add_device_usb();
225}
226
227static void __init ap121_mini_setup(void)
228{
229    ap121_flash_data.parts = ap121_mini_parts;
230    ap121_flash_data.nr_parts = ap121_mini_nr_parts;
231
232    ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(ap121_mini_leds_gpio),
233                    ap121_mini_leds_gpio);
234    ar71xx_register_gpio_keys_polled(-1, AP121_KEYS_POLL_INTERVAL,
235                     ARRAY_SIZE(ap121_mini_gpio_keys),
236                     ap121_mini_gpio_keys);
237
238    ap121_common_setup();
239}
240
241MIPS_MACHINE(AR71XX_MACH_AP121, "AP121", "Atheros AP121",
242         ap121_setup);
243
244MIPS_MACHINE(AR71XX_MACH_AP121_MINI, "AP121-MINI", "Atheros AP121-MINI",
245         ap121_mini_setup);
246

Archive Download this file



interactive