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

1/*
2 * Netgear WNDR3700 board support
3 *
4 * Copyright (C) 2009 Marco Porsch
5 * Copyright (C) 2009-2010 Gabor Juhos <juhosg@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/platform_device.h>
13#include <linux/mtd/mtd.h>
14#include <linux/mtd/partitions.h>
15#include <linux/delay.h>
16#include <linux/rtl8366s.h>
17
18#include <asm/mach-ar71xx/ar71xx.h>
19
20#include "machtype.h"
21#include "devices.h"
22#include "dev-m25p80.h"
23#include "dev-ap94-pci.h"
24#include "dev-gpio-buttons.h"
25#include "dev-leds-gpio.h"
26#include "dev-usb.h"
27
28#define WNDR3700_GPIO_LED_WPS_ORANGE 0
29#define WNDR3700_GPIO_LED_POWER_ORANGE 1
30#define WNDR3700_GPIO_LED_POWER_GREEN 2
31#define WNDR3700_GPIO_LED_WPS_GREEN 4
32#define WNDR3700_GPIO_LED_WAN_GREEN 6
33
34#define WNDR3700_GPIO_BTN_WPS 3
35#define WNDR3700_GPIO_BTN_RESET 8
36#define WNDR3700_GPIO_BTN_WIFI 11
37
38#define WNDR3700_GPIO_RTL8366_SDA 5
39#define WNDR3700_GPIO_RTL8366_SCK 7
40
41#define WNDR3700_BUTTONS_POLL_INTERVAL 20
42
43#define WNDR3700_WMAC0_MAC_OFFSET 0
44#define WNDR3700_WMAC1_MAC_OFFSET 0xc
45#define WNDR3700_CALDATA0_OFFSET 0x1000
46#define WNDR3700_CALDATA1_OFFSET 0x5000
47
48#ifdef CONFIG_MTD_PARTITIONS
49static struct mtd_partition wndr3700_partitions[] = {
50    {
51        .name = "uboot",
52        .offset = 0,
53        .size = 0x050000,
54        .mask_flags = MTD_WRITEABLE,
55    } , {
56        .name = "env",
57        .offset = 0x050000,
58        .size = 0x020000,
59        .mask_flags = MTD_WRITEABLE,
60    } , {
61        .name = "rootfs",
62        .offset = 0x070000,
63        .size = 0x720000,
64    } , {
65        .name = "config",
66        .offset = 0x790000,
67        .size = 0x010000,
68        .mask_flags = MTD_WRITEABLE,
69    } , {
70        .name = "config_bak",
71        .offset = 0x7a0000,
72        .size = 0x010000,
73        .mask_flags = MTD_WRITEABLE,
74    } , {
75        .name = "pot",
76        .offset = 0x7b0000,
77        .size = 0x010000,
78        .mask_flags = MTD_WRITEABLE,
79    } , {
80        .name = "traffic_meter",
81        .offset = 0x7c0000,
82        .size = 0x010000,
83        .mask_flags = MTD_WRITEABLE,
84    } , {
85        .name = "language",
86        .offset = 0x7d0000,
87        .size = 0x020000,
88        .mask_flags = MTD_WRITEABLE,
89    } , {
90        .name = "caldata",
91        .offset = 0x7f0000,
92        .size = 0x010000,
93        .mask_flags = MTD_WRITEABLE,
94    }
95};
96#endif /* CONFIG_MTD_PARTITIONS */
97
98static struct flash_platform_data wndr3700_flash_data = {
99#ifdef CONFIG_MTD_PARTITIONS
100        .parts = wndr3700_partitions,
101        .nr_parts = ARRAY_SIZE(wndr3700_partitions),
102#endif
103};
104
105static struct gpio_led wndr3700_leds_gpio[] __initdata = {
106    {
107        .name = "wndr3700:green:power",
108        .gpio = WNDR3700_GPIO_LED_POWER_GREEN,
109        .active_low = 1,
110    }, {
111        .name = "wndr3700:orange:power",
112        .gpio = WNDR3700_GPIO_LED_POWER_ORANGE,
113        .active_low = 1,
114    }, {
115        .name = "wndr3700:green:wps",
116        .gpio = WNDR3700_GPIO_LED_WPS_GREEN,
117        .active_low = 1,
118    }, {
119        .name = "wndr3700:orange:wps",
120        .gpio = WNDR3700_GPIO_LED_WPS_ORANGE,
121        .active_low = 1,
122    }, {
123        .name = "wndr3700:green:wan",
124        .gpio = WNDR3700_GPIO_LED_WAN_GREEN,
125        .active_low = 1,
126    }
127};
128
129static struct gpio_button wndr3700_gpio_buttons[] __initdata = {
130    {
131        .desc = "reset",
132        .type = EV_KEY,
133        .code = BTN_0,
134        .threshold = 3,
135        .gpio = WNDR3700_GPIO_BTN_RESET,
136        .active_low = 1,
137    }, {
138        .desc = "wps",
139        .type = EV_KEY,
140        .code = BTN_1,
141        .threshold = 3,
142        .gpio = WNDR3700_GPIO_BTN_WPS,
143        .active_low = 1,
144    } , {
145        .desc = "wifi",
146        .type = EV_KEY,
147        .code = BTN_2,
148        .threshold = 3,
149        .gpio = WNDR3700_GPIO_BTN_WIFI,
150        .active_low = 1,
151    }
152};
153
154static struct rtl8366s_platform_data wndr3700_rtl8366s_data = {
155    .gpio_sda = WNDR3700_GPIO_RTL8366_SDA,
156    .gpio_sck = WNDR3700_GPIO_RTL8366_SCK,
157};
158
159static struct platform_device wndr3700_rtl8366s_device = {
160    .name = RTL8366S_DRIVER_NAME,
161    .id = -1,
162    .dev = {
163        .platform_data = &wndr3700_rtl8366s_data,
164    }
165};
166
167static void __init wndr3700_setup(void)
168{
169    u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
170
171    ar71xx_set_mac_base(art);
172
173    ar71xx_eth0_pll_data.pll_1000 = 0x11110000;
174    ar71xx_eth0_data.mii_bus_dev = &wndr3700_rtl8366s_device.dev;
175    ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
176    ar71xx_eth0_data.speed = SPEED_1000;
177    ar71xx_eth0_data.duplex = DUPLEX_FULL;
178
179    ar71xx_eth1_pll_data.pll_1000 = 0x11110000;
180    ar71xx_eth1_data.mii_bus_dev = &wndr3700_rtl8366s_device.dev;
181    ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
182    ar71xx_eth1_data.phy_mask = 0x10;
183
184    ar71xx_add_device_eth(0);
185    ar71xx_add_device_eth(1);
186
187    ar71xx_add_device_usb();
188
189    ar71xx_add_device_m25p80(&wndr3700_flash_data);
190
191        ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(wndr3700_leds_gpio),
192                    wndr3700_leds_gpio);
193
194    ar71xx_add_device_gpio_buttons(-1, WNDR3700_BUTTONS_POLL_INTERVAL,
195                      ARRAY_SIZE(wndr3700_gpio_buttons),
196                      wndr3700_gpio_buttons);
197
198    platform_device_register(&wndr3700_rtl8366s_device);
199    platform_device_register_simple("wndr3700-led-usb", -1, NULL, 0);
200
201    ap94_pci_setup_wmac_led_pin(0, 5);
202    ap94_pci_setup_wmac_led_pin(1, 5);
203
204    /* 2.4 GHz uses the first fixed antenna group (1, 0, 1, 0) */
205    ap94_pci_setup_wmac_gpio(0, (0xf << 6), (0xa << 6));
206
207    /* 5 GHz uses the second fixed antenna group (0, 1, 1, 0) */
208    ap94_pci_setup_wmac_gpio(1, (0xf << 6), (0x6 << 6));
209
210    ap94_pci_init(art + WNDR3700_CALDATA0_OFFSET,
211              art + WNDR3700_WMAC0_MAC_OFFSET,
212              art + WNDR3700_CALDATA1_OFFSET,
213              art + WNDR3700_WMAC1_MAC_OFFSET);
214}
215
216MIPS_MACHINE(AR71XX_MACH_WNDR3700, "WNDR3700", "NETGEAR WNDR3700",
217         wndr3700_setup);
218

Archive Download this file



interactive