ARRAY_SIZE(ar71xx_generic_spi_info));
ar71xx_add_device_mdio(0xffe0ffff);
- ar71xx_add_device_eth(0, PHY_INTERFACE_MODE_MII, 0x000f0000);
- ar71xx_add_device_eth(1, PHY_INTERFACE_MODE_RMII, 0x00100000);
+
+ ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+ ar71xx_eth0_data.phy_mask = 0x000f0000;
+
+ ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII;
+ ar71xx_eth1_data.phy_mask = 0x00100000;
+
+ ar71xx_add_device_eth(0);
+ ar71xx_add_device_eth(1);
ar71xx_add_device_usb();
rb4xx_add_device_spi();
ar71xx_add_device_mdio(0xfffffffe);
- ar71xx_add_device_eth(0, PHY_INTERFACE_MODE_MII, 0x00000001);
+
+ ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+ ar71xx_eth0_data.phy_mask = 0x00000001;
+
+ ar71xx_add_device_eth(0);
ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(rb4xx_leds_gpio),
rb4xx_leds_gpio);
rb433_add_device_spi();
ar71xx_add_device_mdio(0xffffffec);
- ar71xx_add_device_eth(1, PHY_INTERFACE_MODE_RMII, 0x00000010);
- ar71xx_add_device_eth(0, PHY_INTERFACE_MODE_MII, 0x00000003);
+
+ ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+ ar71xx_eth0_data.phy_mask = 0x00000003;
+
+ ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII;
+ ar71xx_eth1_data.phy_mask = 0x00000010;
+
+ ar71xx_add_device_eth(1);
+ ar71xx_add_device_eth(0);
ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(rb4xx_leds_gpio),
rb4xx_leds_gpio);
rb4xx_add_device_spi();
ar71xx_add_device_mdio(0xffffffe0);
- ar71xx_add_device_eth(1, PHY_INTERFACE_MODE_RMII, 0x00000010);
- ar71xx_add_device_eth(0, PHY_INTERFACE_MODE_MII, 0x0000000f);
+
+ ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+ ar71xx_eth0_data.phy_mask = 0x0000000f;
+
+ ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII;
+ ar71xx_eth1_data.phy_mask = 0x00000010;
+
+ ar71xx_add_device_eth(1);
+ ar71xx_add_device_eth(0);
ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(rb4xx_leds_gpio),
rb4xx_leds_gpio);
}
MIPS_MACHINE(MACH_AR71XX_RB_450, "MikroTik RouterBOARD 450", rb450_setup);
+
+static void __init rb493_setup(void)
+{
+ rb4xx_add_device_spi();
+
+ ar71xx_add_device_mdio(0x3fffff00);
+
+#if 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_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII;
+ ar71xx_eth1_data.phy_mask = 0x00000001;
+
+ ar71xx_add_device_eth(0);
+ ar71xx_add_device_eth(1);
+#endif
+
+ ar71xx_add_device_leds_gpio(-1, ARRAY_SIZE(rb4xx_leds_gpio),
+ rb4xx_leds_gpio);
+
+ ar71xx_add_device_gpio_buttons(-1, RB4XX_BUTTONS_POLL_INTERVAL,
+ ARRAY_SIZE(rb4xx_gpio_buttons),
+ rb4xx_gpio_buttons);
+
+ platform_device_register(&rb4xx_nand_device);
+}
+
+MIPS_MACHINE(MACH_AR71XX_RB_493, "MikroTik RouterBOARD 493/AH", rb493_setup);
+
ar71xx_add_device_spi(NULL, wp543_spi_info, ARRAY_SIZE(wp543_spi_info));
ar71xx_add_device_mdio(0xfffffff7);
- ar71xx_add_device_eth(0, PHY_INTERFACE_MODE_MII, 0x00000008);
+
+ ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+ ar71xx_eth0_data.phy_mask = 0x00000008;
+ ar71xx_add_device_eth(0);
ar71xx_add_device_usb();
},
};
-static struct ag71xx_platform_data ar71xx_eth0_data = {
+struct ag71xx_platform_data ar71xx_eth0_data = {
.reset_bit = RESET_MODULE_GE0_MAC,
.flush_reg = DDR_REG_FLUSH_GE0,
};
},
};
-static struct ag71xx_platform_data ar71xx_eth1_data = {
+struct ag71xx_platform_data ar71xx_eth1_data = {
.reset_bit = RESET_MODULE_GE1_MAC,
.flush_reg = DDR_REG_FLUSH_GE1,
};
};
static int ar71xx_eth_instance __initdata;
-void __init ar71xx_add_device_eth(unsigned int id, phy_interface_t phy_if_mode,
- u32 phy_mask)
+void __init ar71xx_add_device_eth(unsigned int id)
{
struct platform_device *pdev;
switch (id) {
case 0:
- switch (phy_if_mode) {
+ switch (ar71xx_eth0_data.phy_if_mode) {
case PHY_INTERFACE_MODE_MII:
ar71xx_eth0_data.mii_if = MII0_CTRL_IF_MII;
break;
}
memcpy(ar71xx_eth0_data.mac_addr, ar71xx_mac_base, ETH_ALEN);
ar71xx_eth0_data.mac_addr[5] += ar71xx_eth_instance;
- ar71xx_eth0_data.phy_if_mode = phy_if_mode;
- ar71xx_eth0_data.phy_mask = phy_mask;
pdev = &ar71xx_eth0_device;
break;
case 1:
- switch (phy_if_mode) {
+ switch (ar71xx_eth1_data.phy_if_mode) {
case PHY_INTERFACE_MODE_RMII:
ar71xx_eth1_data.mii_if = MII1_CTRL_IF_RMII;
break;
}
memcpy(ar71xx_eth1_data.mac_addr, ar71xx_mac_base, ETH_ALEN);
ar71xx_eth1_data.mac_addr[5] += ar71xx_eth_instance;
- ar71xx_eth1_data.phy_if_mode = phy_if_mode;
- ar71xx_eth1_data.phy_mask = phy_mask;
pdev = &ar71xx_eth1_device;
break;
default:
#define ETH_FCS_LEN 4
#define AG71XX_DRV_NAME "ag71xx"
-#define AG71XX_DRV_VERSION "0.4.1"
+#define AG71XX_DRV_VERSION "0.4.2"
#define AG71XX_NAPI_TX 1
if (ag->phy_dev) {
phy_start(ag->phy_dev);
} else {
- ag->duplex = DUPLEX_FULL;
- ag->speed = SPEED_100;
+ struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
+
+ ag->duplex = pdata->duplex;
+ ag->speed = pdata->speed;
ag->link = 1;
ag71xx_phy_link_update(ag);
}
int phy_count = 0;
int phy_addr;
- if (ag->mii_bus) {
- /* TODO: use mutex of the mdio bus */
+ if (ag->mii_bus && pdata->phy_mask) {
+ /* TODO: use mutex of the mdio bus? */
for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
if (!(pdata->phy_mask & (1 << phy_addr)))
continue;
}
switch (phy_count) {
- case 0:
- printk(KERN_ERR "%s: no PHY found\n", dev->name);
- return -ENODEV;
case 1:
ag->phy_dev = phy_connect(dev, phydev->dev.bus_id,
&ag71xx_phy_link_adjust, 0, pdata->phy_if_mode);
ag->speed = 0;
ag->duplex = -1;
break;
+
default:
ag->phy_dev = NULL;
- printk(KERN_DEBUG "%s: connected to multiple PHYs (%d)\n",
+ printk(KERN_DEBUG "%s: connected to %d PHYs\n",
dev->name, phy_count);
break;
}
#include <linux/gpio_buttons.h>
struct ag71xx_platform_data {
+ phy_interface_t phy_if_mode;
+ u32 phy_mask;
+ int speed;
+ int duplex;
u32 reset_bit;
u32 flush_reg;
- u32 phy_mask;
- phy_interface_t phy_if_mode;
u32 mii_if;
u8 mac_addr[ETH_ALEN];
};
extern void ar71xx_set_mac_base(unsigned char *mac) __init;
extern void ar71xx_parse_mac_addr(char *mac_str) __init;
-extern void ar71xx_add_device_eth(unsigned int id, phy_interface_t phy_if_mode,
- u32 phy_mask) __init;
+
+extern struct ag71xx_platform_data ar71xx_eth0_data;
+extern struct ag71xx_platform_data ar71xx_eth1_data;
+extern void ar71xx_add_device_eth(unsigned int id) __init;
extern void ar71xx_add_device_mdio(u32 phy_mask) __init;
--- a/include/asm-mips/bootinfo.h
+++ b/include/asm-mips/bootinfo.h
-@@ -79,6 +79,15 @@
+@@ -79,6 +79,16 @@
#define MACH_LASAT_200 1 /* Masquerade PRO/SP200 */
/*
+ */
+#define MACH_AR71XX_GENERIC 0
+#define MACH_AR71XX_WP543 1 /* Compex WP543 */
-+#define MACH_AR71XX_RB_411 2 /* MikroTik RouterBOARD 411 */
++#define MACH_AR71XX_RB_411 2 /* MikroTik RouterBOARD 411/411A/411AH */
+#define MACH_AR71XX_RB_433 3 /* MikroTik RouterBOARD 433/433AH */
+#define MACH_AR71XX_RB_450 4 /* MikroTik RouterBOARD 450 */
++#define MACH_AR71XX_RB_493 5 /* Mikrotik RouterBOARD 493/493AH */
+
+/*
* Valid machtype for group NEC EMMA2RH
config BASLER_EXCITE
bool "Basler eXcite smart camera"
select CEVT_R4K
+@@ -687,6 +705,7 @@
+
+ endchoice
+
++source "arch/mips/ar71xx/Kconfig"
+ source "arch/mips/au1000/Kconfig"
+ source "arch/mips/basler/excite/Kconfig"
+ source "arch/mips/jazz/Kconfig"
libs-$(CONFIG_SIBYTE_CFE) += arch/mips/sibyte/cfe/
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
-@@ -873,6 +873,9 @@
+@@ -874,6 +874,9 @@
config MIPS_DISABLE_OBSOLETE_IDE
bool
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
-@@ -705,6 +705,7 @@
-
- endchoice
-
-+source "arch/mips/ar71xx/Kconfig"
- source "arch/mips/au1000/Kconfig"
- source "arch/mips/basler/excite/Kconfig"
- source "arch/mips/jazz/Kconfig"
-@@ -879,6 +880,9 @@
+@@ -880,6 +880,9 @@
config SYNC_R4K
bool