X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=blobdiff_plain;f=target%2Flinux%2Far71xx%2Ffiles%2Farch%2Fmips%2Far71xx%2Fmach-ubnt.c;h=1cfcec38e6ef1c1ed8469c4aba5887d0ef952095;hp=9b70f8ddc54848f225c65b7ebc47f53a891efbd9;hb=c1e8a5560a250f85411438381a27b98af7c9c3d4;hpb=bc82a407ebf1b8d436ef067d2aebfe2dc15f36c5 diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-ubnt.c b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-ubnt.c index 9b70f8ddc5..1cfcec38e6 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-ubnt.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-ubnt.c @@ -10,18 +10,16 @@ * by the Free Software Foundation. */ -#include -#include -#include -#include -#include -#include - -#include #include -#include +#include "machtype.h" #include "devices.h" +#include "dev-m25p80.h" +#include "dev-ap91-pci.h" +#include "dev-gpio-buttons.h" +#include "dev-pb42-pci.h" +#include "dev-leds-gpio.h" +#include "dev-usb.h" #define UBNT_RS_GPIO_LED_RF 2 #define UBNT_RS_GPIO_SW4 8 @@ -40,32 +38,8 @@ #define UBNT_M_GPIO_LED_L4 7 #define UBNT_M_GPIO_BTN_RESET 12 -#define UBNT_BUTTONS_POLL_INTERVAL 20 - -static struct spi_board_info ubnt_spi_info[] = { - { - .bus_num = 0, - .chip_select = 0, - .max_speed_hz = 25000000, - .modalias = "m25p80", - } -}; - -static struct ar71xx_pci_irq ubnt_pci_irqs[] __initdata = { - { - .slot = 0, - .pin = 1, - .irq = AR71XX_PCI_IRQ_DEV0, - }, { - .slot = 1, - .pin = 1, - .irq = AR71XX_PCI_IRQ_DEV1, - }, { - .slot = 2, - .pin = 1, - .irq = AR71XX_PCI_IRQ_DEV2, - } -}; +#define UBNT_KEYS_POLL_INTERVAL 20 /* msecs */ +#define UBNT_KEYS_DEBOUNCE_INTERVAL (3 * UBNT_KEYS_POLL_INTERVAL) static struct gpio_led ubnt_rs_leds_gpio[] __initdata = { { @@ -127,23 +101,23 @@ static struct gpio_led ubnt_m_leds_gpio[] __initdata = { } }; -static struct gpio_button ubnt_gpio_buttons[] __initdata = { +static struct gpio_keys_button ubnt_gpio_keys[] __initdata = { { .desc = "sw4", .type = EV_KEY, - .code = BTN_0, - .threshold = 5, + .code = KEY_RESTART, + .debounce_interval = UBNT_KEYS_DEBOUNCE_INTERVAL, .gpio = UBNT_RS_GPIO_SW4, .active_low = 1, } }; -static struct gpio_button ubnt_m_gpio_buttons[] __initdata = { +static struct gpio_keys_button ubnt_m_gpio_keys[] __initdata = { { .desc = "reset", .type = EV_KEY, - .code = BTN_0, - .threshold = 5, + .code = KEY_RESTART, + .debounce_interval = UBNT_KEYS_DEBOUNCE_INTERVAL, .gpio = UBNT_M_GPIO_BTN_RESET, .active_low = 1, } @@ -151,34 +125,41 @@ static struct gpio_button ubnt_m_gpio_buttons[] __initdata = { static void __init ubnt_generic_setup(void) { - ar71xx_add_device_spi(NULL, ubnt_spi_info, - ARRAY_SIZE(ubnt_spi_info)); + ar71xx_add_device_m25p80(NULL); + + ar71xx_register_gpio_keys_polled(-1, UBNT_KEYS_POLL_INTERVAL, + ARRAY_SIZE(ubnt_gpio_keys), + ubnt_gpio_keys); - ar71xx_add_device_gpio_buttons(-1, UBNT_BUTTONS_POLL_INTERVAL, - ARRAY_SIZE(ubnt_gpio_buttons), - ubnt_gpio_buttons); + pb42_pci_init(); +} - ar71xx_pci_init(ARRAY_SIZE(ubnt_pci_irqs), ubnt_pci_irqs); +/* + * There is Secondary MAC address duplicate problem with some UBNT HW batches. + * Do not increase Secondary MAC address by 1 but do workaround + * with 'Locally Administrated' bit. + */ +static void __init ubnt_init_secondary_mac(unsigned char *mac_base) +{ + ar71xx_init_mac(ar71xx_eth1_data.mac_addr, mac_base, 0); + ar71xx_eth1_data.mac_addr[0] |= 0x02; } #define UBNT_RS_WAN_PHYMASK (1 << 20) #define UBNT_RS_LAN_PHYMASK ((1 << 16) | (1 << 17) | (1 << 18) | (1 << 19)) -#define UBNT_RSPRO_WAN_PHYMASK (1 << 4) -#define UBNT_RSPRO_LAN_PHYMASK ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3)) - static void __init ubnt_rs_setup(void) { ubnt_generic_setup(); ar71xx_add_device_mdio(~(UBNT_RS_WAN_PHYMASK | UBNT_RS_LAN_PHYMASK)); + ar71xx_init_mac(ar71xx_eth0_data.mac_addr, ar71xx_mac_base, 0); ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII; ar71xx_eth0_data.phy_mask = UBNT_RS_WAN_PHYMASK; + ubnt_init_secondary_mac(ar71xx_mac_base); ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII; - ar71xx_eth1_data.phy_mask = UBNT_RS_LAN_PHYMASK; - ar71xx_eth1_data.speed = SPEED_100; ar71xx_eth1_data.duplex = DUPLEX_FULL; @@ -191,20 +172,26 @@ static void __init ubnt_rs_setup(void) ubnt_rs_leds_gpio); } -MIPS_MACHINE(AR71XX_MACH_UBNT_RS, "Ubiquiti RouterStation", ubnt_rs_setup); +MIPS_MACHINE(AR71XX_MACH_UBNT_RS, "UBNT-RS", "Ubiquiti RouterStation", + ubnt_rs_setup); + +#define UBNT_RSPRO_WAN_PHYMASK (1 << 4) +#define UBNT_RSPRO_LAN_PHYMASK ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3)) static void __init ubnt_rspro_setup(void) { ubnt_generic_setup(); - ar71xx_add_device_mdio(~(UBNT_RSPRO_WAN_PHYMASK | UBNT_RSPRO_LAN_PHYMASK)); + ar71xx_add_device_mdio(~(UBNT_RSPRO_WAN_PHYMASK | + UBNT_RSPRO_LAN_PHYMASK)); + ar71xx_init_mac(ar71xx_eth0_data.mac_addr, ar71xx_mac_base, 0); ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII; ar71xx_eth0_data.phy_mask = UBNT_RSPRO_WAN_PHYMASK; + ubnt_init_secondary_mac(ar71xx_mac_base); ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII; ar71xx_eth1_data.phy_mask = UBNT_RSPRO_LAN_PHYMASK; - ar71xx_eth1_data.speed = SPEED_1000; ar71xx_eth1_data.duplex = DUPLEX_FULL; @@ -217,7 +204,7 @@ static void __init ubnt_rspro_setup(void) ubnt_rs_leds_gpio); } -MIPS_MACHINE(AR71XX_MACH_UBNT_RSPRO, "Ubiquiti RouterStation Pro", +MIPS_MACHINE(AR71XX_MACH_UBNT_RSPRO, "UBNT-RSPRO", "Ubiquiti RouterStation Pro", ubnt_rspro_setup); static void __init ubnt_lsx_setup(void) @@ -225,7 +212,7 @@ static void __init ubnt_lsx_setup(void) ubnt_generic_setup(); } -MIPS_MACHINE(AR71XX_MACH_UBNT_LSX, "Ubiquiti LSX", ubnt_lsx_setup); +MIPS_MACHINE(AR71XX_MACH_UBNT_LSX, "UBNT-LSX", "Ubiquiti LSX", ubnt_lsx_setup); #define UBNT_LSSR71_PHY_MASK (1 << 1) @@ -235,6 +222,7 @@ static void __init ubnt_lssr71_setup(void) ar71xx_add_device_mdio(~UBNT_LSSR71_PHY_MASK); + ar71xx_init_mac(ar71xx_eth0_data.mac_addr, ar71xx_mac_base, 0); ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII; ar71xx_eth0_data.phy_mask = UBNT_LSSR71_PHY_MASK; @@ -244,68 +232,38 @@ static void __init ubnt_lssr71_setup(void) ubnt_ls_sr71_leds_gpio); } -MIPS_MACHINE(AR71XX_MACH_UBNT_LSSR71, "Ubiquiti LS-SR71", ubnt_lssr71_setup); - -#ifdef CONFIG_PCI -static struct ar71xx_pci_irq ubnt_m_pci_irqs[] __initdata = { - { - .slot = 0, - .pin = 1, - .irq = AR71XX_PCI_IRQ_DEV0, - } -}; - -static struct ath9k_platform_data ubnt_m_wmac_data; - -static int ubmnt_m_pci_plat_dev_init(struct pci_dev *dev) -{ - dev->dev.platform_data = &ubnt_m_wmac_data; - return 0; -} - -static void __init ubnt_m_pci_init(void) -{ - u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); - - memcpy(ubnt_m_wmac_data.eeprom_data, ee, - sizeof(ubnt_m_wmac_data.eeprom_data)); - - ar71xx_pci_plat_dev_init = ubmnt_m_pci_plat_dev_init; - - ar71xx_pci_init(ARRAY_SIZE(ubnt_m_pci_irqs), - ubnt_m_pci_irqs); -} -#else -static inline void ubnt_m_pci_init(void) { }; -#endif /* CONFIG_PCI */ +MIPS_MACHINE(AR71XX_MACH_UBNT_LSSR71, "UBNT-LS-SR71", "Ubiquiti LS-SR71", + ubnt_lssr71_setup); static void __init ubnt_m_setup(void) { - u8 *mac = (u8 *) KSEG1ADDR(0x1fff0000); - - ar71xx_set_mac_base(mac); + u8 *mac1 = (u8 *) KSEG1ADDR(0x1fff0000); + u8 *mac2 = (u8 *) KSEG1ADDR(0x1fff0000 + ETH_ALEN); + u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); - ar71xx_add_device_spi(NULL, ubnt_spi_info, - ARRAY_SIZE(ubnt_spi_info)); + ar71xx_add_device_m25p80(NULL); ar71xx_add_device_mdio(~0); + ar71xx_init_mac(ar71xx_eth0_data.mac_addr, mac1, 0); + ar71xx_init_mac(ar71xx_eth1_data.mac_addr, mac2, 0); ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII; - ar71xx_eth0_data.phy_mask = 0; - ar71xx_eth0_data.speed = SPEED_100; ar71xx_eth0_data.duplex = DUPLEX_FULL; + ar71xx_eth0_data.fifo_cfg1 = 0x0010ffff; + ar71xx_eth0_data.fifo_cfg2 = 0x015500aa; + ar71xx_eth0_data.fifo_cfg3 = 0x01f00140; ar71xx_add_device_eth(0); - ubnt_m_pci_init(); + ap91_pci_init(ee, NULL); ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(ubnt_m_leds_gpio), ubnt_m_leds_gpio); - ar71xx_add_device_gpio_buttons(-1, UBNT_BUTTONS_POLL_INTERVAL, - ARRAY_SIZE(ubnt_m_gpio_buttons), - ubnt_m_gpio_buttons); + ar71xx_register_gpio_keys_polled(-1, UBNT_KEYS_POLL_INTERVAL, + ARRAY_SIZE(ubnt_m_gpio_keys), + ubnt_m_gpio_keys); } static void __init ubnt_rocket_m_setup(void) @@ -314,8 +272,10 @@ static void __init ubnt_rocket_m_setup(void) ar71xx_add_device_usb(); } -MIPS_MACHINE(AR71XX_MACH_UBNT_BULLET_M, "Ubiquiti Bullet M", ubnt_m_setup); -MIPS_MACHINE(AR71XX_MACH_UBNT_ROCKET_M, "Ubiquiti Rocket M", ubnt_rocket_m_setup); +MIPS_MACHINE(AR71XX_MACH_UBNT_BULLET_M, "UBNT-BM", "Ubiquiti Bullet M", + ubnt_m_setup); +MIPS_MACHINE(AR71XX_MACH_UBNT_ROCKET_M, "UBNT-RM", "Ubiquiti Rocket M", + ubnt_rocket_m_setup); /* TODO detect the second ethernet port and use one init function for all Ubiquiti MIMO series products */ @@ -323,13 +283,53 @@ static void __init ubnt_nano_m_setup(void) { ubnt_m_setup(); + ar71xx_eth1_data.has_ar7240_switch = 1; ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII; - ar71xx_eth1_data.phy_mask = 0; - ar71xx_eth1_data.speed = SPEED_1000; ar71xx_eth1_data.duplex = DUPLEX_FULL; + ar71xx_eth1_data.fifo_cfg1 = 0x0010ffff; + ar71xx_eth1_data.fifo_cfg2 = 0x015500aa; + ar71xx_eth1_data.fifo_cfg3 = 0x01f00140; ar71xx_add_device_eth(1); } -MIPS_MACHINE(AR71XX_MACH_UBNT_NANO_M, "Ubiquiti Nanostation M", ubnt_nano_m_setup); +MIPS_MACHINE(AR71XX_MACH_UBNT_NANO_M, "UBNT-NM", "Ubiquiti Nanostation M", + ubnt_nano_m_setup); + +static struct gpio_led ubnt_unifi_leds_gpio[] __initdata = { + { + .name = "ubnt:orange:dome", + .gpio = 1, + .active_low = 0, + }, { + .name = "ubnt:green:dome", + .gpio = 0, + .active_low = 0, + } +}; + +static void __init ubnt_unifi_setup(void) +{ + u8 *mac = (u8 *) KSEG1ADDR(0x1fff0000); + u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); + + ar71xx_add_device_m25p80(NULL); + + ar71xx_add_device_mdio(~0); + + ar71xx_init_mac(ar71xx_eth0_data.mac_addr, mac, 0); + ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII; + ar71xx_eth0_data.speed = SPEED_100; + ar71xx_eth0_data.duplex = DUPLEX_FULL; + + ar71xx_add_device_eth(0); + + ap91_pci_init(ee, NULL); + + ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(ubnt_unifi_leds_gpio), + ubnt_unifi_leds_gpio); +} + +MIPS_MACHINE(AR71XX_MACH_UBNT_UNIFI, "UBNT-XM", "Ubiquiti UniFi", + ubnt_unifi_setup);