* [PATCH v2 1/9] wl1251: split wl251 platform data to a separate structure
[not found] ` <1372776948-24840-1-git-send-email-coelho-l0cyMroinI0@public.gmane.org>
@ 2013-07-02 14:55 ` Luciano Coelho
2013-07-02 14:55 ` [PATCH v2 2/9] wlcore: use irq_flags in pdata instead of hiding it behind a quirk Luciano Coelho
` (2 subsequent siblings)
3 siblings, 0 replies; 28+ messages in thread
From: Luciano Coelho @ 2013-07-02 14:55 UTC (permalink / raw)
To: linux-wireless-u79uwXL29TY76Z2rM5mHXA,
tony-4v6yS6AI5VpBDgjK7y7TUQ, nsekhar-l0cyMroinI0
Cc: coelho-l0cyMroinI0, mturquette-QSEj5FYQhm4dnm+yROfE0A,
linux-doc-u79uwXL29TY76Z2rM5mHXA,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, balbi-l0cyMroinI0,
grant.likely-QSEj5FYQhm4dnm+yROfE0A,
linux-omap-u79uwXL29TY76Z2rM5mHXA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Move the wl1251 part of the wl12xx platform data structure into a new
structure specifically for wl1251. Change the platform data built-in
block and board files accordingly.
Cc: Tony Lindgren <tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
Signed-off-by: Luciano Coelho <coelho-l0cyMroinI0@public.gmane.org>
Acked-by: Tony Lindgren <tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
---
arch/arm/mach-omap2/board-omap3pandora.c | 4 +--
arch/arm/mach-omap2/board-rx51-peripherals.c | 2 +-
drivers/net/wireless/ti/wilink_platform_data.c | 37 ++++++++++++++++++++----
drivers/net/wireless/ti/wl1251/sdio.c | 12 ++++----
drivers/net/wireless/ti/wl1251/spi.c | 2 +-
include/linux/wl12xx.h | 22 +++++++++++++-
6 files changed, 62 insertions(+), 17 deletions(-)
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c
index 28133d5..bf06d95 100644
--- a/arch/arm/mach-omap2/board-omap3pandora.c
+++ b/arch/arm/mach-omap2/board-omap3pandora.c
@@ -540,7 +540,7 @@ static struct spi_board_info omap3pandora_spi_board_info[] __initdata = {
static void __init pandora_wl1251_init(void)
{
- struct wl12xx_platform_data pandora_wl1251_pdata;
+ struct wl1251_platform_data pandora_wl1251_pdata;
int ret;
memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata));
@@ -554,7 +554,7 @@ static void __init pandora_wl1251_init(void)
goto fail_irq;
pandora_wl1251_pdata.use_eeprom = true;
- ret = wl12xx_set_platform_data(&pandora_wl1251_pdata);
+ ret = wl1251_set_platform_data(&pandora_wl1251_pdata);
if (ret < 0)
goto fail_irq;
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index 18ca61e..733f3f2 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -80,7 +80,7 @@ enum {
RX51_SPI_MIPID, /* LCD panel */
};
-static struct wl12xx_platform_data wl1251_pdata;
+static struct wl1251_platform_data wl1251_pdata;
static struct tsc2005_platform_data tsc2005_pdata;
#if defined(CONFIG_SENSORS_LIS3_I2C) || defined(CONFIG_SENSORS_LIS3_I2C_MODULE)
diff --git a/drivers/net/wireless/ti/wilink_platform_data.c b/drivers/net/wireless/ti/wilink_platform_data.c
index 998e958..a92bd3e 100644
--- a/drivers/net/wireless/ti/wilink_platform_data.c
+++ b/drivers/net/wireless/ti/wilink_platform_data.c
@@ -23,17 +23,17 @@
#include <linux/err.h>
#include <linux/wl12xx.h>
-static struct wl12xx_platform_data *platform_data;
+static struct wl12xx_platform_data *wl12xx_platform_data;
int __init wl12xx_set_platform_data(const struct wl12xx_platform_data *data)
{
- if (platform_data)
+ if (wl12xx_platform_data)
return -EBUSY;
if (!data)
return -EINVAL;
- platform_data = kmemdup(data, sizeof(*data), GFP_KERNEL);
- if (!platform_data)
+ wl12xx_platform_data = kmemdup(data, sizeof(*data), GFP_KERNEL);
+ if (!wl12xx_platform_data)
return -ENOMEM;
return 0;
@@ -41,9 +41,34 @@ int __init wl12xx_set_platform_data(const struct wl12xx_platform_data *data)
struct wl12xx_platform_data *wl12xx_get_platform_data(void)
{
- if (!platform_data)
+ if (!wl12xx_platform_data)
return ERR_PTR(-ENODEV);
- return platform_data;
+ return wl12xx_platform_data;
}
EXPORT_SYMBOL(wl12xx_get_platform_data);
+
+static struct wl1251_platform_data *wl1251_platform_data;
+
+int __init wl1251_set_platform_data(const struct wl1251_platform_data *data)
+{
+ if (wl1251_platform_data)
+ return -EBUSY;
+ if (!data)
+ return -EINVAL;
+
+ wl1251_platform_data = kmemdup(data, sizeof(*data), GFP_KERNEL);
+ if (!wl1251_platform_data)
+ return -ENOMEM;
+
+ return 0;
+}
+
+struct wl1251_platform_data *wl1251_get_platform_data(void)
+{
+ if (!wl1251_platform_data)
+ return ERR_PTR(-ENODEV);
+
+ return wl1251_platform_data;
+}
+EXPORT_SYMBOL(wl1251_get_platform_data);
diff --git a/drivers/net/wireless/ti/wl1251/sdio.c b/drivers/net/wireless/ti/wl1251/sdio.c
index e2b3d9c..b75a37a 100644
--- a/drivers/net/wireless/ti/wl1251/sdio.c
+++ b/drivers/net/wireless/ti/wl1251/sdio.c
@@ -227,7 +227,7 @@ static int wl1251_sdio_probe(struct sdio_func *func,
struct wl1251 *wl;
struct ieee80211_hw *hw;
struct wl1251_sdio *wl_sdio;
- const struct wl12xx_platform_data *wl12xx_board_data;
+ const struct wl1251_platform_data *wl1251_board_data;
hw = wl1251_alloc_hw();
if (IS_ERR(hw))
@@ -254,11 +254,11 @@ static int wl1251_sdio_probe(struct sdio_func *func,
wl->if_priv = wl_sdio;
wl->if_ops = &wl1251_sdio_ops;
- wl12xx_board_data = wl12xx_get_platform_data();
- if (!IS_ERR(wl12xx_board_data)) {
- wl->set_power = wl12xx_board_data->set_power;
- wl->irq = wl12xx_board_data->irq;
- wl->use_eeprom = wl12xx_board_data->use_eeprom;
+ wl1251_board_data = wl1251_get_platform_data();
+ if (!IS_ERR(wl1251_board_data)) {
+ wl->set_power = wl1251_board_data->set_power;
+ wl->irq = wl1251_board_data->irq;
+ wl->use_eeprom = wl1251_board_data->use_eeprom;
}
if (wl->irq) {
diff --git a/drivers/net/wireless/ti/wl1251/spi.c b/drivers/net/wireless/ti/wl1251/spi.c
index c7dc6fe..6bbbfe6 100644
--- a/drivers/net/wireless/ti/wl1251/spi.c
+++ b/drivers/net/wireless/ti/wl1251/spi.c
@@ -238,7 +238,7 @@ static const struct wl1251_if_operations wl1251_spi_ops = {
static int wl1251_spi_probe(struct spi_device *spi)
{
- struct wl12xx_platform_data *pdata;
+ struct wl1251_platform_data *pdata;
struct ieee80211_hw *hw;
struct wl1251 *wl;
int ret;
diff --git a/include/linux/wl12xx.h b/include/linux/wl12xx.h
index a54fe82..b516b4f 100644
--- a/include/linux/wl12xx.h
+++ b/include/linux/wl12xx.h
@@ -48,11 +48,15 @@ enum {
WL12XX_TCXOCLOCK_33_6 = 7, /* 33.6 MHz */
};
-struct wl12xx_platform_data {
+struct wl1251_platform_data {
void (*set_power)(bool enable);
/* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */
int irq;
bool use_eeprom;
+};
+
+struct wl12xx_platform_data {
+ int irq;
int board_ref_clock;
int board_tcxo_clock;
unsigned long platform_quirks;
@@ -68,6 +72,10 @@ int wl12xx_set_platform_data(const struct wl12xx_platform_data *data);
struct wl12xx_platform_data *wl12xx_get_platform_data(void);
+int wl1251_set_platform_data(const struct wl1251_platform_data *data);
+
+struct wl1251_platform_data *wl1251_get_platform_data(void);
+
#else
static inline
@@ -82,6 +90,18 @@ struct wl12xx_platform_data *wl12xx_get_platform_data(void)
return ERR_PTR(-ENODATA);
}
+static inline
+int wl1251_set_platform_data(const struct wl1251_platform_data *data)
+{
+ return -ENOSYS;
+}
+
+static inline
+struct wl1251_platform_data *wl1251_get_platform_data(void)
+{
+ return ERR_PTR(-ENODATA);
+}
+
#endif
#endif
--
1.7.10.4
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v2 2/9] wlcore: use irq_flags in pdata instead of hiding it behind a quirk
[not found] ` <1372776948-24840-1-git-send-email-coelho-l0cyMroinI0@public.gmane.org>
2013-07-02 14:55 ` [PATCH v2 1/9] wl1251: split wl251 platform data to a separate structure Luciano Coelho
@ 2013-07-02 14:55 ` Luciano Coelho
2013-07-02 15:26 ` Felipe Balbi
2013-07-02 14:55 ` [PATCH v2 4/9] wl12xx: use frequency instead of enumerations for pdata clocks Luciano Coelho
2013-07-02 14:55 ` [PATCH v2 6/9] wlcore: add initial device tree support to the sdio module Luciano Coelho
3 siblings, 1 reply; 28+ messages in thread
From: Luciano Coelho @ 2013-07-02 14:55 UTC (permalink / raw)
To: linux-wireless-u79uwXL29TY76Z2rM5mHXA,
tony-4v6yS6AI5VpBDgjK7y7TUQ, nsekhar-l0cyMroinI0
Cc: coelho-l0cyMroinI0, mturquette-QSEj5FYQhm4dnm+yROfE0A,
linux-doc-u79uwXL29TY76Z2rM5mHXA,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, balbi-l0cyMroinI0,
grant.likely-QSEj5FYQhm4dnm+yROfE0A,
linux-omap-u79uwXL29TY76Z2rM5mHXA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
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, export the
whole irq_flags element and let the board file define what to use.
This will be more meaningful than driver-specific quirks when we
switch to DT.
Cc: Tony Lindgren <tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
Cc: Sekhar Nori <nsekhar-l0cyMroinI0@public.gmane.org>
Signed-off-by: Luciano Coelho <coelho-l0cyMroinI0@public.gmane.org>
Acked-by: Tony Lindgren <tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
---
arch/arm/mach-davinci/board-da850-evm.c | 2 +-
arch/arm/mach-omap2/board-4430sdp.c | 1 +
arch/arm/mach-omap2/board-omap3evm.c | 1 +
arch/arm/mach-omap2/board-omap4panda.c | 1 +
arch/arm/mach-omap2/board-zoom-peripherals.c | 1 +
drivers/net/wireless/ti/wlcore/debugfs.c | 2 +-
drivers/net/wireless/ti/wlcore/main.c | 13 +++----------
drivers/net/wireless/ti/wlcore/wlcore.h | 5 ++---
include/linux/wl12xx.h | 5 +----
9 files changed, 12 insertions(+), 19 deletions(-)
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
index 8a24b6c..d2a2a98 100644
--- a/arch/arm/mach-davinci/board-da850-evm.c
+++ b/arch/arm/mach-davinci/board-da850-evm.c
@@ -1377,8 +1377,8 @@ static const short da850_wl12xx_pins[] __initconst = {
static struct wl12xx_platform_data da850_wl12xx_wlan_data __initdata = {
.irq = -1,
+ .irq_flags = IRQF_TRIGGER_RISING,
.board_ref_clock = WL12XX_REFCLOCK_38,
- .platform_quirks = WL12XX_PLATFORM_QUIRK_EDGE_IRQ,
};
static __init int da850_wl12xx_init(void)
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
index 56a9a4f..c2334aa 100644
--- a/arch/arm/mach-omap2/board-4430sdp.c
+++ b/arch/arm/mach-omap2/board-4430sdp.c
@@ -693,6 +693,7 @@ static void __init omap4_sdp4430_wifi_mux_init(void)
}
static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = {
+ .irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
.board_ref_clock = WL12XX_REFCLOCK_26,
.board_tcxo_clock = WL12XX_TCXOCLOCK_26,
};
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
index f76d0de..a0c0adf 100644
--- a/arch/arm/mach-omap2/board-omap3evm.c
+++ b/arch/arm/mach-omap2/board-omap3evm.c
@@ -458,6 +458,7 @@ static struct platform_device omap3evm_wlan_regulator = {
};
struct wl12xx_platform_data omap3evm_wlan_data __initdata = {
+ .irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
.board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */
};
#endif
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
index 1e2c75e..ba00862 100644
--- a/arch/arm/mach-omap2/board-omap4panda.c
+++ b/arch/arm/mach-omap2/board-omap4panda.c
@@ -230,6 +230,7 @@ static struct platform_device omap_vwlan_device = {
};
static struct wl12xx_platform_data omap_panda_wlan_data __initdata = {
+ .irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
.board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */
};
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c
index a90375d..ced012c 100644
--- a/arch/arm/mach-omap2/board-zoom-peripherals.c
+++ b/arch/arm/mach-omap2/board-zoom-peripherals.c
@@ -244,6 +244,7 @@ static struct platform_device *zoom_devices[] __initdata = {
};
static struct wl12xx_platform_data omap_zoom_wlan_data __initdata = {
+ .irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
.board_ref_clock = WL12XX_REFCLOCK_26, /* 26 MHz */
};
diff --git a/drivers/net/wireless/ti/wlcore/debugfs.c b/drivers/net/wireless/ti/wlcore/debugfs.c
index c3e1f79..5eff663 100644
--- 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 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);
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index b8db55c..e7294b8 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -516,7 +516,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)
loopcount = 1;
wl1271_debug(DEBUG_IRQ, "IRQ work");
@@ -5765,7 +5765,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;
@@ -5901,7 +5900,6 @@ static void wlcore_nvs_cb(const struct firmware *fw, void *context)
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) {
@@ -5928,16 +5926,11 @@ static void wlcore_nvs_cb(const struct firmware *fw, void *context)
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 = pdata->irq_flags;
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;
diff --git a/drivers/net/wireless/ti/wlcore/wlcore.h b/drivers/net/wireless/ti/wlcore/wlcore.h
index 0034979..8306bde 100644
--- 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;
diff --git a/include/linux/wl12xx.h b/include/linux/wl12xx.h
index b516b4f..04e3096 100644
--- a/include/linux/wl12xx.h
+++ b/include/linux/wl12xx.h
@@ -57,15 +57,12 @@ struct wl1251_platform_data {
struct wl12xx_platform_data {
int irq;
+ unsigned long irq_flags;
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);
--
1.7.10.4
^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [PATCH v2 2/9] wlcore: use irq_flags in pdata instead of hiding it behind a quirk
2013-07-02 14:55 ` [PATCH v2 2/9] wlcore: use irq_flags in pdata instead of hiding it behind a quirk Luciano Coelho
@ 2013-07-02 15:26 ` Felipe Balbi
2013-07-02 20:12 ` Luciano Coelho
0 siblings, 1 reply; 28+ messages in thread
From: Felipe Balbi @ 2013-07-02 15:26 UTC (permalink / raw)
To: Luciano Coelho
Cc: linux-wireless, tony, nsekhar, mturquette, mark.rutland, balbi,
grant.likely, rob.herring, devicetree-discuss, linux-doc,
linux-kernel, linux-omap, linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 2541 bytes --]
Hi,
On Tue, Jul 02, 2013 at 05:55:41PM +0300, Luciano Coelho wrote:
> 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, export the
> whole irq_flags element and let the board file define what to use.
> This will be more meaningful than driver-specific quirks when we
> switch to DT.
>
> Cc: Tony Lindgren <tony@atomide.com>
> Cc: Sekhar Nori <nsekhar@ti.com>
> Signed-off-by: Luciano Coelho <coelho@ti.com>
> Acked-by: Tony Lindgren <tony@atomide.com>
> ---
> arch/arm/mach-davinci/board-da850-evm.c | 2 +-
> arch/arm/mach-omap2/board-4430sdp.c | 1 +
> arch/arm/mach-omap2/board-omap3evm.c | 1 +
> arch/arm/mach-omap2/board-omap4panda.c | 1 +
> arch/arm/mach-omap2/board-zoom-peripherals.c | 1 +
> drivers/net/wireless/ti/wlcore/debugfs.c | 2 +-
> drivers/net/wireless/ti/wlcore/main.c | 13 +++----------
> drivers/net/wireless/ti/wlcore/wlcore.h | 5 ++---
> include/linux/wl12xx.h | 5 +----
> 9 files changed, 12 insertions(+), 19 deletions(-)
>
> diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
> index 8a24b6c..d2a2a98 100644
> --- a/arch/arm/mach-davinci/board-da850-evm.c
> +++ b/arch/arm/mach-davinci/board-da850-evm.c
> @@ -1377,8 +1377,8 @@ static const short da850_wl12xx_pins[] __initconst = {
>
> static struct wl12xx_platform_data da850_wl12xx_wlan_data __initdata = {
> .irq = -1,
> + .irq_flags = IRQF_TRIGGER_RISING,
> .board_ref_clock = WL12XX_REFCLOCK_38,
> - .platform_quirks = WL12XX_PLATFORM_QUIRK_EDGE_IRQ,
> };
>
> static __init int da850_wl12xx_init(void)
> diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
> index 56a9a4f..c2334aa 100644
> --- a/arch/arm/mach-omap2/board-4430sdp.c
> +++ b/arch/arm/mach-omap2/board-4430sdp.c
> @@ -693,6 +693,7 @@ static void __init omap4_sdp4430_wifi_mux_init(void)
> }
>
> static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = {
> + .irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
couldn't you just call irq_set_irq_type() from the board-file itself ?
Then on your driver you can just pass IRQF_ONESHOT (to make sure heh) to
your request_threaded_irq_handler()
--
balbi
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v2 2/9] wlcore: use irq_flags in pdata instead of hiding it behind a quirk
2013-07-02 15:26 ` Felipe Balbi
@ 2013-07-02 20:12 ` Luciano Coelho
0 siblings, 0 replies; 28+ messages in thread
From: Luciano Coelho @ 2013-07-02 20:12 UTC (permalink / raw)
To: balbi
Cc: mark.rutland, mturquette, linux-doc, tony, linux-wireless,
devicetree-discuss, nsekhar, linux-kernel, rob.herring,
grant.likely, linux-omap, linux-arm-kernel
On Tue, 2013-07-02 at 18:26 +0300, Felipe Balbi wrote:
> Hi,
>
> On Tue, Jul 02, 2013 at 05:55:41PM +0300, Luciano Coelho wrote:
> > 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, export the
> > whole irq_flags element and let the board file define what to use.
> > This will be more meaningful than driver-specific quirks when we
> > switch to DT.
> >
> > Cc: Tony Lindgren <tony@atomide.com>
> > Cc: Sekhar Nori <nsekhar@ti.com>
> > Signed-off-by: Luciano Coelho <coelho@ti.com>
> > Acked-by: Tony Lindgren <tony@atomide.com>
> > ---
> > arch/arm/mach-davinci/board-da850-evm.c | 2 +-
> > arch/arm/mach-omap2/board-4430sdp.c | 1 +
> > arch/arm/mach-omap2/board-omap3evm.c | 1 +
> > arch/arm/mach-omap2/board-omap4panda.c | 1 +
> > arch/arm/mach-omap2/board-zoom-peripherals.c | 1 +
> > drivers/net/wireless/ti/wlcore/debugfs.c | 2 +-
> > drivers/net/wireless/ti/wlcore/main.c | 13 +++----------
> > drivers/net/wireless/ti/wlcore/wlcore.h | 5 ++---
> > include/linux/wl12xx.h | 5 +----
> > 9 files changed, 12 insertions(+), 19 deletions(-)
> >
> > diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
> > index 8a24b6c..d2a2a98 100644
> > --- a/arch/arm/mach-davinci/board-da850-evm.c
> > +++ b/arch/arm/mach-davinci/board-da850-evm.c
> > @@ -1377,8 +1377,8 @@ static const short da850_wl12xx_pins[] __initconst = {
> >
> > static struct wl12xx_platform_data da850_wl12xx_wlan_data __initdata = {
> > .irq = -1,
> > + .irq_flags = IRQF_TRIGGER_RISING,
> > .board_ref_clock = WL12XX_REFCLOCK_38,
> > - .platform_quirks = WL12XX_PLATFORM_QUIRK_EDGE_IRQ,
> > };
> >
> > static __init int da850_wl12xx_init(void)
> > diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
> > index 56a9a4f..c2334aa 100644
> > --- a/arch/arm/mach-omap2/board-4430sdp.c
> > +++ b/arch/arm/mach-omap2/board-4430sdp.c
> > @@ -693,6 +693,7 @@ static void __init omap4_sdp4430_wifi_mux_init(void)
> > }
> >
> > static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = {
> > + .irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
>
> couldn't you just call irq_set_irq_type() from the board-file itself ?
> Then on your driver you can just pass IRQF_ONESHOT (to make sure heh) to
> your request_threaded_irq_handler()
Good point. This is an oldish patch from the time I still thought I'd
have to pass the flags in the device tree. It turned out that I don't
need it anymore, so this can be totally removed from pdata and be set by
the board file itself.
As you saw in a later patch, I do make sure the driver sets
IRQF_ONESHOT. ;)
--
Cheers,
Luca.
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v2 4/9] wl12xx: use frequency instead of enumerations for pdata clocks
[not found] ` <1372776948-24840-1-git-send-email-coelho-l0cyMroinI0@public.gmane.org>
2013-07-02 14:55 ` [PATCH v2 1/9] wl1251: split wl251 platform data to a separate structure Luciano Coelho
2013-07-02 14:55 ` [PATCH v2 2/9] wlcore: use irq_flags in pdata instead of hiding it behind a quirk Luciano Coelho
@ 2013-07-02 14:55 ` Luciano Coelho
2013-07-02 15:02 ` Nishanth Menon
[not found] ` <1372776948-24840-5-git-send-email-coelho-l0cyMroinI0@public.gmane.org>
2013-07-02 14:55 ` [PATCH v2 6/9] wlcore: add initial device tree support to the sdio module Luciano Coelho
3 siblings, 2 replies; 28+ messages in thread
From: Luciano Coelho @ 2013-07-02 14:55 UTC (permalink / raw)
To: linux-wireless-u79uwXL29TY76Z2rM5mHXA,
tony-4v6yS6AI5VpBDgjK7y7TUQ, nsekhar-l0cyMroinI0
Cc: coelho-l0cyMroinI0, mturquette-QSEj5FYQhm4dnm+yROfE0A,
linux-doc-u79uwXL29TY76Z2rM5mHXA,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, balbi-l0cyMroinI0,
grant.likely-QSEj5FYQhm4dnm+yROfE0A,
linux-omap-u79uwXL29TY76Z2rM5mHXA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Instead of defining an enumeration with the FW specific values for the
different clock rates, use the actual frequency instead. Also add a
boolean to specify whether the clock is XTAL or not.
Change all board files to reflect this.
Cc: Tony Lindgren <tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
Cc: Sekhar Nori <nsekhar-l0cyMroinI0@public.gmane.org>
Signed-off-by: Luciano Coelho <coelho-l0cyMroinI0@public.gmane.org>
---
arch/arm/mach-davinci/board-da850-evm.c | 3 +-
arch/arm/mach-omap2/board-4430sdp.c | 5 ++-
arch/arm/mach-omap2/board-omap3evm.c | 3 +-
arch/arm/mach-omap2/board-omap4panda.c | 3 +-
arch/arm/mach-omap2/board-zoom-peripherals.c | 3 +-
drivers/net/wireless/ti/wl12xx/main.c | 58 +++++++++++++++++++++++++-
drivers/net/wireless/ti/wl12xx/wl12xx.h | 28 +++++++++++++
include/linux/wl12xx.h | 28 ++-----------
8 files changed, 99 insertions(+), 32 deletions(-)
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
index d2a2a98..202f3d0 100644
--- a/arch/arm/mach-davinci/board-da850-evm.c
+++ b/arch/arm/mach-davinci/board-da850-evm.c
@@ -1378,7 +1378,8 @@ static const short da850_wl12xx_pins[] __initconst = {
static struct wl12xx_platform_data da850_wl12xx_wlan_data __initdata = {
.irq = -1,
.irq_flags = IRQF_TRIGGER_RISING,
- .board_ref_clock = WL12XX_REFCLOCK_38,
+ .ref_clock_freq = 38400000,
+ .ref_clock_xtal = false,
};
static __init int da850_wl12xx_init(void)
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
index c2334aa..da2b892 100644
--- a/arch/arm/mach-omap2/board-4430sdp.c
+++ b/arch/arm/mach-omap2/board-4430sdp.c
@@ -694,8 +694,9 @@ static void __init omap4_sdp4430_wifi_mux_init(void)
static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = {
.irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
- .board_ref_clock = WL12XX_REFCLOCK_26,
- .board_tcxo_clock = WL12XX_TCXOCLOCK_26,
+ .ref_clock_freq = 26000000,
+ .ref_clock_xtal = false,
+ .tcxo_clock_freq = 26000000,
};
static void __init omap4_sdp4430_wifi_init(void)
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
index a0c0adf..d24435c 100644
--- a/arch/arm/mach-omap2/board-omap3evm.c
+++ b/arch/arm/mach-omap2/board-omap3evm.c
@@ -459,7 +459,8 @@ static struct platform_device omap3evm_wlan_regulator = {
struct wl12xx_platform_data omap3evm_wlan_data __initdata = {
.irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
- .board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */
+ .ref_clock_freq = 38400000,
+ .ref_clock_xtal = false,
};
#endif
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
index ba00862..ac6413c 100644
--- a/arch/arm/mach-omap2/board-omap4panda.c
+++ b/arch/arm/mach-omap2/board-omap4panda.c
@@ -231,7 +231,8 @@ static struct platform_device omap_vwlan_device = {
static struct wl12xx_platform_data omap_panda_wlan_data __initdata = {
.irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
- .board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */
+ .ref_clock_freq = 38400000,
+ .ref_clock_xtal = false,
};
static struct twl6040_codec_data twl6040_codec = {
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c
index ced012c..f4f4fe7 100644
--- a/arch/arm/mach-omap2/board-zoom-peripherals.c
+++ b/arch/arm/mach-omap2/board-zoom-peripherals.c
@@ -245,7 +245,8 @@ static struct platform_device *zoom_devices[] __initdata = {
static struct wl12xx_platform_data omap_zoom_wlan_data __initdata = {
.irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
- .board_ref_clock = WL12XX_REFCLOCK_26, /* 26 MHz */
+ .ref_clock_freq = 26000000,
+ .ref_clock_xtal = false,
};
static struct omap2_hsmmc_info mmc[] = {
diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c
index 1c627da..903dcb3 100644
--- a/drivers/net/wireless/ti/wl12xx/main.c
+++ b/drivers/net/wireless/ti/wl12xx/main.c
@@ -1701,6 +1701,42 @@ static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
},
};
+static struct wl12xx_clock wl12xx_refclock_table[] = {
+ { 19200000, false, WL12XX_REFCLOCK_19 },
+ { 26000000, false, WL12XX_REFCLOCK_26 },
+ { 26000000, true, WL12XX_REFCLOCK_26_XTAL },
+ { 38400000, false, WL12XX_REFCLOCK_38 },
+ { 38400000, true, WL12XX_REFCLOCK_38_XTAL },
+ { 52000000, false, WL12XX_REFCLOCK_52 },
+ { 0, false, 0 }
+};
+
+static struct wl12xx_clock wl12xx_tcxoclock_table[] = {
+ { 16368000, false, WL12XX_TCXOCLOCK_16_368 },
+ { 16800000, false, WL12XX_TCXOCLOCK_16_8 },
+ { 19200000, false, WL12XX_TCXOCLOCK_19_2 },
+ { 26000000, false, WL12XX_TCXOCLOCK_26 },
+ { 32736000, false, WL12XX_TCXOCLOCK_32_736 },
+ { 33600000, false, WL12XX_TCXOCLOCK_33_6 },
+ { 38400000, false, WL12XX_TCXOCLOCK_38_4 },
+ { 52000000, false, WL12XX_TCXOCLOCK_52 },
+ { 0, false, 0 }
+};
+
+static int wl12xx_get_clock_idx(struct wl12xx_clock *table, u32 freq, bool xtal)
+{
+ int i = 0;
+
+ while(table[i].freq != 0) {
+ if ((table[i].freq == freq) &&
+ (table[i].xtal == xtal))
+ return table[i].hw_idx;
+ i++;
+ };
+
+ return -EINVAL;
+}
+
static int wl12xx_setup(struct wl1271 *wl)
{
struct wl12xx_priv *priv = wl->priv;
@@ -1722,7 +1758,16 @@ static int wl12xx_setup(struct wl1271 *wl)
wl12xx_conf_init(wl);
if (!fref_param) {
- priv->ref_clock = pdata->board_ref_clock;
+ priv->ref_clock = wl12xx_get_clock_idx(wl12xx_refclock_table,
+ pdata->ref_clock_freq,
+ pdata->ref_clock_xtal);
+ if (priv->ref_clock < 0) {
+ wl1271_error("Invalid ref_clock frequency (%d Hz, %s)",
+ pdata->ref_clock_freq,
+ pdata->ref_clock_xtal ? "XTAL" : "not XTAL");
+
+ return priv->ref_clock;
+ }
} else {
if (!strcmp(fref_param, "19.2"))
priv->ref_clock = WL12XX_REFCLOCK_19;
@@ -1741,7 +1786,16 @@ static int wl12xx_setup(struct wl1271 *wl)
}
if (!tcxo_param) {
- priv->tcxo_clock = pdata->board_tcxo_clock;
+ priv->tcxo_clock = wl12xx_get_clock_idx(wl12xx_tcxoclock_table,
+ pdata->tcxo_clock_freq,
+ pdata->tcxo_clock_xtal);
+ if (priv->tcxo_clock < 0) {
+ wl1271_error("Invalid tcxo_clock frequency (%d Hz, %s)",
+ pdata->tcxo_clock_freq,
+ pdata->tcxo_clock_xtal ? "XTAL" : "not XTAL");
+
+ return priv->tcxo_clock;
+ }
} else {
if (!strcmp(tcxo_param, "19.2"))
priv->tcxo_clock = WL12XX_TCXOCLOCK_19_2;
diff --git a/drivers/net/wireless/ti/wl12xx/wl12xx.h b/drivers/net/wireless/ti/wl12xx/wl12xx.h
index 9e5484a..05f631b 100644
--- a/drivers/net/wireless/ti/wl12xx/wl12xx.h
+++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h
@@ -79,4 +79,32 @@ struct wl12xx_priv {
struct wl127x_rx_mem_pool_addr *rx_mem_addr;
};
+/* Reference clock values */
+enum {
+ WL12XX_REFCLOCK_19 = 0, /* 19.2 MHz */
+ WL12XX_REFCLOCK_26 = 1, /* 26 MHz */
+ WL12XX_REFCLOCK_38 = 2, /* 38.4 MHz */
+ WL12XX_REFCLOCK_52 = 3, /* 52 MHz */
+ WL12XX_REFCLOCK_38_XTAL = 4, /* 38.4 MHz, XTAL */
+ WL12XX_REFCLOCK_26_XTAL = 5, /* 26 MHz, XTAL */
+};
+
+/* TCXO clock values */
+enum {
+ WL12XX_TCXOCLOCK_19_2 = 0, /* 19.2MHz */
+ WL12XX_TCXOCLOCK_26 = 1, /* 26 MHz */
+ WL12XX_TCXOCLOCK_38_4 = 2, /* 38.4MHz */
+ WL12XX_TCXOCLOCK_52 = 3, /* 52 MHz */
+ WL12XX_TCXOCLOCK_16_368 = 4, /* 16.368 MHz */
+ WL12XX_TCXOCLOCK_32_736 = 5, /* 32.736 MHz */
+ WL12XX_TCXOCLOCK_16_8 = 6, /* 16.8 MHz */
+ WL12XX_TCXOCLOCK_33_6 = 7, /* 33.6 MHz */
+};
+
+struct wl12xx_clock {
+ u32 freq;
+ bool xtal;
+ u8 hw_idx;
+};
+
#endif /* __WL12XX_PRIV_H__ */
diff --git a/include/linux/wl12xx.h b/include/linux/wl12xx.h
index 1e4ed6e..4982b94 100644
--- a/include/linux/wl12xx.h
+++ b/include/linux/wl12xx.h
@@ -26,28 +26,6 @@
#include <linux/err.h>
-/* Reference clock values */
-enum {
- WL12XX_REFCLOCK_19 = 0, /* 19.2 MHz */
- WL12XX_REFCLOCK_26 = 1, /* 26 MHz */
- WL12XX_REFCLOCK_38 = 2, /* 38.4 MHz */
- WL12XX_REFCLOCK_52 = 3, /* 52 MHz */
- WL12XX_REFCLOCK_38_XTAL = 4, /* 38.4 MHz, XTAL */
- WL12XX_REFCLOCK_26_XTAL = 5, /* 26 MHz, XTAL */
-};
-
-/* TCXO clock values */
-enum {
- WL12XX_TCXOCLOCK_19_2 = 0, /* 19.2MHz */
- WL12XX_TCXOCLOCK_26 = 1, /* 26 MHz */
- WL12XX_TCXOCLOCK_38_4 = 2, /* 38.4MHz */
- WL12XX_TCXOCLOCK_52 = 3, /* 52 MHz */
- WL12XX_TCXOCLOCK_16_368 = 4, /* 16.368 MHz */
- WL12XX_TCXOCLOCK_32_736 = 5, /* 32.736 MHz */
- WL12XX_TCXOCLOCK_16_8 = 6, /* 16.8 MHz */
- WL12XX_TCXOCLOCK_33_6 = 7, /* 33.6 MHz */
-};
-
struct wl1251_platform_data {
void (*set_power)(bool enable);
/* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */
@@ -58,8 +36,10 @@ struct wl1251_platform_data {
struct wl12xx_platform_data {
int irq;
unsigned long irq_flags;
- int board_ref_clock;
- int board_tcxo_clock;
+ int ref_clock_freq; /* in Hertz */
+ bool ref_clock_xtal; /* specify whether the clock is XTAL or not */
+ int tcxo_clock_freq; /* in Hertz */
+ bool tcxo_clock_xtal; /* specify whether the clock is XTAL or not */
};
#ifdef CONFIG_WILINK_PLATFORM_DATA
--
1.7.10.4
^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [PATCH v2 4/9] wl12xx: use frequency instead of enumerations for pdata clocks
2013-07-02 14:55 ` [PATCH v2 4/9] wl12xx: use frequency instead of enumerations for pdata clocks Luciano Coelho
@ 2013-07-02 15:02 ` Nishanth Menon
2013-07-02 20:27 ` Luciano Coelho
[not found] ` <1372776948-24840-5-git-send-email-coelho-l0cyMroinI0@public.gmane.org>
1 sibling, 1 reply; 28+ messages in thread
From: Nishanth Menon @ 2013-07-02 15:02 UTC (permalink / raw)
To: Luciano Coelho
Cc: linux-wireless, tony, nsekhar, mturquette, mark.rutland, balbi,
grant.likely, rob.herring, devicetree-discuss, linux-doc,
linux-kernel, linux-omap, linux-arm-kernel
On 17:55-20130702, Luciano Coelho wrote:
> Instead of defining an enumeration with the FW specific values for the
> different clock rates, use the actual frequency instead. Also add a
> boolean to specify whether the clock is XTAL or not.
>
> Change all board files to reflect this.
>
> Cc: Tony Lindgren <tony@atomide.com>
> Cc: Sekhar Nori <nsekhar@ti.com>
> Signed-off-by: Luciano Coelho <coelho@ti.com>
> ---
> arch/arm/mach-davinci/board-da850-evm.c | 3 +-
> arch/arm/mach-omap2/board-4430sdp.c | 5 ++-
^^
> arch/arm/mach-omap2/board-omap3evm.c | 3 +-
> arch/arm/mach-omap2/board-omap4panda.c | 3 +-
^^
Please do not add more platform data to platforms that are DT only.
> arch/arm/mach-omap2/board-zoom-peripherals.c | 3 +-
> drivers/net/wireless/ti/wl12xx/main.c | 58 +++++++++++++++++++++++++-
> drivers/net/wireless/ti/wl12xx/wl12xx.h | 28 +++++++++++++
> include/linux/wl12xx.h | 28 ++-----------
> 8 files changed, 99 insertions(+), 32 deletions(-)
>
> diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
> index d2a2a98..202f3d0 100644
> --- a/arch/arm/mach-davinci/board-da850-evm.c
> +++ b/arch/arm/mach-davinci/board-da850-evm.c
> @@ -1378,7 +1378,8 @@ static const short da850_wl12xx_pins[] __initconst = {
> static struct wl12xx_platform_data da850_wl12xx_wlan_data __initdata = {
> .irq = -1,
> .irq_flags = IRQF_TRIGGER_RISING,
> - .board_ref_clock = WL12XX_REFCLOCK_38,
> + .ref_clock_freq = 38400000,
> + .ref_clock_xtal = false,
> };
>
> static __init int da850_wl12xx_init(void)
> diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
> index c2334aa..da2b892 100644
> --- a/arch/arm/mach-omap2/board-4430sdp.c
> +++ b/arch/arm/mach-omap2/board-4430sdp.c
> @@ -694,8 +694,9 @@ static void __init omap4_sdp4430_wifi_mux_init(void)
>
> static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = {
> .irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
> - .board_ref_clock = WL12XX_REFCLOCK_26,
> - .board_tcxo_clock = WL12XX_TCXOCLOCK_26,
> + .ref_clock_freq = 26000000,
> + .ref_clock_xtal = false,
> + .tcxo_clock_freq = 26000000,
> };
>
> static void __init omap4_sdp4430_wifi_init(void)
> diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
> index a0c0adf..d24435c 100644
> --- a/arch/arm/mach-omap2/board-omap3evm.c
> +++ b/arch/arm/mach-omap2/board-omap3evm.c
> @@ -459,7 +459,8 @@ static struct platform_device omap3evm_wlan_regulator = {
>
> struct wl12xx_platform_data omap3evm_wlan_data __initdata = {
> .irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
> - .board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */
> + .ref_clock_freq = 38400000,
> + .ref_clock_xtal = false,
> };
> #endif
>
> diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
> index ba00862..ac6413c 100644
> --- a/arch/arm/mach-omap2/board-omap4panda.c
> +++ b/arch/arm/mach-omap2/board-omap4panda.c
> @@ -231,7 +231,8 @@ static struct platform_device omap_vwlan_device = {
>
> static struct wl12xx_platform_data omap_panda_wlan_data __initdata = {
> .irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
> - .board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */
> + .ref_clock_freq = 38400000,
> + .ref_clock_xtal = false,
> };
>
> static struct twl6040_codec_data twl6040_codec = {
> diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c
> index ced012c..f4f4fe7 100644
> --- a/arch/arm/mach-omap2/board-zoom-peripherals.c
> +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c
> @@ -245,7 +245,8 @@ static struct platform_device *zoom_devices[] __initdata = {
>
> static struct wl12xx_platform_data omap_zoom_wlan_data __initdata = {
> .irq_flags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
> - .board_ref_clock = WL12XX_REFCLOCK_26, /* 26 MHz */
> + .ref_clock_freq = 26000000,
> + .ref_clock_xtal = false,
> };
>
> static struct omap2_hsmmc_info mmc[] = {
> diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c
> index 1c627da..903dcb3 100644
> --- a/drivers/net/wireless/ti/wl12xx/main.c
> +++ b/drivers/net/wireless/ti/wl12xx/main.c
> @@ -1701,6 +1701,42 @@ static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
> },
> };
>
> +static struct wl12xx_clock wl12xx_refclock_table[] = {
> + { 19200000, false, WL12XX_REFCLOCK_19 },
> + { 26000000, false, WL12XX_REFCLOCK_26 },
> + { 26000000, true, WL12XX_REFCLOCK_26_XTAL },
> + { 38400000, false, WL12XX_REFCLOCK_38 },
> + { 38400000, true, WL12XX_REFCLOCK_38_XTAL },
> + { 52000000, false, WL12XX_REFCLOCK_52 },
> + { 0, false, 0 }
> +};
> +
> +static struct wl12xx_clock wl12xx_tcxoclock_table[] = {
> + { 16368000, false, WL12XX_TCXOCLOCK_16_368 },
> + { 16800000, false, WL12XX_TCXOCLOCK_16_8 },
> + { 19200000, false, WL12XX_TCXOCLOCK_19_2 },
> + { 26000000, false, WL12XX_TCXOCLOCK_26 },
> + { 32736000, false, WL12XX_TCXOCLOCK_32_736 },
> + { 33600000, false, WL12XX_TCXOCLOCK_33_6 },
> + { 38400000, false, WL12XX_TCXOCLOCK_38_4 },
> + { 52000000, false, WL12XX_TCXOCLOCK_52 },
> + { 0, false, 0 }
> +};
> +
> +static int wl12xx_get_clock_idx(struct wl12xx_clock *table, u32 freq, bool xtal)
> +{
> + int i = 0;
> +
> + while(table[i].freq != 0) {
> + if ((table[i].freq == freq) &&
> + (table[i].xtal == xtal))
> + return table[i].hw_idx;
> + i++;
> + };
> +
> + return -EINVAL;
> +}
> +
> static int wl12xx_setup(struct wl1271 *wl)
> {
> struct wl12xx_priv *priv = wl->priv;
> @@ -1722,7 +1758,16 @@ static int wl12xx_setup(struct wl1271 *wl)
> wl12xx_conf_init(wl);
>
> if (!fref_param) {
> - priv->ref_clock = pdata->board_ref_clock;
> + priv->ref_clock = wl12xx_get_clock_idx(wl12xx_refclock_table,
> + pdata->ref_clock_freq,
> + pdata->ref_clock_xtal);
> + if (priv->ref_clock < 0) {
> + wl1271_error("Invalid ref_clock frequency (%d Hz, %s)",
> + pdata->ref_clock_freq,
> + pdata->ref_clock_xtal ? "XTAL" : "not XTAL");
> +
> + return priv->ref_clock;
> + }
> } else {
> if (!strcmp(fref_param, "19.2"))
> priv->ref_clock = WL12XX_REFCLOCK_19;
> @@ -1741,7 +1786,16 @@ static int wl12xx_setup(struct wl1271 *wl)
> }
>
> if (!tcxo_param) {
> - priv->tcxo_clock = pdata->board_tcxo_clock;
> + priv->tcxo_clock = wl12xx_get_clock_idx(wl12xx_tcxoclock_table,
> + pdata->tcxo_clock_freq,
> + pdata->tcxo_clock_xtal);
> + if (priv->tcxo_clock < 0) {
> + wl1271_error("Invalid tcxo_clock frequency (%d Hz, %s)",
> + pdata->tcxo_clock_freq,
> + pdata->tcxo_clock_xtal ? "XTAL" : "not XTAL");
> +
> + return priv->tcxo_clock;
> + }
> } else {
> if (!strcmp(tcxo_param, "19.2"))
> priv->tcxo_clock = WL12XX_TCXOCLOCK_19_2;
> diff --git a/drivers/net/wireless/ti/wl12xx/wl12xx.h b/drivers/net/wireless/ti/wl12xx/wl12xx.h
> index 9e5484a..05f631b 100644
> --- a/drivers/net/wireless/ti/wl12xx/wl12xx.h
> +++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h
> @@ -79,4 +79,32 @@ struct wl12xx_priv {
> struct wl127x_rx_mem_pool_addr *rx_mem_addr;
> };
>
> +/* Reference clock values */
> +enum {
> + WL12XX_REFCLOCK_19 = 0, /* 19.2 MHz */
> + WL12XX_REFCLOCK_26 = 1, /* 26 MHz */
> + WL12XX_REFCLOCK_38 = 2, /* 38.4 MHz */
> + WL12XX_REFCLOCK_52 = 3, /* 52 MHz */
> + WL12XX_REFCLOCK_38_XTAL = 4, /* 38.4 MHz, XTAL */
> + WL12XX_REFCLOCK_26_XTAL = 5, /* 26 MHz, XTAL */
> +};
> +
> +/* TCXO clock values */
> +enum {
> + WL12XX_TCXOCLOCK_19_2 = 0, /* 19.2MHz */
> + WL12XX_TCXOCLOCK_26 = 1, /* 26 MHz */
> + WL12XX_TCXOCLOCK_38_4 = 2, /* 38.4MHz */
> + WL12XX_TCXOCLOCK_52 = 3, /* 52 MHz */
> + WL12XX_TCXOCLOCK_16_368 = 4, /* 16.368 MHz */
> + WL12XX_TCXOCLOCK_32_736 = 5, /* 32.736 MHz */
> + WL12XX_TCXOCLOCK_16_8 = 6, /* 16.8 MHz */
> + WL12XX_TCXOCLOCK_33_6 = 7, /* 33.6 MHz */
> +};
> +
> +struct wl12xx_clock {
> + u32 freq;
> + bool xtal;
> + u8 hw_idx;
> +};
> +
> #endif /* __WL12XX_PRIV_H__ */
> diff --git a/include/linux/wl12xx.h b/include/linux/wl12xx.h
> index 1e4ed6e..4982b94 100644
> --- a/include/linux/wl12xx.h
> +++ b/include/linux/wl12xx.h
> @@ -26,28 +26,6 @@
>
> #include <linux/err.h>
>
> -/* Reference clock values */
> -enum {
> - WL12XX_REFCLOCK_19 = 0, /* 19.2 MHz */
> - WL12XX_REFCLOCK_26 = 1, /* 26 MHz */
> - WL12XX_REFCLOCK_38 = 2, /* 38.4 MHz */
> - WL12XX_REFCLOCK_52 = 3, /* 52 MHz */
> - WL12XX_REFCLOCK_38_XTAL = 4, /* 38.4 MHz, XTAL */
> - WL12XX_REFCLOCK_26_XTAL = 5, /* 26 MHz, XTAL */
> -};
> -
> -/* TCXO clock values */
> -enum {
> - WL12XX_TCXOCLOCK_19_2 = 0, /* 19.2MHz */
> - WL12XX_TCXOCLOCK_26 = 1, /* 26 MHz */
> - WL12XX_TCXOCLOCK_38_4 = 2, /* 38.4MHz */
> - WL12XX_TCXOCLOCK_52 = 3, /* 52 MHz */
> - WL12XX_TCXOCLOCK_16_368 = 4, /* 16.368 MHz */
> - WL12XX_TCXOCLOCK_32_736 = 5, /* 32.736 MHz */
> - WL12XX_TCXOCLOCK_16_8 = 6, /* 16.8 MHz */
> - WL12XX_TCXOCLOCK_33_6 = 7, /* 33.6 MHz */
> -};
> -
> struct wl1251_platform_data {
> void (*set_power)(bool enable);
> /* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */
> @@ -58,8 +36,10 @@ struct wl1251_platform_data {
> struct wl12xx_platform_data {
> int irq;
> unsigned long irq_flags;
> - int board_ref_clock;
> - int board_tcxo_clock;
> + int ref_clock_freq; /* in Hertz */
> + bool ref_clock_xtal; /* specify whether the clock is XTAL or not */
> + int tcxo_clock_freq; /* in Hertz */
> + bool tcxo_clock_xtal; /* specify whether the clock is XTAL or not */
> };
>
> #ifdef CONFIG_WILINK_PLATFORM_DATA
> --
> 1.7.10.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Regards,
Nishanth Menon
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v2 4/9] wl12xx: use frequency instead of enumerations for pdata clocks
2013-07-02 15:02 ` Nishanth Menon
@ 2013-07-02 20:27 ` Luciano Coelho
2013-07-03 11:33 ` Tony Lindgren
0 siblings, 1 reply; 28+ messages in thread
From: Luciano Coelho @ 2013-07-02 20:27 UTC (permalink / raw)
To: Nishanth Menon
Cc: mark.rutland, mturquette, linux-doc, tony, linux-wireless,
devicetree-discuss, nsekhar, linux-kernel, balbi, rob.herring,
grant.likely, linux-omap, linux-arm-kernel
On Tue, 2013-07-02 at 10:02 -0500, Nishanth Menon wrote:
> On 17:55-20130702, Luciano Coelho wrote:
> > Instead of defining an enumeration with the FW specific values for the
> > different clock rates, use the actual frequency instead. Also add a
> > boolean to specify whether the clock is XTAL or not.
> >
> > Change all board files to reflect this.
> >
> > Cc: Tony Lindgren <tony@atomide.com>
> > Cc: Sekhar Nori <nsekhar@ti.com>
> > Signed-off-by: Luciano Coelho <coelho@ti.com>
> > ---
> > arch/arm/mach-davinci/board-da850-evm.c | 3 +-
> > arch/arm/mach-omap2/board-4430sdp.c | 5 ++-
> ^^
> > arch/arm/mach-omap2/board-omap3evm.c | 3 +-
> > arch/arm/mach-omap2/board-omap4panda.c | 3 +-
> ^^
> Please do not add more platform data to platforms that are DT only.
Ah, I hadn't realized that board_omap4panda.c and board-4430sdp.c had
been removed in linux-next. I base my tree on wireless-next and it
doesn't contain these changes yet. I would only have noticed this when
I rebased my tree once the merge window is closed. ;)
Thanks for pointing out, I'll make sure these changes will not be there
when I send the pull request.
--
Cheers,
Luca.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v2 4/9] wl12xx: use frequency instead of enumerations for pdata clocks
2013-07-02 20:27 ` Luciano Coelho
@ 2013-07-03 11:33 ` Tony Lindgren
2013-07-03 12:14 ` Luciano Coelho
0 siblings, 1 reply; 28+ messages in thread
From: Tony Lindgren @ 2013-07-03 11:33 UTC (permalink / raw)
To: Luciano Coelho
Cc: Nishanth Menon, linux-wireless, nsekhar, mturquette, mark.rutland,
balbi, grant.likely, rob.herring, devicetree-discuss, linux-doc,
linux-kernel, linux-omap, linux-arm-kernel
* Luciano Coelho <coelho@ti.com> [130702 13:33]:
> On Tue, 2013-07-02 at 10:02 -0500, Nishanth Menon wrote:
> > On 17:55-20130702, Luciano Coelho wrote:
> > > Instead of defining an enumeration with the FW specific values for the
> > > different clock rates, use the actual frequency instead. Also add a
> > > boolean to specify whether the clock is XTAL or not.
> > >
> > > Change all board files to reflect this.
> > >
> > > Cc: Tony Lindgren <tony@atomide.com>
> > > Cc: Sekhar Nori <nsekhar@ti.com>
> > > Signed-off-by: Luciano Coelho <coelho@ti.com>
> > > ---
> > > arch/arm/mach-davinci/board-da850-evm.c | 3 +-
> > > arch/arm/mach-omap2/board-4430sdp.c | 5 ++-
> > ^^
> > > arch/arm/mach-omap2/board-omap3evm.c | 3 +-
> > > arch/arm/mach-omap2/board-omap4panda.c | 3 +-
> > ^^
> > Please do not add more platform data to platforms that are DT only.
>
> Ah, I hadn't realized that board_omap4panda.c and board-4430sdp.c had
> been removed in linux-next. I base my tree on wireless-next and it
> doesn't contain these changes yet. I would only have noticed this when
> I rebased my tree once the merge window is closed. ;)
>
> Thanks for pointing out, I'll make sure these changes will not be there
> when I send the pull request.
Please separate out the minimal pdata and arch/arm/mach-omap2 changes int
a immutable branch on v3.11-rc1 that I can also pull in. For v3.12, we're
going to be making more boards device tree only, so these changes may
otherwise cause pointless merge conflicts.
Regards,
Tony
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v2 4/9] wl12xx: use frequency instead of enumerations for pdata clocks
2013-07-03 11:33 ` Tony Lindgren
@ 2013-07-03 12:14 ` Luciano Coelho
0 siblings, 0 replies; 28+ messages in thread
From: Luciano Coelho @ 2013-07-03 12:14 UTC (permalink / raw)
To: Tony Lindgren
Cc: Nishanth Menon, mark.rutland, mturquette, linux-doc,
linux-wireless, devicetree-discuss, nsekhar, linux-kernel, balbi,
rob.herring, grant.likely, linux-omap, linux-arm-kernel
On Wed, 2013-07-03 at 04:33 -0700, Tony Lindgren wrote:
> * Luciano Coelho <coelho@ti.com> [130702 13:33]:
> > On Tue, 2013-07-02 at 10:02 -0500, Nishanth Menon wrote:
> > > On 17:55-20130702, Luciano Coelho wrote:
> > > > Instead of defining an enumeration with the FW specific values for the
> > > > different clock rates, use the actual frequency instead. Also add a
> > > > boolean to specify whether the clock is XTAL or not.
> > > >
> > > > Change all board files to reflect this.
> > > >
> > > > Cc: Tony Lindgren <tony@atomide.com>
> > > > Cc: Sekhar Nori <nsekhar@ti.com>
> > > > Signed-off-by: Luciano Coelho <coelho@ti.com>
> > > > ---
> > > > arch/arm/mach-davinci/board-da850-evm.c | 3 +-
> > > > arch/arm/mach-omap2/board-4430sdp.c | 5 ++-
> > > ^^
> > > > arch/arm/mach-omap2/board-omap3evm.c | 3 +-
> > > > arch/arm/mach-omap2/board-omap4panda.c | 3 +-
> > > ^^
> > > Please do not add more platform data to platforms that are DT only.
> >
> > Ah, I hadn't realized that board_omap4panda.c and board-4430sdp.c had
> > been removed in linux-next. I base my tree on wireless-next and it
> > doesn't contain these changes yet. I would only have noticed this when
> > I rebased my tree once the merge window is closed. ;)
> >
> > Thanks for pointing out, I'll make sure these changes will not be there
> > when I send the pull request.
>
> Please separate out the minimal pdata and arch/arm/mach-omap2 changes int
> a immutable branch on v3.11-rc1 that I can also pull in. For v3.12, we're
> going to be making more boards device tree only, so these changes may
> otherwise cause pointless merge conflicts.
Okay. I don't want to freeze my work, I'll continue using my
wireless-based tree (which is based on 3.10) for now. When the merge
window closes, I'll reorganize all this before sending pull requests, so
we can avoid conflicts.
Please ignore my changes to board files that will disappear on 3.11 and
keep reviewing the rest. ;)
--
Cheers,
Luca.
^ permalink raw reply [flat|nested] 28+ messages in thread
[parent not found: <1372776948-24840-5-git-send-email-coelho-l0cyMroinI0@public.gmane.org>]
* Re: [PATCH v2 4/9] wl12xx: use frequency instead of enumerations for pdata clocks
[not found] ` <1372776948-24840-5-git-send-email-coelho-l0cyMroinI0@public.gmane.org>
@ 2013-07-02 15:31 ` Felipe Balbi
2013-07-02 20:14 ` Luciano Coelho
0 siblings, 1 reply; 28+ messages in thread
From: Felipe Balbi @ 2013-07-02 15:31 UTC (permalink / raw)
To: Luciano Coelho
Cc: linux-wireless-u79uwXL29TY76Z2rM5mHXA,
tony-4v6yS6AI5VpBDgjK7y7TUQ, nsekhar-l0cyMroinI0,
mturquette-QSEj5FYQhm4dnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
balbi-l0cyMroinI0, grant.likely-QSEj5FYQhm4dnm+yROfE0A,
rob.herring-bsGFqQB8/DxBDgjK7y7TUQ,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-doc-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-omap-u79uwXL29TY76Z2rM5mHXA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
[-- Attachment #1: Type: text/plain, Size: 864 bytes --]
Hi,
On Tue, Jul 02, 2013 at 05:55:43PM +0300, Luciano Coelho wrote:
> diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c
> index 1c627da..903dcb3 100644
> --- a/drivers/net/wireless/ti/wl12xx/main.c
> +++ b/drivers/net/wireless/ti/wl12xx/main.c
> @@ -1701,6 +1701,42 @@ static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
> },
> };
>
> +static struct wl12xx_clock wl12xx_refclock_table[] = {
const
> + { 19200000, false, WL12XX_REFCLOCK_19 },
> + { 26000000, false, WL12XX_REFCLOCK_26 },
> + { 26000000, true, WL12XX_REFCLOCK_26_XTAL },
> + { 38400000, false, WL12XX_REFCLOCK_38 },
> + { 38400000, true, WL12XX_REFCLOCK_38_XTAL },
> + { 52000000, false, WL12XX_REFCLOCK_52 },
> + { 0, false, 0 }
> +};
> +
> +static struct wl12xx_clock wl12xx_tcxoclock_table[] = {
const
--
balbi
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v2 4/9] wl12xx: use frequency instead of enumerations for pdata clocks
2013-07-02 15:31 ` Felipe Balbi
@ 2013-07-02 20:14 ` Luciano Coelho
0 siblings, 0 replies; 28+ messages in thread
From: Luciano Coelho @ 2013-07-02 20:14 UTC (permalink / raw)
To: balbi
Cc: linux-wireless, tony, nsekhar, mturquette, mark.rutland,
grant.likely, rob.herring, devicetree-discuss, linux-doc,
linux-kernel, linux-omap, linux-arm-kernel
On Tue, 2013-07-02 at 18:31 +0300, Felipe Balbi wrote:
> Hi,
>
> On Tue, Jul 02, 2013 at 05:55:43PM +0300, Luciano Coelho wrote:
> > diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c
> > index 1c627da..903dcb3 100644
> > --- a/drivers/net/wireless/ti/wl12xx/main.c
> > +++ b/drivers/net/wireless/ti/wl12xx/main.c
> > @@ -1701,6 +1701,42 @@ static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
> > },
> > };
> >
> > +static struct wl12xx_clock wl12xx_refclock_table[] = {
>
> const
>
> > + { 19200000, false, WL12XX_REFCLOCK_19 },
> > + { 26000000, false, WL12XX_REFCLOCK_26 },
> > + { 26000000, true, WL12XX_REFCLOCK_26_XTAL },
> > + { 38400000, false, WL12XX_REFCLOCK_38 },
> > + { 38400000, true, WL12XX_REFCLOCK_38_XTAL },
> > + { 52000000, false, WL12XX_REFCLOCK_52 },
> > + { 0, false, 0 }
> > +};
> > +
> > +static struct wl12xx_clock wl12xx_tcxoclock_table[] = {
>
> const
Duh! Thanks for noticing it.
--
Luca.
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v2 6/9] wlcore: add initial device tree support to the sdio module
[not found] ` <1372776948-24840-1-git-send-email-coelho-l0cyMroinI0@public.gmane.org>
` (2 preceding siblings ...)
2013-07-02 14:55 ` [PATCH v2 4/9] wl12xx: use frequency instead of enumerations for pdata clocks Luciano Coelho
@ 2013-07-02 14:55 ` Luciano Coelho
3 siblings, 0 replies; 28+ messages in thread
From: Luciano Coelho @ 2013-07-02 14:55 UTC (permalink / raw)
To: linux-wireless-u79uwXL29TY76Z2rM5mHXA,
tony-4v6yS6AI5VpBDgjK7y7TUQ, nsekhar-l0cyMroinI0
Cc: coelho-l0cyMroinI0, mturquette-QSEj5FYQhm4dnm+yROfE0A,
linux-doc-u79uwXL29TY76Z2rM5mHXA,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, balbi-l0cyMroinI0,
grant.likely-QSEj5FYQhm4dnm+yROfE0A,
linux-omap-u79uwXL29TY76Z2rM5mHXA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
If platform data is not available, try to get the required information
from the device tree. Register an OF match table and parse the
appropriate device tree nodes.
Parse interrupt property only, for now.
Signed-off-by: Luciano Coelho <coelho-l0cyMroinI0@public.gmane.org>
---
drivers/net/wireless/ti/wlcore/sdio.c | 69 ++++++++++++++++++++++++++++++---
1 file changed, 63 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/ti/wlcore/sdio.c b/drivers/net/wireless/ti/wlcore/sdio.c
index 4c7e8ac..9370d7e 100644
--- a/drivers/net/wireless/ti/wlcore/sdio.c
+++ b/drivers/net/wireless/ti/wlcore/sdio.c
@@ -30,7 +30,7 @@
#include <linux/mmc/sdio_ids.h>
#include <linux/mmc/card.h>
#include <linux/mmc/host.h>
-#include <linux/gpio.h>
+#include <linux/of_irq.h>
#include <linux/wl12xx.h>
#include <linux/pm_runtime.h>
#include <linux/printk.h>
@@ -214,6 +214,43 @@ static struct wl1271_if_operations sdio_ops = {
.set_block_size = wl1271_sdio_set_block_size,
};
+static struct wl12xx_platform_data *wlcore_get_pdata_from_of(struct device *dev)
+{
+ struct wl12xx_platform_data *pdata;
+ struct device_node *np = dev->of_node;
+
+ if (!np) {
+ np = of_find_matching_node(NULL, dev->driver->of_match_table);
+ if (!np) {
+ dev_notice(dev, "device tree node not available\n");
+ pdata = ERR_PTR(-ENODEV);
+ goto out;
+ }
+ }
+
+ pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
+ if (!pdata) {
+ dev_err(dev, "can't allocate platform data\n");
+ pdata = ERR_PTR(-ENODEV);
+ goto out;
+ }
+
+ pdata->irq = irq_of_parse_and_map(np, 0);
+ if (pdata->irq < 0) {
+ dev_err(dev, "can't get interrupt gpio from the device tree\n");
+ goto out_free;
+ }
+
+ goto out;
+
+out_free:
+ kfree(pdata);
+ pdata = ERR_PTR(-ENODEV);
+
+out:
+ return pdata;
+}
+
static int wl1271_probe(struct sdio_func *func,
const struct sdio_device_id *id)
{
@@ -248,11 +285,22 @@ static int wl1271_probe(struct sdio_func *func,
/* Use block mode for transferring over one block size of data */
func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
+ /* The pdata allocated here is freed when the device is freed,
+ * so we don't need an additional out label to free it in case
+ * of error further on.
+ */
+
+ /* Try to get legacy platform data from the board file */
pdev_data->pdata = wl12xx_get_platform_data();
if (IS_ERR(pdev_data->pdata)) {
- ret = PTR_ERR(pdev_data->pdata);
- dev_err(glue->dev, "missing wlan platform data: %d\n", ret);
- goto out_free_glue;
+ dev_info(&func->dev,
+ "legacy platform data not found, trying device tree\n");
+
+ pdev_data->pdata = wlcore_get_pdata_from_of(&func->dev);
+ if (IS_ERR(pdev_data->pdata)) {
+ dev_err(&func->dev, "can't get platform data\n");
+ goto out_free_glue;
+ }
}
/* if sdio can keep power while host is suspended, enable wow */
@@ -386,16 +434,25 @@ static const struct dev_pm_ops wl1271_sdio_pm_ops = {
};
#endif
+static const struct of_device_id wlcore_sdio_of_match_table[] = {
+ { .compatible = "ti,wilink6" },
+ { .compatible = "ti,wilink7" },
+ { .compatible = "ti,wilink8" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, wlcore_sdio_of_match_table);
+
static struct sdio_driver wl1271_sdio_driver = {
.name = "wl1271_sdio",
.id_table = wl1271_devices,
.probe = wl1271_probe,
.remove = wl1271_remove,
-#ifdef CONFIG_PM
.drv = {
+#ifdef CONFIG_PM
.pm = &wl1271_sdio_pm_ops,
- },
#endif
+ .of_match_table = of_match_ptr(wlcore_sdio_of_match_table),
+ },
};
static int __init wl1271_init(void)
--
1.7.10.4
^ permalink raw reply related [flat|nested] 28+ messages in thread