[PATCHv2 2/5] wl1251: move power GPIO handling into the driver
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
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