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

1/*
2 * Atheros AP83 board support
3 *
4 * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
5 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 as published
9 * by the Free Software Foundation.
10 */
11
12#include <linux/delay.h>
13#include <linux/platform_device.h>
14#include <linux/mtd/mtd.h>
15#include <linux/mtd/partitions.h>
16#include <linux/spi/spi.h>
17#include <linux/spi/spi_gpio.h>
18#include <linux/spi/vsc7385.h>
19
20#include <asm/mach-ar71xx/ar71xx.h>
21#include <asm/mach-ar71xx/ar91xx_flash.h>
22
23#include "machtype.h"
24#include "devices.h"
25#include "dev-ar913x-wmac.h"
26#include "dev-gpio-buttons.h"
27#include "dev-leds-gpio.h"
28#include "dev-usb.h"
29
30#define AP83_GPIO_LED_WLAN 6
31#define AP83_GPIO_LED_POWER 14
32#define AP83_GPIO_LED_JUMPSTART 15
33#define AP83_GPIO_BTN_JUMPSTART 12
34#define AP83_GPIO_BTN_RESET 21
35
36#define AP83_050_GPIO_VSC7385_CS 1
37#define AP83_050_GPIO_VSC7385_MISO 3
38#define AP83_050_GPIO_VSC7385_MOSI 16
39#define AP83_050_GPIO_VSC7385_SCK 17
40
41#define AP83_BUTTONS_POLL_INTERVAL 20
42
43#ifdef CONFIG_MTD_PARTITIONS
44static struct mtd_partition ap83_flash_partitions[] = {
45    {
46        .name = "u-boot",
47        .offset = 0,
48        .size = 0x040000,
49        .mask_flags = MTD_WRITEABLE,
50    } , {
51        .name = "u-boot-env",
52        .offset = 0x040000,
53        .size = 0x020000,
54        .mask_flags = MTD_WRITEABLE,
55    } , {
56        .name = "kernel",
57        .offset = 0x060000,
58        .size = 0x140000,
59    } , {
60        .name = "rootfs",
61        .offset = 0x1a0000,
62        .size = 0x650000,
63    } , {
64        .name = "art",
65        .offset = 0x7f0000,
66        .size = 0x010000,
67        .mask_flags = MTD_WRITEABLE,
68    } , {
69        .name = "firmware",
70        .offset = 0x060000,
71        .size = 0x790000,
72    }
73};
74#endif /* CONFIG_MTD_PARTITIONS */
75
76static struct ar91xx_flash_platform_data ap83_flash_data = {
77    .width = 2,
78#ifdef CONFIG_MTD_PARTITIONS
79        .parts = ap83_flash_partitions,
80        .nr_parts = ARRAY_SIZE(ap83_flash_partitions),
81#endif
82};
83
84static struct resource ap83_flash_resources[] = {
85    [0] = {
86        .start = AR71XX_SPI_BASE,
87        .end = AR71XX_SPI_BASE + AR71XX_SPI_SIZE - 1,
88        .flags = IORESOURCE_MEM,
89    },
90};
91
92static struct platform_device ap83_flash_device = {
93    .name = "ar91xx-flash",
94    .id = -1,
95    .resource = ap83_flash_resources,
96    .num_resources = ARRAY_SIZE(ap83_flash_resources),
97    .dev = {
98        .platform_data = &ap83_flash_data,
99    }
100};
101
102static struct gpio_led ap83_leds_gpio[] __initdata = {
103    {
104        .name = "ap83:green:jumpstart",
105        .gpio = AP83_GPIO_LED_JUMPSTART,
106        .active_low = 0,
107    }, {
108        .name = "ap83:green:power",
109        .gpio = AP83_GPIO_LED_POWER,
110        .active_low = 0,
111    }, {
112        .name = "ap83:green:wlan",
113        .gpio = AP83_GPIO_LED_WLAN,
114        .active_low = 0,
115    },
116};
117
118static struct gpio_button ap83_gpio_buttons[] __initdata = {
119    {
120        .desc = "soft_reset",
121        .type = EV_KEY,
122        .code = BTN_0,
123        .threshold = 3,
124        .gpio = AP83_GPIO_BTN_RESET,
125        .active_low = 1,
126    } , {
127        .desc = "jumpstart",
128        .type = EV_KEY,
129        .code = BTN_1,
130        .threshold = 3,
131        .gpio = AP83_GPIO_BTN_JUMPSTART,
132        .active_low = 1,
133    }
134};
135
136static struct resource ap83_040_spi_resources[] = {
137    [0] = {
138        .start = AR71XX_SPI_BASE,
139        .end = AR71XX_SPI_BASE + AR71XX_SPI_SIZE - 1,
140        .flags = IORESOURCE_MEM,
141    },
142};
143
144static struct platform_device ap83_040_spi_device = {
145    .name = "ap83-spi",
146    .id = 0,
147    .resource = ap83_040_spi_resources,
148    .num_resources = ARRAY_SIZE(ap83_040_spi_resources),
149};
150
151static struct spi_gpio_platform_data ap83_050_spi_data = {
152    .miso = AP83_050_GPIO_VSC7385_MISO,
153    .mosi = AP83_050_GPIO_VSC7385_MOSI,
154    .sck = AP83_050_GPIO_VSC7385_SCK,
155    .num_chipselect = 1,
156};
157
158static struct platform_device ap83_050_spi_device = {
159    .name = "spi_gpio",
160    .id = 0,
161    .dev = {
162        .platform_data = &ap83_050_spi_data,
163    }
164};
165
166static void ap83_vsc7385_reset(void)
167{
168    ar71xx_device_stop(RESET_MODULE_GE1_PHY);
169    udelay(10);
170    ar71xx_device_start(RESET_MODULE_GE1_PHY);
171    mdelay(50);
172}
173
174static struct vsc7385_platform_data ap83_vsc7385_data = {
175    .reset = ap83_vsc7385_reset,
176    .ucode_name = "vsc7385_ucode_ap83.bin",
177    .mac_cfg = {
178        .tx_ipg = 6,
179        .bit2 = 0,
180        .clk_sel = 3,
181    },
182};
183
184static struct spi_board_info ap83_spi_info[] = {
185    {
186        .bus_num = 0,
187        .chip_select = 0,
188        .max_speed_hz = 25000000,
189        .modalias = "spi-vsc7385",
190        .platform_data = &ap83_vsc7385_data,
191        .controller_data = (void *) AP83_050_GPIO_VSC7385_CS,
192    }
193};
194
195static void __init ap83_generic_setup(void)
196{
197    u8 *eeprom = (u8 *) KSEG1ADDR(0x1fff1000);
198
199    ar71xx_set_mac_base(eeprom);
200
201    ar71xx_add_device_mdio(0xfffffffe);
202
203    ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
204    ar71xx_eth0_data.phy_mask = 0x1;
205
206    ar71xx_add_device_eth(0);
207
208    ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
209    ar71xx_eth1_data.speed = SPEED_1000;
210    ar71xx_eth1_data.duplex = DUPLEX_FULL;
211
212    ar71xx_eth1_pll_data.pll_1000 = 0x1f000000;
213
214    ar71xx_add_device_eth(1);
215
216    ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(ap83_leds_gpio),
217                    ap83_leds_gpio);
218
219    ar71xx_add_device_gpio_buttons(-1, AP83_BUTTONS_POLL_INTERVAL,
220                    ARRAY_SIZE(ap83_gpio_buttons),
221                    ap83_gpio_buttons);
222
223    ar71xx_add_device_usb();
224
225    ar913x_add_device_wmac(eeprom, NULL);
226
227    platform_device_register(&ap83_flash_device);
228
229    spi_register_board_info(ap83_spi_info, ARRAY_SIZE(ap83_spi_info));
230}
231
232static void __init ap83_040_setup(void)
233{
234    ap83_flash_data.is_shared=1;
235    ap83_generic_setup();
236    platform_device_register(&ap83_040_spi_device);
237}
238
239static void __init ap83_050_setup(void)
240{
241    ap83_generic_setup();
242    platform_device_register(&ap83_050_spi_device);
243}
244
245static void __init ap83_setup(void)
246{
247    u8 *board_id = (u8 *) KSEG1ADDR(0x1fff1244);
248    unsigned int board_version;
249
250    board_version = (unsigned int)(board_id[0] - '0');
251    board_version += ((unsigned int)(board_id[1] - '0')) * 10;
252
253    switch (board_version) {
254    case 40:
255        ap83_040_setup();
256        break;
257    case 50:
258        ap83_050_setup();
259        break;
260    default:
261        printk(KERN_WARNING "AP83-%03u board is not yet supported\n",
262               board_version);
263    }
264}
265
266MIPS_MACHINE(AR71XX_MACH_AP83, "AP83", "Atheros AP83", ap83_setup);
267

Archive Download this file



interactive