aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2016-03-07 09:20:22 +0000
committerFelix Fietkau <nbd@openwrt.org>2016-03-07 09:20:22 +0000
commit2cfd943fe9074c3bfd1c293222d7de381e2f1576 (patch)
tree128b1703009889d3222e0ca646585d0e6d5c5942 /package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
parent4802f611cb0ad73f5ac569d94567e5f5ed8024da (diff)
downloadupstream-2cfd943fe9074c3bfd1c293222d7de381e2f1576.tar.gz
upstream-2cfd943fe9074c3bfd1c293222d7de381e2f1576.tar.bz2
upstream-2cfd943fe9074c3bfd1c293222d7de381e2f1576.zip
mac80211: rework gpio chip/button support to build on platforms without CONFIG_GPIOLIB
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 48938
Diffstat (limited to 'package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch')
-rw-r--r--package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch243
1 files changed, 0 insertions, 243 deletions
diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
deleted file mode 100644
index 55bb991183..0000000000
--- a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
+++ /dev/null
@@ -1,243 +0,0 @@
-From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
-Date: Sun, 31 Jan 2016 21:01:31 +0100
-Subject: [PATCH v4 4/8] mac80211: ath9k: enable access to GPIO
-
-Enable access to GPIO chip and its pins for Atheros AR92xx
-wireless devices. For now AR9285 and AR9287 are supported.
-
-Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
----
- ath9k.h | 23 ++++++++++++
- gpio.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- init.c | 2 +
- 3 files changed, 146 insertions(+)
-
---- a/drivers/net/wireless/ath/ath9k/ath9k.h
-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -24,6 +24,7 @@
- #include <linux/completion.h>
- #include <linux/time.h>
- #include <linux/hw_random.h>
-+#include <linux/gpio/driver.h>
-
- #include "common.h"
- #include "debug.h"
-@@ -817,6 +818,13 @@ void ath_fill_led_pin(struct ath_softc *
- int ath_create_gpio_led(struct ath_softc *sc, int gpio, const char *name,
- const char *trigger, bool active_low);
-
-+/***************/
-+/* GPIO Chip */
-+/***************/
-+
-+void ath9k_register_gpio_chip(struct ath_softc *sc);
-+void ath9k_unregister_gpio_chip(struct ath_softc *sc);
-+
- #else
- static inline void ath_init_leds(struct ath_softc *sc)
- {
-@@ -828,6 +836,14 @@ static inline void ath_deinit_leds(struc
- static inline void ath_fill_led_pin(struct ath_softc *sc)
- {
- }
-+
-+static inline void ath9k_register_gpio_chip(struct ath_softc *sc)
-+{
-+}
-+
-+static inline void ath9k_unregister_gpio_chip(struct ath_softc *sc)
-+{
-+}
- #endif
-
- /************************/
-@@ -963,6 +979,12 @@ struct ath_led {
- struct led_classdev cdev;
- };
-
-+struct ath9k_gpio_chip {
-+ struct ath_softc *sc;
-+ char label[32];
-+ struct gpio_chip gchip;
-+};
-+
- struct ath_softc {
- struct ieee80211_hw *hw;
- struct device *dev;
-@@ -1017,6 +1039,7 @@ struct ath_softc {
- #ifdef CPTCFG_MAC80211_LEDS
- const char *led_default_trigger;
- struct list_head leds;
-+ struct ath9k_gpio_chip *gpiochip;
- #endif
-
- #ifdef CPTCFG_ATH9K_DEBUGFS
---- a/drivers/net/wireless/ath/ath9k/gpio.c
-+++ b/drivers/net/wireless/ath/ath9k/gpio.c
-@@ -22,6 +22,9 @@
- /********************************/
-
- #ifdef CPTCFG_MAC80211_LEDS
-+
-+#include <asm-generic/gpio.h>
-+
- static void ath_led_brightness(struct led_classdev *led_cdev,
- enum led_brightness brightness)
- {
-@@ -60,6 +63,10 @@ static int ath_add_led(struct ath_softc
- else
- ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
-
-+ /* If there is GPIO chip configured, reserve LED pin */
-+ if (sc->gpiochip)
-+ gpio_request(sc->gpiochip->gchip.base + gpio->gpio, gpio->name);
-+
- return 0;
- }
-
-@@ -116,6 +123,9 @@ void ath_deinit_leds(struct ath_softc *s
-
- while (!list_empty(&sc->leds)) {
- led = list_first_entry(&sc->leds, struct ath_led, list);
-+ /* If there is GPIO chip configured, free LED pin */
-+ if (sc->gpiochip)
-+ gpio_free(sc->gpiochip->gchip.base + led->gpio->gpio);
- list_del(&led->list);
- ath_led_brightness(&led->cdev, LED_OFF);
- led_classdev_unregister(&led->cdev);
-@@ -186,6 +196,117 @@ void ath_fill_led_pin(struct ath_softc *
- /* LED off, active low */
- ath9k_hw_set_gpio(ah, ah->led_pin, (ah->config.led_active_high) ? 0 : 1);
- }
-+
-+/***************/
-+/* GPIO Chip */
-+/***************/
-+
-+/* gpio_chip handler : set GPIO to input */
-+static int ath9k_gpio_pin_cfg_input(struct gpio_chip *chip, unsigned offset)
-+{
-+ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
-+ gchip);
-+
-+ ath9k_hw_cfg_gpio_input(gc->sc->sc_ah, offset);
-+
-+ return 0;
-+}
-+
-+/* gpio_chip handler : set GPIO to output */
-+static int ath9k_gpio_pin_cfg_output(struct gpio_chip *chip, unsigned offset,
-+ int value)
-+{
-+ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
-+ gchip);
-+
-+ ath9k_hw_cfg_output(gc->sc->sc_ah, offset,
-+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
-+ ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value);
-+
-+ return 0;
-+}
-+
-+/* gpio_chip handler : query GPIO direction (0=out, 1=in) */
-+static int ath9k_gpio_pin_get_dir(struct gpio_chip *chip, unsigned offset)
-+{
-+ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
-+ gchip);
-+ struct ath_hw *ah = gc->sc->sc_ah;
-+
-+ return !((REG_READ(ah, AR_GPIO_OE_OUT) >> (offset * 2)) & 3);
-+}
-+
-+/* gpio_chip handler : get GPIO pin value */
-+static int ath9k_gpio_pin_get(struct gpio_chip *chip, unsigned offset)
-+{
-+ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
-+ gchip);
-+
-+ return ath9k_hw_gpio_get(gc->sc->sc_ah, offset);
-+}
-+
-+/* gpio_chip handler : set GPIO pin to value */
-+static void ath9k_gpio_pin_set(struct gpio_chip *chip, unsigned offset,
-+ int value)
-+{
-+ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
-+ gchip);
-+
-+ ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value);
-+}
-+
-+/* register GPIO chip */
-+void ath9k_register_gpio_chip(struct ath_softc *sc)
-+{
-+ struct ath9k_gpio_chip *gc;
-+ u16 ng;
-+
-+ /* for now only AR9285 and AR9287 are recognized */
-+ if (AR_SREV_9287(sc->sc_ah))
-+ ng = AR9287_NUM_GPIO;
-+ else if (AR_SREV_9285(sc->sc_ah))
-+ ng = AR9285_NUM_GPIO;
-+ else
-+ return;
-+
-+ gc = kzalloc(sizeof(struct ath9k_gpio_chip), GFP_KERNEL);
-+ if (!gc)
-+ return;
-+
-+ snprintf(gc->label, sizeof(gc->label), "ath9k-%s",
-+ wiphy_name(sc->hw->wiphy));
-+ gc->gchip.label = gc->label;
-+ gc->gchip.base = -1; /* determine base automatically */
-+ gc->gchip.ngpio = ng;
-+ 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.get = ath9k_gpio_pin_get;
-+ gc->gchip.set = ath9k_gpio_pin_set;
-+ gc->gchip.owner = THIS_MODULE;
-+
-+ if (gpiochip_add(&gc->gchip)) {
-+ kfree(gc);
-+ return;
-+ }
-+
-+ sc->gpiochip = gc;
-+ gc->sc = sc;
-+}
-+
-+/* remove GPIO chip */
-+void ath9k_unregister_gpio_chip(struct ath_softc *sc)
-+{
-+ struct ath9k_gpio_chip *gc = sc->gpiochip;
-+
-+ if (!gc)
-+ return;
-+
-+ gpiochip_remove(&gc->gchip);
-+ kfree(gc);
-+ sc->gpiochip = NULL;
-+}
-+
- #endif
-
- /*******************/
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -975,6 +975,7 @@ int ath9k_init_device(u16 devid, struct
- goto debug_cleanup;
- }
-
-+ ath9k_register_gpio_chip(sc);
- ath_init_leds(sc);
- ath_start_rfkill_poll(sc);
-
-@@ -1022,6 +1023,7 @@ void ath9k_deinit_device(struct ath_soft
-
- wiphy_rfkill_stop_polling(sc->hw->wiphy);
- ath_deinit_leds(sc);
-+ ath9k_unregister_gpio_chip(sc);
-
- ath9k_ps_restore(sc);
-