wlcore: set irq_trigger in board files instead of hiding behind a quirk
authorLuciano Coelho <luca@coelho.fi>
Wed, 18 Mar 2015 16:38:25 +0000 (18:38 +0200)
committerTony Lindgren <tony@atomide.com>
Thu, 19 Mar 2015 21:20:50 +0000 (14:20 -0700)
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 irq_trigger explicitly.

This will allow us to use standard irq DT definitions
later on.

Signed-off-by: Luciano Coelho <luca@coelho.fi>
[Eliad - rebase, add irq_trigger field and pass it,
update board file changes]
Signed-off-by: Eliad Peller <eliad@wizery.com>
Tested-by: Nikita Kiryanov <nikita@compulab.co.il>
Acked-by: Kalle Valo <kvalo@codeaurora.org>
Acked-by: Sekhar Nori <nsekhar@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-davinci/board-da850-evm.c
arch/arm/mach-omap2/pdata-quirks.c
drivers/net/wireless/ti/wlcore/debugfs.c
drivers/net/wireless/ti/wlcore/main.c
drivers/net/wireless/ti/wlcore/sdio.c
drivers/net/wireless/ti/wlcore/wlcore.h
include/linux/wl12xx.h

index 6b5a97da9fe39da65df47b5c9bbe8fd1359666d8..916589ca8d44366bc11ca4ee856b20fdf22bb5a9 100644 (file)
@@ -1385,8 +1385,8 @@ static const short da850_wl12xx_pins[] __initconst = {
 
 static struct wl12xx_platform_data da850_wl12xx_wlan_data __initdata = {
        .irq                    = -1,
+       .irq_trigger            = IRQ_TYPE_EDGE_RISING,
        .board_ref_clock        = WL12XX_REFCLOCK_38,
-       .platform_quirks        = WL12XX_PLATFORM_QUIRK_EDGE_IRQ,
 };
 
 static __init int da850_wl12xx_init(void)
index e642b079e9f313ac97876e8f74a8b10612a80b83..e86fb0d55c5919a97f65eee3c1e6951a85f95484 100644 (file)
@@ -48,6 +48,7 @@ static void __init __used legacy_init_wl12xx(unsigned ref_clock,
        wl12xx.board_ref_clock = ref_clock;
        wl12xx.board_tcxo_clock = tcxo_clock;
        wl12xx.irq = gpio_to_irq(gpio);
+       wl12xx.irq_trigger = IRQ_TYPE_LEVEL_HIGH;
 
        res = wl12xx_set_platform_data(&wl12xx);
        if (res) {
index 68f3bf229b5a5029d57d06638ea5b27144a76e33..eb43f94a15973fec04cba41af965fac4e9065715 100644 (file)
@@ -502,7 +502,7 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf,
        DRIVER_STATE_PRINT_HEX(irq);
        /* TODO: ref_clock and tcxo_clock were moved to wl12xx priv */
        DRIVER_STATE_PRINT_HEX(hw_pg_ver);
-       DRIVER_STATE_PRINT_HEX(platform_quirks);
+       DRIVER_STATE_PRINT_HEX(irq_flags);
        DRIVER_STATE_PRINT_HEX(chip.id);
        DRIVER_STATE_PRINT_STR(chip.fw_ver_str);
        DRIVER_STATE_PRINT_STR(chip.phy_fw_ver_str);
index 1e136993580f104a156fd3c72494dee9b3845a9b..67518f692cfc46570a1a63c54e1435efedb8e796 100644 (file)
@@ -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"
@@ -538,7 +539,7 @@ static int wlcore_irq_locked(struct wl1271 *wl)
         * 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 | IRQF_TRIGGER_FALLING))
                loopcount = 1;
 
        wl1271_debug(DEBUG_IRQ, "IRQ work");
@@ -6249,7 +6250,6 @@ struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size, u32 aggr_buf_size,
        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;
@@ -6391,7 +6391,8 @@ static void wlcore_nvs_cb(const struct firmware *fw, void *context)
        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;
+       struct resource *res;
+
        int ret;
        irq_handler_t hardirq_fn = NULL;
 
@@ -6418,19 +6419,23 @@ static void wlcore_nvs_cb(const struct firmware *fw, void *context)
        /* adjust some runtime configuration parameters */
        wlcore_adjust_conf(wl);
 
-       wl->irq = platform_get_irq(pdev, 0);
-       wl->platform_quirks = pdata->platform_quirks;
+       res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+       if (!res) {
+               wl1271_error("Could not get IRQ resource");
+               goto out_free_nvs;
+       }
+
+       wl->irq = res->start;
+       wl->irq_flags = res->flags & IRQF_TRIGGER_MASK;
        wl->if_ops = pdev_data->if_ops;
 
-       if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ) {
-               irqflags = IRQF_TRIGGER_RISING;
+       if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
                hardirq_fn = wlcore_hardirq;
-       } else {
-               irqflags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT;
-       }
+       else
+               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;
index d3dd7bfdf3f1f33efbfbd9e0be762f664c892926..2bce00afea1f17ab64183500807df5c17cb5c34e 100644 (file)
@@ -287,7 +287,7 @@ static int wl1271_probe(struct sdio_func *func,
        memset(res, 0x00, sizeof(res));
 
        res[0].start = pdev_data.pdata->irq;
-       res[0].flags = IORESOURCE_IRQ;
+       res[0].flags = IORESOURCE_IRQ | pdev_data.pdata->irq_trigger;
        res[0].name = "irq";
 
        ret = platform_device_add_resources(glue->core, res, ARRAY_SIZE(res));
index d599c869e6e881af451c7ea56ef3a718137b9a25..7f363fa566a3478b24e354abd3dadacb19275e6a 100644 (file)
@@ -197,6 +197,8 @@ struct wl1271 {
 
        int irq;
 
+       int irq_flags;
+
        spinlock_t wl_lock;
 
        enum wlcore_state state;
@@ -404,9 +406,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;
 
index a9c723be1acfca6cd6d6bbfa37f453404aadb83d..3876b67dbcbc456ae93b97741ca89bfff075f62b 100644 (file)
@@ -57,15 +57,12 @@ struct wl1251_platform_data {
 
 struct wl12xx_platform_data {
        int irq;
+       u32 irq_trigger;
        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);