[PATCHv2 2/5] wl1251: move power GPIO handling into the driver

2014-02-14 Thread Sebastian Reichel
Move the power GPIO handling from the board code into
the driver. This is a dependency for device tree support.

Signed-off-by: Sebastian Reichel s...@debian.org
Reviewed-by: Pavel Machek pa...@ucw.cz
Acked-by: Tony Lindgren t...@atomide.com
---
 arch/arm/mach-omap2/board-omap3pandora.c |  2 ++
 arch/arm/mach-omap2/board-rx51-peripherals.c | 11 ++
 drivers/net/wireless/ti/wl1251/sdio.c| 21 +-
 drivers/net/wireless/ti/wl1251/spi.c | 33 ++--
 drivers/net/wireless/ti/wl1251/wl1251.h  |  2 +-
 include/linux/wl12xx.h   |  2 +-
 6 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/arch/arm/mach-omap2/board-omap3pandora.c 
b/arch/arm/mach-omap2/board-omap3pandora.c
index 24f3c1b..cf18340 100644
--- a/arch/arm/mach-omap2/board-omap3pandora.c
+++ b/arch/arm/mach-omap2/board-omap3pandora.c
@@ -541,6 +541,8 @@ static void __init pandora_wl1251_init(void)
 
memset(pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata));
 
+   pandora_wl1251_pdata.power_gpio = -1;
+
ret = gpio_request_one(PANDORA_WIFI_IRQ_GPIO, GPIOF_IN, wl1251 irq);
if (ret  0)
goto fail;
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c 
b/arch/arm/mach-omap2/board-rx51-peripherals.c
index e05e740..ddfc8df 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -1173,13 +1173,7 @@ static inline void board_smc91x_init(void)
 
 #endif
 
-static void rx51_wl1251_set_power(bool enable)
-{
-   gpio_set_value(RX51_WL1251_POWER_GPIO, enable);
-}
-
 static struct gpio rx51_wl1251_gpios[] __initdata = {
-   { RX51_WL1251_POWER_GPIO, GPIOF_OUT_INIT_LOW,   wl1251 power  },
{ RX51_WL1251_IRQ_GPIO,   GPIOF_IN, wl1251 irq},
 };
 
@@ -1196,17 +1190,16 @@ static void __init rx51_init_wl1251(void)
if (irq  0)
goto err_irq;
 
-   wl1251_pdata.set_power = rx51_wl1251_set_power;
+   wl1251_pdata.power_gpio = RX51_WL1251_POWER_GPIO;
rx51_peripherals_spi_board_info[RX51_SPI_WL1251].irq = irq;
 
return;
 
 err_irq:
gpio_free(RX51_WL1251_IRQ_GPIO);
-   gpio_free(RX51_WL1251_POWER_GPIO);
 error:
printk(KERN_ERR wl1251 board initialisation failed\n);
-   wl1251_pdata.set_power = NULL;
+   wl1251_pdata.power_gpio = -1;
 
/*
 * Now rx51_peripherals_spi_board_info[1].irq is zero and
diff --git a/drivers/net/wireless/ti/wl1251/sdio.c 
b/drivers/net/wireless/ti/wl1251/sdio.c
index b75a37a..b661f89 100644
--- a/drivers/net/wireless/ti/wl1251/sdio.c
+++ b/drivers/net/wireless/ti/wl1251/sdio.c
@@ -28,6 +28,7 @@
 #include linux/wl12xx.h
 #include linux/irq.h
 #include linux/pm_runtime.h
+#include linux/gpio.h
 
 #include wl1251.h
 
@@ -182,8 +183,9 @@ static int wl1251_sdio_set_power(struct wl1251 *wl, bool 
enable)
 * callback in case it wants to do any additional setup,
 * for example enabling clock buffer for the module.
 */
-   if (wl-set_power)
-   wl-set_power(true);
+   if (gpio_is_valid(wl-power_gpio))
+   gpio_set_value(wl-power_gpio, true);
+
 
ret = pm_runtime_get_sync(func-dev);
if (ret  0) {
@@ -203,8 +205,8 @@ static int wl1251_sdio_set_power(struct wl1251 *wl, bool 
enable)
if (ret  0)
goto out;
 
-   if (wl-set_power)
-   wl-set_power(false);
+   if (gpio_is_valid(wl-power_gpio))
+   gpio_set_value(wl-power_gpio, false);
}
 
 out:
@@ -256,11 +258,20 @@ static int wl1251_sdio_probe(struct sdio_func *func,
 
wl1251_board_data = wl1251_get_platform_data();
if (!IS_ERR(wl1251_board_data)) {
-   wl-set_power = wl1251_board_data-set_power;
+   wl-power_gpio = wl1251_board_data-power_gpio;
wl-irq = wl1251_board_data-irq;
wl-use_eeprom = wl1251_board_data-use_eeprom;
}
 
+   if (gpio_is_valid(wl-power_gpio)) {
+   ret = devm_gpio_request(func-dev, wl-power_gpio,
+   wl1251 power);
+   if (ret) {
+   wl1251_error(Failed to request gpio: %d\n, ret);
+   goto disable;
+   }
+   }
+
if (wl-irq) {
irq_set_status_flags(wl-irq, IRQ_NOAUTOEN);
ret = request_irq(wl-irq, wl1251_line_irq, 0, wl1251, wl);
diff --git a/drivers/net/wireless/ti/wl1251/spi.c 
b/drivers/net/wireless/ti/wl1251/spi.c
index 62403a1..6abcbc3 100644
--- a/drivers/net/wireless/ti/wl1251/spi.c
+++ b/drivers/net/wireless/ti/wl1251/spi.c
@@ -26,6 +26,7 @@
 #include linux/crc7.h
 #include linux/spi/spi.h
 #include linux/wl12xx.h
+#include linux/gpio.h
 
 #include wl1251.h
 

[PATCHv2 2/5] wl1251: move power GPIO handling into the driver

2013-12-05 Thread Sebastian Reichel
Move the power GPIO handling from the board code into
the driver. This is a dependency for device tree support.

Signed-off-by: Sebastian Reichel s...@debian.org
Reviewed-by: Pavel Machek pa...@ucw.cz
---
 arch/arm/mach-omap2/board-omap3pandora.c |  2 ++
 arch/arm/mach-omap2/board-rx51-peripherals.c | 11 ++
 drivers/net/wireless/ti/wl1251/sdio.c| 21 +-
 drivers/net/wireless/ti/wl1251/spi.c | 33 ++--
 drivers/net/wireless/ti/wl1251/wl1251.h  |  2 +-
 include/linux/wl12xx.h   |  2 +-
 6 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/arch/arm/mach-omap2/board-omap3pandora.c 
b/arch/arm/mach-omap2/board-omap3pandora.c
index 24f3c1b..cf18340 100644
--- a/arch/arm/mach-omap2/board-omap3pandora.c
+++ b/arch/arm/mach-omap2/board-omap3pandora.c
@@ -541,6 +541,8 @@ static void __init pandora_wl1251_init(void)
 
memset(pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata));
 
+   pandora_wl1251_pdata.power_gpio = -1;
+
ret = gpio_request_one(PANDORA_WIFI_IRQ_GPIO, GPIOF_IN, wl1251 irq);
if (ret  0)
goto fail;
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c 
b/arch/arm/mach-omap2/board-rx51-peripherals.c
index 01e8bef..6538184 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -1166,13 +1166,7 @@ static inline void board_smc91x_init(void)
 
 #endif
 
-static void rx51_wl1251_set_power(bool enable)
-{
-   gpio_set_value(RX51_WL1251_POWER_GPIO, enable);
-}
-
 static struct gpio rx51_wl1251_gpios[] __initdata = {
-   { RX51_WL1251_POWER_GPIO, GPIOF_OUT_INIT_LOW,   wl1251 power  },
{ RX51_WL1251_IRQ_GPIO,   GPIOF_IN, wl1251 irq},
 };
 
@@ -1189,17 +1183,16 @@ static void __init rx51_init_wl1251(void)
if (irq  0)
goto err_irq;
 
-   wl1251_pdata.set_power = rx51_wl1251_set_power;
+   wl1251_pdata.power_gpio = RX51_WL1251_POWER_GPIO;
rx51_peripherals_spi_board_info[RX51_SPI_WL1251].irq = irq;
 
return;
 
 err_irq:
gpio_free(RX51_WL1251_IRQ_GPIO);
-   gpio_free(RX51_WL1251_POWER_GPIO);
 error:
printk(KERN_ERR wl1251 board initialisation failed\n);
-   wl1251_pdata.set_power = NULL;
+   wl1251_pdata.power_gpio = -1;
 
/*
 * Now rx51_peripherals_spi_board_info[1].irq is zero and
diff --git a/drivers/net/wireless/ti/wl1251/sdio.c 
b/drivers/net/wireless/ti/wl1251/sdio.c
index b75a37a..b661f89 100644
--- a/drivers/net/wireless/ti/wl1251/sdio.c
+++ b/drivers/net/wireless/ti/wl1251/sdio.c
@@ -28,6 +28,7 @@
 #include linux/wl12xx.h
 #include linux/irq.h
 #include linux/pm_runtime.h
+#include linux/gpio.h
 
 #include wl1251.h
 
@@ -182,8 +183,9 @@ static int wl1251_sdio_set_power(struct wl1251 *wl, bool 
enable)
 * callback in case it wants to do any additional setup,
 * for example enabling clock buffer for the module.
 */
-   if (wl-set_power)
-   wl-set_power(true);
+   if (gpio_is_valid(wl-power_gpio))
+   gpio_set_value(wl-power_gpio, true);
+
 
ret = pm_runtime_get_sync(func-dev);
if (ret  0) {
@@ -203,8 +205,8 @@ static int wl1251_sdio_set_power(struct wl1251 *wl, bool 
enable)
if (ret  0)
goto out;
 
-   if (wl-set_power)
-   wl-set_power(false);
+   if (gpio_is_valid(wl-power_gpio))
+   gpio_set_value(wl-power_gpio, false);
}
 
 out:
@@ -256,11 +258,20 @@ static int wl1251_sdio_probe(struct sdio_func *func,
 
wl1251_board_data = wl1251_get_platform_data();
if (!IS_ERR(wl1251_board_data)) {
-   wl-set_power = wl1251_board_data-set_power;
+   wl-power_gpio = wl1251_board_data-power_gpio;
wl-irq = wl1251_board_data-irq;
wl-use_eeprom = wl1251_board_data-use_eeprom;
}
 
+   if (gpio_is_valid(wl-power_gpio)) {
+   ret = devm_gpio_request(func-dev, wl-power_gpio,
+   wl1251 power);
+   if (ret) {
+   wl1251_error(Failed to request gpio: %d\n, ret);
+   goto disable;
+   }
+   }
+
if (wl-irq) {
irq_set_status_flags(wl-irq, IRQ_NOAUTOEN);
ret = request_irq(wl-irq, wl1251_line_irq, 0, wl1251, wl);
diff --git a/drivers/net/wireless/ti/wl1251/spi.c 
b/drivers/net/wireless/ti/wl1251/spi.c
index 62403a1..6abcbc3 100644
--- a/drivers/net/wireless/ti/wl1251/spi.c
+++ b/drivers/net/wireless/ti/wl1251/spi.c
@@ -26,6 +26,7 @@
 #include linux/crc7.h
 #include linux/spi/spi.h
 #include linux/wl12xx.h
+#include linux/gpio.h
 
 #include wl1251.h
 #include reg.h
@@ -221,8 +222,8 @@ static void