This enables ath9k's built-in GPIO controller for all chip versions
(instead of an explicit whitelist). This also allows us to get rid of
some duplicate code between hw.c and gpio.c because hw.c already
determines the number of GPIOs.
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
#ifdef CPTCFG_ATH9K_DEBUGFS
--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
#ifdef CPTCFG_ATH9K_DEBUGFS
--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
#include "ath9k.h"
#include <linux/ath9k_platform.h>
#include "ath9k.h"
#include <linux/ath9k_platform.h>
+static void ath9k_register_gpio_chip(struct ath_softc *sc)
+{
+ struct ath9k_gpio_chip *gc;
+static void ath9k_register_gpio_chip(struct ath_softc *sc)
+{
+ struct ath9k_gpio_chip *gc;
-+ u16 ng;
-+
-+ /* supported chips are AR9280, AR9285 and AR9287 */
-+ if (AR_SREV_9287(sc->sc_ah))
-+ ng = AR9287_NUM_GPIO;
-+ else if (AR_SREV_9285(sc->sc_ah))
-+ ng = AR9285_NUM_GPIO;
-+ else if (AR_SREV_9280(sc->sc_ah))
-+ ng = AR9280_NUM_GPIO;
-+ else
-+ return;
++ struct ath_hw *ah = sc->sc_ah;
+
+ gc = kzalloc(sizeof(struct ath9k_gpio_chip), GFP_KERNEL);
+ if (!gc)
+
+ gc = kzalloc(sizeof(struct ath9k_gpio_chip), GFP_KERNEL);
+ if (!gc)
+ wiphy_name(sc->hw->wiphy));
+ gc->gchip.label = gc->label;
+ gc->gchip.base = -1; /* determine base automatically */
+ wiphy_name(sc->hw->wiphy));
+ gc->gchip.label = gc->label;
+ gc->gchip.base = -1; /* determine base automatically */
++ gc->gchip.ngpio = ah->caps.num_gpio_pins;
+ gc->gchip.direction_input = ath9k_gpio_pin_cfg_input;
+ gc->gchip.direction_output = ath9k_gpio_pin_cfg_output;
+ gc->gchip.get_direction = ath9k_gpio_pin_get_dir;
+ gc->gchip.direction_input = ath9k_gpio_pin_cfg_input;
+ gc->gchip.direction_output = ath9k_gpio_pin_cfg_output;
+ gc->gchip.get_direction = ath9k_gpio_pin_get_dir;
static void ath_fill_led_pin(struct ath_softc *sc)
{
struct ath_hw *ah = sc->sc_ah;
static void ath_fill_led_pin(struct ath_softc *sc)
{
struct ath_hw *ah = sc->sc_ah;
-@@ -80,6 +207,12 @@ static int ath_add_led(struct ath_softc
+@@ -80,6 +197,12 @@ static int ath_add_led(struct ath_softc
else
ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
else
ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
-@@ -136,12 +269,18 @@ void ath_deinit_leds(struct ath_softc *s
+@@ -136,12 +259,18 @@ void ath_deinit_leds(struct ath_softc *s
while (!list_empty(&sc->leds)) {
led = list_first_entry(&sc->leds, struct ath_led, list);
while (!list_empty(&sc->leds)) {
led = list_first_entry(&sc->leds, struct ath_led, list);
}
void ath_init_leds(struct ath_softc *sc)
}
void ath_init_leds(struct ath_softc *sc)
-@@ -158,6 +297,8 @@ void ath_init_leds(struct ath_softc *sc)
+@@ -158,6 +287,8 @@ void ath_init_leds(struct ath_softc *sc)
if (pdata && pdata->led_name)
strncpy(led_name, pdata->led_name, sizeof(led_name));
else
if (pdata && pdata->led_name)
strncpy(led_name, pdata->led_name, sizeof(led_name));
else
-@@ -178,6 +319,7 @@ void ath_init_leds(struct ath_softc *sc)
+@@ -178,6 +309,7 @@ void ath_init_leds(struct ath_softc *sc)
for (i = 0; i < pdata->num_leds; i++)
ath_create_platform_led(sc, &pdata->leds[i]);
}
for (i = 0; i < pdata->num_leds; i++)
ath_create_platform_led(sc, &pdata->leds[i]);
}
#ifdef CPTCFG_MAC80211_LEDS
#ifdef CPTCFG_MAC80211_LEDS
-@@ -134,6 +136,64 @@ static void ath9k_unregister_gpio_chip(s
+@@ -124,6 +126,64 @@ static void ath9k_unregister_gpio_chip(s
#else /* CONFIG_GPIOLIB */
static inline void ath9k_register_gpio_chip(struct ath_softc *sc)
#else /* CONFIG_GPIOLIB */
static inline void ath9k_register_gpio_chip(struct ath_softc *sc)
-@@ -144,6 +204,14 @@ static inline void ath9k_unregister_gpio
+@@ -134,6 +194,14 @@ static inline void ath9k_unregister_gpio
#endif /* CONFIG_GPIOLIB */
/********************************/
#endif /* CONFIG_GPIOLIB */
/********************************/
-@@ -267,6 +335,7 @@ void ath_deinit_leds(struct ath_softc *s
+@@ -257,6 +325,7 @@ void ath_deinit_leds(struct ath_softc *s
while (!list_empty(&sc->leds)) {
led = list_first_entry(&sc->leds, struct ath_led, list);
#ifdef CONFIG_GPIOLIB
while (!list_empty(&sc->leds)) {
led = list_first_entry(&sc->leds, struct ath_led, list);
#ifdef CONFIG_GPIOLIB
-@@ -298,6 +367,7 @@ void ath_init_leds(struct ath_softc *sc)
+@@ -288,6 +357,7 @@ void ath_init_leds(struct ath_softc *sc)
ath_fill_led_pin(sc);
ath9k_register_gpio_chip(sc);
ath_fill_led_pin(sc);
ath9k_register_gpio_chip(sc);
if (pdata && pdata->led_name)
strncpy(led_name, pdata->led_name, sizeof(led_name));
if (pdata && pdata->led_name)
strncpy(led_name, pdata->led_name, sizeof(led_name));
-@@ -313,7 +383,7 @@ void ath_init_leds(struct ath_softc *sc)
+@@ -303,7 +373,7 @@ void ath_init_leds(struct ath_softc *sc)
ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
!sc->sc_ah->config.led_active_high);
ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
!sc->sc_ah->config.led_active_high);