From 5ed5b5e9614fa5b02da699ab565af76c7e63d64d Mon Sep 17 00:00:00 2001 From: Jonas Gorski 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 @@ -2,7 +2,7 @@ obj-y += clk.o cpu.o cs.o gpio.o irq.o setup.o timer.o dev-dsp.o dev-enet.o dev-flash.o \ dev-pcmcia.o dev-rng.o dev-spi.o dev-hsspi.o dev-uart.o \ dev-wdt.o dev-usb-ehci.o dev-usb-ohci.o dev-usb-usbd.o \ - pci-ath9k-fixup.o usb-common.o sprom.o + pci-ath9k-fixup.o pci-rt2x00-fixup.o usb-common.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 @@ -36,6 +36,7 @@ #include #include #include +#include #include "board_common.h" @@ -267,9 +268,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); + 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); + break; + case PCI_VENDOR_ID_RALINK: + pci_enable_rt2x00_fixup(board.caldata[i].slot, + board.caldata[i].eeprom); + break; + } + } return 0; } --- a/arch/mips/bcm63xx/dev-flash.c +++ b/arch/mips/bcm63xx/dev-flash.c @@ -215,7 +215,7 @@ void __init bcm63xx_flash_detect(void) } } -int __init bcm63xx_flash_register(int num_caldata, struct ath9k_caldata *caldata) +int __init bcm63xx_flash_register(int num_caldata, struct bcm63xx_caldata *caldata) { u32 val; unsigned int i; --- /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 + * + * Based on + * + * Broadcom BCM63XX Ath9k EEPROM fixup helper. + * + * Copyright (C) 2012 Jonas Gorski + * + * 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 +#include +#include +#include + +#include +#include + +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/bcm63xx_dev_flash.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_flash.h @@ -13,7 +13,7 @@ void bcm63xx_flash_detect(void); void bcm63xx_flash_force_phys_base_address(u32 start, u32 end); -int __init bcm63xx_flash_register(int num_caldata, struct ath9k_caldata *caldata); +int __init bcm63xx_flash_register(int num_caldata, struct bcm63xx_caldata *caldata); int bcm63xx_flash_get_type(void); --- 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 #include #include +#include /* * flash mapping @@ -17,11 +18,15 @@ #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; + /* Ralink */ + char* eeprom; }; /* @@ -47,7 +52,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 */ +