diff options
Diffstat (limited to 'target/linux/omap/patches-3.12/901-wlcore-set-irq_flags-in-the-board-files.patch')
-rw-r--r-- | target/linux/omap/patches-3.12/901-wlcore-set-irq_flags-in-the-board-files.patch | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/target/linux/omap/patches-3.12/901-wlcore-set-irq_flags-in-the-board-files.patch b/target/linux/omap/patches-3.12/901-wlcore-set-irq_flags-in-the-board-files.patch new file mode 100644 index 0000000000..f090735c65 --- /dev/null +++ b/target/linux/omap/patches-3.12/901-wlcore-set-irq_flags-in-the-board-files.patch @@ -0,0 +1,237 @@ +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/arch/arm/mach-davinci/board-da850-evm.c ++++ b/arch/arm/mach-davinci/board-da850-evm.c +@@ -1371,7 +1371,6 @@ static const short da850_wl12xx_pins[] _ + static struct wl12xx_platform_data da850_wl12xx_wlan_data __initdata = { + .irq = -1, + .board_ref_clock = WL12XX_REFCLOCK_38, +- .platform_quirks = WL12XX_PLATFORM_QUIRK_EDGE_IRQ, + }; + + static __init int da850_wl12xx_init(void) +@@ -1402,6 +1401,13 @@ static __init int da850_wl12xx_init(void + goto free_wlan_en; + } + ++ ret = irq_set_irq_type(gpio_to_irq(DA850_WLAN_IRQ), ++ IRQ_TYPE_EDGE_RISING); ++ if (ret) { ++ pr_err("Could not set wl12xx irq type: %d\n", ret); ++ goto free; ++ } ++ + da850_wl12xx_wlan_data.irq = gpio_to_irq(DA850_WLAN_IRQ); + + ret = wl12xx_set_platform_data(&da850_wl12xx_wlan_data); +--- a/arch/arm/mach-omap2/board-omap3evm.c ++++ b/arch/arm/mach-omap2/board-omap3evm.c +@@ -627,12 +627,31 @@ static void __init omap3_evm_wl12xx_init + + /* WL12xx WLAN Init */ + omap3evm_wlan_data.irq = gpio_to_irq(OMAP3EVM_WLAN_IRQ_GPIO); ++ ++ ret = gpio_request_one(OMAP3EVM_WLAN_IRQ_GPIO, GPIOF_IN, ++ "OMAP3EVM_WLAN_IRQ_GPIO"); ++ if (ret) { ++ pr_err("error requesting wl12xx gpio: %d\n", ret); ++ goto out; ++ } ++ ++ ret = irq_set_irq_type(gpio_to_irq(OMAP3EVM_WLAN_IRQ_GPIO), ++ IRQ_TYPE_LEVEL_HIGH); ++ if (ret) { ++ pr_err("error setting wl12xx irq type: %d\n", ret); ++ goto free; ++ } ++ + ret = wl12xx_set_platform_data(&omap3evm_wlan_data); + if (ret) + pr_err("error setting wl12xx data: %d\n", ret); + ret = platform_device_register(&omap3evm_wlan_regulator); + if (ret) + pr_err("error registering wl12xx device: %d\n", ret); ++out: ++ return; ++free: ++ gpio_free(OMAP3EVM_WLAN_IRQ_GPIO); + #endif + } + +--- a/arch/arm/mach-omap2/board-zoom-peripherals.c ++++ b/arch/arm/mach-omap2/board-zoom-peripherals.c +@@ -339,16 +339,40 @@ static void enable_board_wakeup_source(v + OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP); + } + +-void __init zoom_peripherals_init(void) ++static void __init zoom_wilink_init(void) + { + int ret; + + omap_zoom_wlan_data.irq = gpio_to_irq(OMAP_ZOOM_WLAN_IRQ_GPIO); +- ret = wl12xx_set_platform_data(&omap_zoom_wlan_data); + +- if (ret) ++ ret = gpio_request_one(OMAP_ZOOM_WLAN_IRQ_GPIO, GPIOF_IN, ++ "OMAP_ZOOM_WLAN_IRQ_GPIO"); ++ if (ret) { ++ pr_err("error requesting wl12xx gpio: %d\n", ret); ++ goto out; ++ } ++ ++ ret = irq_set_irq_type(gpio_to_irq(OMAP_ZOOM_WLAN_IRQ_GPIO), ++ IRQ_TYPE_LEVEL_HIGH); ++ if (ret) { ++ pr_err("error setting wl12xx irq type: %d\n", ret); ++ goto free; ++ } ++ ++ ret = wl12xx_set_platform_data(&omap_zoom_wlan_data); ++ if (ret) { + pr_err("error setting wl12xx data: %d\n", ret); ++ goto free; ++ } ++out: ++ return; ++free: ++ gpio_free(OMAP_ZOOM_WLAN_IRQ_GPIO); ++} + ++void __init zoom_peripherals_init(void) ++{ ++ zoom_wilink_init(); + omap_hsmmc_init(mmc); + omap_i2c_init(); + pwm_add_table(zoom_pwm_lookup, ARRAY_SIZE(zoom_pwm_lookup)); +--- a/drivers/net/wireless/ti/wlcore/debugfs.c ++++ b/drivers/net/wireless/ti/wlcore/debugfs.c +@@ -486,7 +486,7 @@ static ssize_t driver_state_read(struct + 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); +--- 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" +@@ -516,7 +517,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"); +@@ -5766,7 +5767,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; +@@ -5902,7 +5902,7 @@ static void wlcore_nvs_cb(const struct f + struct platform_device *pdev = wl->pdev; + struct wlcore_platdev_data *pdev_data = pdev->dev.platform_data; + struct wl12xx_platform_data *pdata = pdev_data->pdata; +- unsigned long irqflags; ++ + int ret; + + if (fw) { +@@ -5929,16 +5929,15 @@ 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; +- else +- irqflags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT; ++ wl->irq_flags = irq_get_trigger_type(wl->irq); ++ ++ /* Since we don't use the primary handler, we must set ONESHOT */ ++ wl->irq_flags |= IRQF_ONESHOT; + + ret = request_threaded_irq(wl->irq, NULL, 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 +@@ -185,6 +185,8 @@ struct wl1271 { + + int irq; + ++ int irq_flags; ++ + spinlock_t wl_lock; + + enum wlcore_state state; +@@ -384,9 +386,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); |