127 lines
4 KiB
Diff
127 lines
4 KiB
Diff
|
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);
|