aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/omap/patches-3.13/901-wlcore-set-irq_flags-in-the-board-files.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/omap/patches-3.13/901-wlcore-set-irq_flags-in-the-board-files.patch')
-rw-r--r--target/linux/omap/patches-3.13/901-wlcore-set-irq_flags-in-the-board-files.patch126
1 files changed, 126 insertions, 0 deletions
diff --git a/target/linux/omap/patches-3.13/901-wlcore-set-irq_flags-in-the-board-files.patch b/target/linux/omap/patches-3.13/901-wlcore-set-irq_flags-in-the-board-files.patch
new file mode 100644
index 0000000000..91f889f81e
--- /dev/null
+++ b/target/linux/omap/patches-3.13/901-wlcore-set-irq_flags-in-the-board-files.patch
@@ -0,0 +1,126 @@
+The platform_quirk element in the platform data was used to change the
+way the IRQ is triggered. When set, the EDGE_IRQ quirk would change
+the irqflags used and treat edge trigger differently from the rest.
+
+Instead of hiding this irq flag setting behind the quirk, have the
+board files set the flags during initialization. This will be more
+meaningful than driver-specific quirks when we switch to DT.
+
+Additionally, fix missing gpio_request() calls in the boarding files
+(so that setting the flags actually works).
+
+Cc: Tony Lindgren <tony@atomide.com>
+Cc: Sekhar Nori <nsekhar@ti.com>
+Signed-off-by: Luciano Coelho <coelho@ti.com>
+Reviewed-by: Felipe Balbi <balbi@ti.com>
+Acked-by: Sekhar Nori <nsekhar@ti.com>
+
+---
+ arch/arm/mach-davinci/board-da850-evm.c | 8 +++++++-
+ arch/arm/mach-omap2/board-omap3evm.c | 19 ++++++++++++++++++
+ arch/arm/mach-omap2/board-zoom-peripherals.c | 30 +++++++++++++++++++++++++---
+ drivers/net/wireless/ti/wlcore/debugfs.c | 2 +-
+ drivers/net/wireless/ti/wlcore/main.c | 17 ++++++++--------
+ drivers/net/wireless/ti/wlcore/wlcore.h | 5 ++---
+ include/linux/wl12xx.h | 4 ----
+ 7 files changed, 64 insertions(+), 21 deletions(-)
+
+--- a/drivers/net/wireless/ti/wlcore/main.c
++++ b/drivers/net/wireless/ti/wlcore/main.c
+@@ -27,6 +27,7 @@
+ #include <linux/vmalloc.h>
+ #include <linux/wl12xx.h>
+ #include <linux/interrupt.h>
++#include <linux/irq.h>
+
+ #include "wlcore.h"
+ #include "debug.h"
+@@ -529,7 +530,7 @@ static int wlcore_irq_locked(struct wl12
+ * In case edge triggered interrupt must be used, we cannot iterate
+ * more than once without introducing race conditions with the hardirq.
+ */
+- if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ)
++ if (wl->irq_flags & IRQF_TRIGGER_RISING)
+ loopcount = 1;
+
+ wl1271_debug(DEBUG_IRQ, "IRQ work");
+@@ -5893,7 +5894,6 @@ struct ieee80211_hw *wlcore_alloc_hw(siz
+ wl->ap_ps_map = 0;
+ wl->ap_fw_ps_map = 0;
+ wl->quirks = 0;
+- wl->platform_quirks = 0;
+ wl->system_hlid = WL12XX_SYSTEM_HLID;
+ wl->active_sta_count = 0;
+ wl->active_link_count = 0;
+@@ -6034,7 +6034,7 @@ static void wlcore_nvs_cb(const struct f
+ struct platform_device *pdev = wl->pdev;
+ struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
+ struct wl12xx_platform_data *pdata = pdev_data->pdata;
+- unsigned long irqflags;
++
+ int ret;
+ irq_handler_t hardirq_fn = NULL;
+
+@@ -6062,18 +6062,17 @@ static void wlcore_nvs_cb(const struct f
+ wlcore_adjust_conf(wl);
+
+ wl->irq = platform_get_irq(pdev, 0);
+- wl->platform_quirks = pdata->platform_quirks;
+ wl->if_ops = pdev_data->if_ops;
+
+- if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ) {
+- irqflags = IRQF_TRIGGER_RISING;
+- hardirq_fn = wlcore_hardirq;
+- } else {
+- irqflags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT;
+- }
++ wl->irq_flags = irq_get_trigger_type(wl->irq);
++
++ hardirq_fn = wlcore_hardirq;
++
++ /* Since we don't use the primary handler, we must set ONESHOT */
++ wl->irq_flags |= IRQF_ONESHOT;
+
+ ret = request_threaded_irq(wl->irq, hardirq_fn, wlcore_irq,
+- irqflags, pdev->name, wl);
++ wl->irq_flags, pdev->name, wl);
+ if (ret < 0) {
+ wl1271_error("request_irq() failed: %d", ret);
+ goto out_free_nvs;
+--- a/drivers/net/wireless/ti/wlcore/wlcore.h
++++ b/drivers/net/wireless/ti/wlcore/wlcore.h
+@@ -186,6 +186,8 @@ struct wl1271 {
+
+ int irq;
+
++ int irq_flags;
++
+ spinlock_t wl_lock;
+
+ enum wlcore_state state;
+@@ -393,9 +395,6 @@ struct wl1271 {
+ /* Quirks of specific hardware revisions */
+ unsigned int quirks;
+
+- /* Platform limitations */
+- unsigned int platform_quirks;
+-
+ /* number of currently active RX BA sessions */
+ int ba_rx_session_count;
+
+--- a/include/linux/wl12xx.h
++++ b/include/linux/wl12xx.h
+@@ -59,13 +59,9 @@ struct wl12xx_platform_data {
+ int irq;
+ int board_ref_clock;
+ int board_tcxo_clock;
+- unsigned long platform_quirks;
+ bool pwr_in_suspend;
+ };
+
+-/* Platform does not support level trigger interrupts */
+-#define WL12XX_PLATFORM_QUIRK_EDGE_IRQ BIT(0)
+-
+ #ifdef CONFIG_WILINK_PLATFORM_DATA
+
+ int wl12xx_set_platform_data(const struct wl12xx_platform_data *data);