diff options
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.patch | 126 |
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); |