2 * Atheros AP121 board support
4 * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
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.
11 #include <linux/mtd/mtd.h>
12 #include <linux/mtd/partitions.h>
13 #include <linux/spi/flash.h>
17 #include "dev-ar9xxx-wmac.h"
18 #include "dev-gpio-buttons.h"
19 #include "dev-leds-gpio.h"
20 #include "dev-m25p80.h"
23 #define AP121_GPIO_LED_WLAN 0
24 #define AP121_GPIO_LED_USB 1
26 #define AP121_GPIO_BTN_JUMPSTART 11
27 #define AP121_GPIO_BTN_RESET 12
29 #define AP121_KEYS_POLL_INTERVAL 20 /* msecs */
30 #define AP121_KEYS_DEBOUNCE_INTERVAL (3 * AP121_KEYS_POLL_INTERVAL)
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
37 #define AP121_MINI_GPIO_LED_WLAN 0
38 #define AP121_MINI_GPIO_BTN_JUMPSTART 12
39 #define AP121_MINI_GPIO_BTN_RESET 11
41 #ifdef CONFIG_MTD_PARTITIONS
42 static struct mtd_partition ap121_parts[] = {
47 .mask_flags = MTD_WRITEABLE,
68 .mask_flags = MTD_WRITEABLE,
71 #define ap121_nr_parts ARRAY_SIZE(ap121_parts)
73 static struct mtd_partition ap121_mini_parts[] = {
78 .mask_flags = MTD_WRITEABLE,
84 .mask_flags = MTD_WRITEABLE,
105 .mask_flags = MTD_WRITEABLE,
109 #define ap121_mini_nr_parts ARRAY_SIZE(ap121_parts)
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 */
118 static struct flash_platform_data ap121_flash_data = {
119 .parts = ap121_parts,
120 .nr_parts = ap121_nr_parts,
123 static struct gpio_led ap121_leds_gpio[] __initdata = {
125 .name = "ap121:green:usb",
126 .gpio = AP121_GPIO_LED_USB,
130 .name = "ap121:green:wlan",
131 .gpio = AP121_GPIO_LED_WLAN,
136 static struct gpio_keys_button ap121_gpio_keys[] __initdata = {
138 .desc = "jumpstart button",
140 .code = KEY_WPS_BUTTON,
141 .debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,
142 .gpio = AP121_GPIO_BTN_JUMPSTART,
146 .desc = "reset button",
149 .debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,
150 .gpio = AP121_GPIO_BTN_RESET,
155 static struct gpio_led ap121_mini_leds_gpio[] __initdata = {
157 .name = "ap121:green:wlan",
158 .gpio = AP121_MINI_GPIO_LED_WLAN,
163 static struct gpio_keys_button ap121_mini_gpio_keys[] __initdata = {
165 .desc = "jumpstart button",
167 .code = KEY_WPS_BUTTON,
168 .debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,
169 .gpio = AP121_MINI_GPIO_BTN_JUMPSTART,
173 .desc = "reset button",
176 .debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,
177 .gpio = AP121_MINI_GPIO_BTN_RESET,
182 static void __init ap121_common_setup(void)
184 u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
186 ar71xx_add_device_m25p80(&ap121_flash_data);
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);
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);
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;
203 ar71xx_add_device_mdio(0x0);
204 ar71xx_add_device_eth(1);
205 ar71xx_add_device_eth(0);
207 ar9xxx_add_device_wmac(art + AP121_CALDATA_OFFSET,
208 art + AP121_WMAC_MAC_OFFSET);
211 static void __init ap121_setup(void)
213 ap121_flash_data.parts = ap121_parts;
214 ap121_flash_data.nr_parts = ap121_nr_parts;
216 ap121_common_setup();
218 ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(ap121_leds_gpio),
220 ar71xx_register_gpio_keys_polled(-1, AP121_KEYS_POLL_INTERVAL,
221 ARRAY_SIZE(ap121_gpio_keys),
224 ar71xx_add_device_usb();
227 static void __init ap121_mini_setup(void)
229 ap121_flash_data.parts = ap121_mini_parts;
230 ap121_flash_data.nr_parts = ap121_mini_nr_parts;
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);
238 ap121_common_setup();
241 MIPS_MACHINE(AR71XX_MACH_AP121, "AP121", "Atheros AP121",
244 MIPS_MACHINE(AR71XX_MACH_AP121_MINI, "AP121-MINI", "Atheros AP121-MINI",