diff options
Diffstat (limited to 'package/mac80211/patches/301-rt2x00-Add-rt2x00soc-bus-module.patch')
-rw-r--r-- | package/mac80211/patches/301-rt2x00-Add-rt2x00soc-bus-module.patch | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/package/mac80211/patches/301-rt2x00-Add-rt2x00soc-bus-module.patch b/package/mac80211/patches/301-rt2x00-Add-rt2x00soc-bus-module.patch new file mode 100644 index 0000000000..bacc1d75a4 --- /dev/null +++ b/package/mac80211/patches/301-rt2x00-Add-rt2x00soc-bus-module.patch @@ -0,0 +1,249 @@ +From ff22aa7443c57f49f9fdaf703aa7035c1b13d7f4 Mon Sep 17 00:00:00 2001 +From: Ivo van Doorn <IvDoorn@gmail.com> +Date: Sun, 26 Apr 2009 15:49:55 +0200 +Subject: [PATCH 1/4] rt2x00: Add rt2x00soc bus module + +Add new library module for SoC drivers. +This is needed to fully support the platform +driver part of rt2800pci. + +Based on original patch from Felix. + +Signed-off-by: Felix Fietkau <nbd@openwrt.org> +Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> +--- + drivers/net/wireless/rt2x00/Kconfig | 4 + + drivers/net/wireless/rt2x00/Makefile | 1 + + drivers/net/wireless/rt2x00/rt2x00soc.c | 159 +++++++++++++++++++++++++++++++ + drivers/net/wireless/rt2x00/rt2x00soc.h | 52 ++++++++++ + 4 files changed, 216 insertions(+), 0 deletions(-) + create mode 100644 drivers/net/wireless/rt2x00/rt2x00soc.c + create mode 100644 drivers/net/wireless/rt2x00/rt2x00soc.h + +--- a/drivers/net/wireless/rt2x00/Makefile ++++ b/drivers/net/wireless/rt2x00/Makefile +@@ -12,6 +12,7 @@ rt2x00lib-$(CONFIG_RT2X00_LIB_HT) += rt2 + + obj-$(CONFIG_RT2X00_LIB) += rt2x00lib.o + obj-$(CONFIG_RT2X00_LIB_PCI) += rt2x00pci.o ++obj-$(CONFIG_RT2X00_LIB_SOC) += rt2x00soc.o + obj-$(CONFIG_RT2X00_LIB_USB) += rt2x00usb.o + obj-$(CONFIG_RT2400PCI) += rt2400pci.o + obj-$(CONFIG_RT2500PCI) += rt2500pci.o +--- /dev/null ++++ b/drivers/net/wireless/rt2x00/rt2x00soc.c +@@ -0,0 +1,159 @@ ++/* ++ Copyright (C) 2004 - 2009 rt2x00 SourceForge Project ++ <http://rt2x00.serialmonkey.com> ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the ++ Free Software Foundation, Inc., ++ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ */ ++ ++/* ++ Module: rt2x00soc ++ Abstract: rt2x00 generic soc device routines. ++ */ ++ ++#include <linux/bug.h> ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++ ++#include "rt2x00.h" ++#include "rt2x00soc.h" ++ ++static void rt2x00soc_free_reg(struct rt2x00_dev *rt2x00dev) ++{ ++ kfree(rt2x00dev->rf); ++ rt2x00dev->rf = NULL; ++ ++ kfree(rt2x00dev->eeprom); ++ rt2x00dev->eeprom = NULL; ++} ++ ++static int rt2x00soc_alloc_reg(struct rt2x00_dev *rt2x00dev) ++{ ++ struct platform_device *pdev = to_platform_device(rt2x00dev->dev); ++ struct resource *res; ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) ++ return -ENODEV; ++ ++ rt2x00dev->csr.base = (void __iomem *)KSEG1ADDR(res->start); ++ if (!rt2x00dev->csr.base) ++ goto exit; ++ ++ rt2x00dev->eeprom = kzalloc(rt2x00dev->ops->eeprom_size, GFP_KERNEL); ++ if (!rt2x00dev->eeprom) ++ goto exit; ++ ++ rt2x00dev->rf = kzalloc(rt2x00dev->ops->rf_size, GFP_KERNEL); ++ if (!rt2x00dev->rf) ++ goto exit; ++ ++ return 0; ++ ++exit: ++ ERROR_PROBE("Failed to allocate registers.\n"); ++ rt2x00soc_free_reg(rt2x00dev); ++ ++ return -ENOMEM; ++} ++ ++int rt2x00soc_probe(struct platform_device *pdev, ++ const unsigned short chipset, ++ const struct rt2x00_ops *ops) ++{ ++ struct ieee80211_hw *hw; ++ struct rt2x00_dev *rt2x00dev; ++ int retval; ++ ++ hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw); ++ if (!hw) { ++ ERROR_PROBE("Failed to allocate hardware.\n"); ++ return -ENOMEM; ++ } ++ ++ platform_set_drvdata(pdev, hw); ++ ++ rt2x00dev = hw->priv; ++ rt2x00dev->dev = &pdev->dev; ++ rt2x00dev->ops = ops; ++ rt2x00dev->hw = hw; ++ rt2x00dev->irq = platform_get_irq(pdev, 0); ++ rt2x00dev->name = pdev->dev.driver->name; ++ ++ rt2x00_set_chip_rt(rt2x00dev, chipset); ++ ++ retval = rt2x00soc_alloc_reg(rt2x00dev); ++ if (retval) ++ goto exit_free_device; ++ ++ retval = rt2x00lib_probe_dev(rt2x00dev); ++ if (retval) ++ goto exit_free_reg; ++ ++ return 0; ++ ++exit_free_reg: ++ rt2x00soc_free_reg(rt2x00dev); ++ ++exit_free_device: ++ ieee80211_free_hw(hw); ++ ++ return retval; ++} ++ ++int rt2x00soc_remove(struct platform_device *pdev) ++{ ++ struct ieee80211_hw *hw = platform_get_drvdata(pdev); ++ struct rt2x00_dev *rt2x00dev = hw->priv; ++ ++ /* ++ * Free all allocated data. ++ */ ++ rt2x00lib_remove_dev(rt2x00dev); ++ rt2x00soc_free_reg(rt2x00dev); ++ ieee80211_free_hw(hw); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(rt2x00soc_remove); ++ ++#ifdef CONFIG_PM ++int rt2x00soc_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++ struct ieee80211_hw *hw = platform_get_drvdata(pdev); ++ struct rt2x00_dev *rt2x00dev = hw->priv; ++ ++ return rt2x00lib_suspend(rt2x00dev, state); ++} ++EXPORT_SYMBOL_GPL(rt2x00soc_suspend); ++ ++int rt2x00soc_resume(struct platform_device *pdev) ++{ ++ struct ieee80211_hw *hw = platform_get_drvdata(pdev); ++ struct rt2x00_dev *rt2x00dev = hw->priv; ++ ++ return rt2x00lib_resume(rt2x00dev); ++} ++EXPORT_SYMBOL_GPL(rt2x00soc_resume); ++#endif /* CONFIG_PM */ ++ ++/* ++ * rt2x00soc module information. ++ */ ++MODULE_AUTHOR(DRV_PROJECT); ++MODULE_VERSION(DRV_VERSION); ++MODULE_DESCRIPTION("rt2x00 soc library"); ++MODULE_LICENSE("GPL"); +--- /dev/null ++++ b/drivers/net/wireless/rt2x00/rt2x00soc.h +@@ -0,0 +1,52 @@ ++/* ++ Copyright (C) 2004 - 2009 rt2x00 SourceForge Project ++ <http://rt2x00.serialmonkey.com> ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the ++ Free Software Foundation, Inc., ++ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ */ ++ ++/* ++ Module: rt2x00soc ++ Abstract: Data structures for the rt2x00soc module. ++ */ ++ ++#ifndef RT2X00SOC_H ++#define RT2X00SOC_H ++ ++#define KSEG1ADDR(__ptr) __ptr ++ ++#define __rt2x00soc_probe(__chipset, __ops) \ ++static int __rt2x00soc_probe(struct platform_device *pdev) \ ++{ \ ++ return rt2x00soc_probe(pdev, (__chipset), (__ops)); \ ++} ++ ++/* ++ * SoC driver handlers. ++ */ ++int rt2x00soc_probe(struct platform_device *pdev, ++ const unsigned short chipset, ++ const struct rt2x00_ops *ops); ++int rt2x00soc_remove(struct platform_device *pdev); ++#ifdef CONFIG_PM ++int rt2x00soc_suspend(struct platform_device *pdev, pm_message_t state); ++int rt2x00soc_resume(struct platform_device *pdev); ++#else ++#define rt2x00soc_suspend NULL ++#define rt2x00soc_resume NULL ++#endif /* CONFIG_PM */ ++ ++#endif /* RT2X00SOC_H */ |