| From 5ed5b5e9614fa5b02da699ab565af76c7e63d64d Mon Sep 17 00:00:00 2001 |
| From: Jonas Gorski <jogo@openwrt.org> |
| Date: Mon, 7 Jan 2013 17:45:39 +0100 |
| Subject: [PATCH 72/72] 446-BCM63XX-add-a-fixup-for-rt2x00-devices |
| |
| --- |
| arch/mips/bcm63xx/Makefile | 2 +- |
| arch/mips/bcm63xx/boards/board_bcm963xx.c | 17 ++++- |
| arch/mips/bcm63xx/dev-flash.c | 2 +- |
| arch/mips/bcm63xx/pci-rt2x00-fixup.c | 71 ++++++++++++++++++++ |
| .../include/asm/mach-bcm63xx/bcm63xx_dev_flash.h | 2 +- |
| .../mips/include/asm/mach-bcm63xx/board_bcm963xx.h | 9 ++- |
| .../include/asm/mach-bcm63xx/pci_rt2x00_fixup.h | 9 +++ |
| 7 files changed, 104 insertions(+), 8 deletions(-) |
| create mode 100644 arch/mips/bcm63xx/pci-rt2x00-fixup.c |
| create mode 100644 arch/mips/include/asm/mach-bcm63xx/pci_rt2x00_fixup.h |
| |
| --- a/arch/mips/bcm63xx/Makefile |
| +++ b/arch/mips/bcm63xx/Makefile |
| @@ -3,7 +3,7 @@ obj-y += clk.o cpu.o cs.o gpio.o irq.o |
| setup.o timer.o dev-enet.o dev-flash.o dev-pcmcia.o \ |
| dev-rng.o dev-wdt.o \ |
| dev-usb-ehci.o dev-usb-ohci.o dev-usb-usbd.o usb-common.o \ |
| - pci-ath9k-fixup.o sprom.o |
| + pci-ath9k-fixup.o pci-rt2x00-fixup.o sprom.o |
| obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
| |
| obj-y += boards/ |
| --- a/arch/mips/bcm63xx/boards/board_common.c |
| +++ b/arch/mips/bcm63xx/boards/board_common.c |
| @@ -32,6 +32,7 @@ |
| #include <bcm63xx_dev_usb_usbd.h> |
| #include <board_bcm963xx.h> |
| #include <pci_ath9k_fixup.h> |
| +#include <pci_rt2x00_fixup.h> |
| |
| #include "board_common.h" |
| |
| @@ -244,9 +245,19 @@ int __init board_register_devices(void) |
| } |
| |
| /* register any fixups */ |
| - for (i = 0; i < board.has_caldata; i++) |
| - pci_enable_ath9k_fixup(board.caldata[i].slot, board.caldata[i].caldata_offset, |
| - board.caldata[i].endian_check, board.caldata[i].led_pin, board.caldata[i].led_active_high); |
| + for (i = 0; i < board.has_caldata; i++) { |
| + switch (board.caldata[i].vendor) { |
| + case PCI_VENDOR_ID_ATHEROS: |
| + pci_enable_ath9k_fixup(board.caldata[i].slot, |
| + board.caldata[i].caldata_offset, board.caldata[i].endian_check, |
| + board.caldata[i].led_pin, board.caldata[i].led_active_high); |
| + break; |
| + case PCI_VENDOR_ID_RALINK: |
| + pci_enable_rt2x00_fixup(board.caldata[i].slot, |
| + board.caldata[i].eeprom); |
| + break; |
| + } |
| + } |
| |
| return 0; |
| } |
| --- /dev/null |
| +++ b/arch/mips/bcm63xx/pci-rt2x00-fixup.c |
| @@ -0,0 +1,72 @@ |
| +/* |
| + * Broadcom BCM63XX RT2x00 EEPROM fixup helper. |
| + * |
| + * Copyright (C) 2012 Álvaro Fernández Rojas <noltari@gmail.com> |
| + * |
| + * Based on |
| + * |
| + * Broadcom BCM63XX Ath9k EEPROM fixup helper. |
| + * |
| + * Copyright (C) 2012 Jonas Gorski <jonas.gorski@gmail.com> |
| + * |
| + * This program is free software; you can redistribute it and/or modify it |
| + * under the terms of the GNU General Public License version 2 as published |
| + * by the Free Software Foundation. |
| + */ |
| + |
| +#include <linux/if_ether.h> |
| +#include <linux/pci.h> |
| +#include <linux/platform_device.h> |
| +#include <linux/rt2x00_platform.h> |
| + |
| +#include <bcm63xx_nvram.h> |
| +#include <pci_rt2x00_fixup.h> |
| + |
| +struct rt2x00_fixup { |
| + unsigned slot; |
| + u8 mac[ETH_ALEN]; |
| + struct rt2x00_platform_data pdata; |
| +}; |
| + |
| +static int rt2x00_num_fixups; |
| +static struct rt2x00_fixup rt2x00_fixups[2] = { |
| + { |
| + .slot = 255, |
| + }, |
| + { |
| + .slot = 255, |
| + }, |
| +}; |
| + |
| +static void rt2x00_pci_fixup(struct pci_dev *dev) |
| +{ |
| + unsigned i; |
| + struct rt2x00_platform_data *pdata = NULL; |
| + |
| + for (i = 0; i < rt2x00_num_fixups; i++) { |
| + if (rt2x00_fixups[i].slot != PCI_SLOT(dev->devfn)) |
| + continue; |
| + |
| + pdata = &rt2x00_fixups[i].pdata; |
| + break; |
| + } |
| + |
| + dev->dev.platform_data = pdata; |
| +} |
| +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_RALINK, PCI_ANY_ID, rt2x00_pci_fixup); |
| + |
| +void __init pci_enable_rt2x00_fixup(unsigned slot, char* eeprom) |
| +{ |
| + if (rt2x00_num_fixups >= ARRAY_SIZE(rt2x00_fixups)) |
| + return; |
| + |
| + rt2x00_fixups[rt2x00_num_fixups].slot = slot; |
| + rt2x00_fixups[rt2x00_num_fixups].pdata.eeprom_file_name = kstrdup(eeprom, GFP_KERNEL); |
| + |
| + if (bcm63xx_nvram_get_mac_address(rt2x00_fixups[rt2x00_num_fixups].mac)) |
| + return; |
| + |
| + rt2x00_fixups[rt2x00_num_fixups].pdata.mac_address = rt2x00_fixups[rt2x00_num_fixups].mac; |
| + rt2x00_num_fixups++; |
| +} |
| + |
| --- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h |
| +++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h |
| @@ -10,6 +10,7 @@ |
| #include <bcm63xx_dev_usb_usbd.h> |
| #include <bcm63xx_fallback_sprom.h> |
| #include <pci_ath9k_fixup.h> |
| +#include <pci_rt2x00_fixup.h> |
| |
| /* |
| * flash mapping |
| @@ -17,12 +18,16 @@ |
| #define BCM963XX_CFE_VERSION_OFFSET 0x570 |
| #define BCM963XX_NVRAM_OFFSET 0x580 |
| |
| -struct ath9k_caldata { |
| +struct bcm63xx_caldata { |
| + unsigned int vendor; |
| unsigned int slot; |
| u32 caldata_offset; |
| + /* Atheros */ |
| unsigned int endian_check:1; |
| int led_pin; |
| bool led_active_high; |
| + /* Ralink */ |
| + char* eeprom; |
| }; |
| |
| /* |
| @@ -45,7 +50,7 @@ struct board_info { |
| unsigned int has_caldata:2; |
| |
| /* wifi calibration data config */ |
| - struct ath9k_caldata caldata[2]; |
| + struct bcm63xx_caldata caldata[2]; |
| |
| /* ethernet config */ |
| struct bcm63xx_enet_platform_data enet0; |
| --- /dev/null |
| +++ b/arch/mips/include/asm/mach-bcm63xx/pci_rt2x00_fixup.h |
| @@ -0,0 +1,9 @@ |
| +#ifndef _PCI_RT2X00_FIXUP |
| +#define _PCI_RT2X00_FIXUP |
| + |
| +#define PCI_VENDOR_ID_RALINK 0x1814 |
| + |
| +void pci_enable_rt2x00_fixup(unsigned slot, char* eeprom) __init; |
| + |
| +#endif /* _PCI_RT2X00_FIXUP */ |
| + |