ar71xx: in-flash macs and eeprom for mach-eap7660d
authorGabor Juhos <juhosg@openwrt.org>
Thu, 15 Jul 2010 07:36:52 +0000 (07:36 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Thu, 15 Jul 2010 07:36:52 +0000 (07:36 +0000)
This adds in-flash mac-addresses and calibration data for the Senao
EAP7660D board.

Signed-off-by: Daniel Golle <daniel.golle@gmail.com>
SVN-Revision: 22187

target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig
target/linux/ar71xx/files/arch/mips/ar71xx/mach-eap7660d.c
target/linux/ar71xx/files/include/linux/ath5k_platform.h [new file with mode: 0644]

index 95c65bc88f4215e46ec8e3acae4c4661d1485405..6162f800c4ced5e688641f8735f8cfe0296bbe86 100644 (file)
@@ -226,7 +226,6 @@ config AR71XX_MACH_UBNT
 config AR71XX_MACH_EAP7660D
        bool "Senao EAP7660D support"
        select AR71XX_DEV_M25P80
-       select AR71XX_DEV_PB42_PCI if PCI
        select AR71XX_DEV_GPIO_BUTTONS
        select AR71XX_DEV_LEDS_GPIO
        default n
index f7e72563ff3b82ee2395d86be27c6313525562b6..6da318e2d1dce9a434421c9075af7607d65fc55f 100644 (file)
  *  by the Free Software Foundation.
  */
 
+#include <linux/pci.h>
+#include <linux/ath5k_platform.h>
+#include <linux/delay.h>
 #include <asm/mach-ar71xx/ar71xx.h>
+#include <asm/mach-ar71xx/pci.h>
 
 #include "machtype.h"
 #include "devices.h"
 #include "dev-gpio-buttons.h"
 #include "dev-leds-gpio.h"
-#include "dev-pb42-pci.h"
 #include "dev-m25p80.h"
 
 #define EAP7660D_BUTTONS_POLL_INTERVAL 20
 #define EAP7660D_GPIO_SW1              3
 #define EAP7660D_GPIO_SW3              8
 #define EAP7660D_PHYMASK               BIT(20)
+#define EAP7660D_BOARDCONFIG           0x1F7F0000
+#define EAP7660D_GBIC_MAC_OFFSET       0x1000
+#define EAP7660D_WMAC0_MAC_OFFSET      0x1010
+#define EAP7660D_WMAC1_MAC_OFFSET      0x1016
+#define EAP7660D_WMAC0_CALDATA_OFFSET  0x2000
+#define EAP7660D_WMAC1_CALDATA_OFFSET  0x3000
+
+static struct ath5k_platform_data eap7660d_wmac0_data;
+static struct ath5k_platform_data eap7660d_wmac1_data;
+static char eap7660d_wmac0_mac[6];
+static char eap7660d_wmac1_mac[6];
+static u16 eap7660d_wmac0_eeprom[ATH5K_PLAT_EEP_MAX_WORDS];
+static u16 eap7660d_wmac1_eeprom[ATH5K_PLAT_EEP_MAX_WORDS];
+
+static struct ar71xx_pci_irq eap7660d_pci_irqs[] __initdata = {
+        {
+                .slot   = 0,
+                .pin    = 1,
+                .irq    = AR71XX_PCI_IRQ_DEV0,
+        }, {
+                .slot   = 1,
+                .pin    = 1,
+                .irq    = AR71XX_PCI_IRQ_DEV1,
+        }
+};
+
+static int eap7660d_pci_plat_dev_init(struct pci_dev *dev)
+{
+       switch(PCI_SLOT(dev->devfn)) {
+       case 17:
+               dev->dev.platform_data = &eap7660d_wmac0_data;
+               break;
+
+       case 18:
+               dev->dev.platform_data = &eap7660d_wmac1_data;
+               break;
+       }
+
+       return 0;
+}
+
+void __init eap7660d_pci_init(u8 *cal_data0, u8 *mac_addr0,
+                         u8 *cal_data1, u8 *mac_addr1)
+{
+       if (cal_data0 && *cal_data0 == 0xa55a) {
+               memcpy(eap7660d_wmac0_eeprom, cal_data0,
+                       ATH5K_PLAT_EEP_MAX_WORDS);
+               eap7660d_wmac0_data.eeprom_data = eap7660d_wmac0_eeprom;
+       }
+
+       if (cal_data1 && *cal_data1 == 0xa55a) {
+               memcpy(eap7660d_wmac1_eeprom, cal_data1,
+                       ATH5K_PLAT_EEP_MAX_WORDS);
+               eap7660d_wmac1_data.eeprom_data = eap7660d_wmac1_eeprom;
+       }
+
+       if (mac_addr0) {
+               memcpy(eap7660d_wmac0_mac, mac_addr0, sizeof(eap7660d_wmac0_mac));
+               eap7660d_wmac0_data.macaddr = eap7660d_wmac0_mac;
+       }
+
+       if (mac_addr1) {
+               memcpy(eap7660d_wmac1_mac, mac_addr1, sizeof(eap7660d_wmac1_mac));
+               eap7660d_wmac1_data.macaddr = eap7660d_wmac1_mac;
+       }
+
+       ar71xx_pci_plat_dev_init = eap7660d_pci_plat_dev_init;
+       ar71xx_pci_init(ARRAY_SIZE(eap7660d_pci_irqs), eap7660d_pci_irqs);
+}
 
 static struct gpio_led eap7660d_leds_gpio[] __initdata = {
        {
@@ -72,6 +144,8 @@ static struct gpio_button eap7660d_gpio_buttons[] __initdata = {
 
 static void __init eap7660d_setup(void)
 {
+       u8 *boardconfig = (u8 *) KSEG1ADDR(EAP7660D_BOARDCONFIG);
+       ar71xx_set_mac_base(boardconfig + EAP7660D_GBIC_MAC_OFFSET);
        ar71xx_add_device_mdio(~EAP7660D_PHYMASK);
        ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
        ar71xx_eth0_data.phy_mask = EAP7660D_PHYMASK;
@@ -82,7 +156,10 @@ static void __init eap7660d_setup(void)
        ar71xx_add_device_gpio_buttons(-1, EAP7660D_BUTTONS_POLL_INTERVAL,
                                        ARRAY_SIZE(eap7660d_gpio_buttons),
                                        eap7660d_gpio_buttons);
-       pb42_pci_init();
+       eap7660d_pci_init(boardconfig + EAP7660D_WMAC0_CALDATA_OFFSET,
+                       boardconfig + EAP7660D_WMAC0_MAC_OFFSET,
+                       boardconfig + EAP7660D_WMAC1_CALDATA_OFFSET,
+                       boardconfig + EAP7660D_WMAC1_MAC_OFFSET);
 };
 
 MIPS_MACHINE(AR71XX_MACH_EAP7660D, "EAP7660D", "Senao EAP7660D",
diff --git a/target/linux/ar71xx/files/include/linux/ath5k_platform.h b/target/linux/ar71xx/files/include/linux/ath5k_platform.h
new file mode 100644 (file)
index 0000000..ec85224
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2008 Atheros Communications Inc.
+ * Copyright (c) 2009 Gabor Juhos <juhosg@openwrt.org>
+ * Copyright (c) 2009 Imre Kaloz <kaloz@openwrt.org>
+ * Copyright (c) 2010 Daniel Golle <daniel.golle@gmail.com>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _LINUX_ATH5K_PLATFORM_H
+#define _LINUX_ATH5K_PLATFORM_H
+
+#define ATH5K_PLAT_EEP_MAX_WORDS       2048
+
+struct ath5k_platform_data {
+       u16 *eeprom_data;
+       u8 *macaddr;
+};
+
+#endif /* _LINUX_ATH5K_PLATFORM_H */