From e78dc2eae49c5980a5201c98b26cd4a1b177c9a5 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Tue, 31 Dec 2024 13:20:06 -0800 Subject: [PATCH] mac80211: ath9k: clean up gpiochip Simplify patch with gpiochip_add_data, struct reduction, new GPIO API, and header cleanup. Signed-off-by: Rosen Penev Link: https://github.com/openwrt/openwrt/pull/17445 Signed-off-by: Robert Marko --- .../ath9k/548-ath9k_enable_gpio_chip.patch | 118 ++++++------------ .../ath9k/549-ath9k_enable_gpio_buttons.patch | 22 ++-- .../patches/ath9k/552-ath9k-ahb_of.patch | 6 +- 3 files changed, 55 insertions(+), 91 deletions(-) diff --git a/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch index 9fb549cc19b..9696ea5c883 100644 --- a/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch +++ b/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch @@ -10,47 +10,32 @@ Signed-off-by: Felix Fietkau --- --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -25,6 +25,7 @@ +@@ -25,6 +25,8 @@ #include #include #include +#include ++#include #include "common.h" #include "debug.h" -@@ -991,6 +992,14 @@ struct ath_led { - struct led_classdev cdev; - }; - -+#ifdef CONFIG_GPIOLIB -+struct ath9k_gpio_chip { -+ struct ath_softc *sc; -+ char label[32]; -+ struct gpio_chip gchip; -+}; -+#endif -+ - struct ath_softc { - struct ieee80211_hw *hw; - struct device *dev; -@@ -1046,6 +1055,9 @@ struct ath_softc { +@@ -1046,6 +1048,10 @@ struct ath_softc { #ifdef CPTCFG_MAC80211_LEDS const char *led_default_trigger; struct list_head leds; +#ifdef CONFIG_GPIOLIB -+ struct ath9k_gpio_chip *gpiochip; ++ struct gpio_chip *gpiochip; ++ struct gpio_desc *gpiodesc; +#endif #endif #ifdef CPTCFG_ATH9K_DEBUGFS --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c -@@ -16,13 +16,135 @@ - +@@ -17,12 +17,120 @@ #include "ath9k.h" #include -+#include -+ + +#ifdef CPTCFG_MAC80211_LEDS + +#ifdef CONFIG_GPIOLIB @@ -62,10 +47,9 @@ Signed-off-by: Felix Fietkau +/* 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); ++ struct ath_softc *sc = gpiochip_get_data(chip); + -+ ath9k_hw_gpio_request_in(gc->sc->sc_ah, offset, "ath9k-gpio"); ++ ath9k_hw_gpio_request_in(sc->sc_ah, offset, "ath9k-gpio"); + + return 0; +} @@ -74,12 +58,11 @@ Signed-off-by: Felix Fietkau +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); ++ struct ath_softc *sc = gpiochip_get_data(chip); + -+ ath9k_hw_gpio_request_out(gc->sc->sc_ah, offset, "ath9k-gpio", ++ ath9k_hw_gpio_request_out(sc->sc_ah, offset, "ath9k-gpio", + AR_GPIO_OUTPUT_MUX_AS_OUTPUT); -+ ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value); ++ ath9k_hw_set_gpio(sc->sc_ah, offset, value); + + return 0; +} @@ -87,9 +70,8 @@ Signed-off-by: Felix Fietkau +/* 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; ++ struct ath_softc *sc = gpiochip_get_data(chip); ++ struct ath_hw *ah = sc->sc_ah; + + return !((REG_READ(ah, AR_GPIO_OE_OUT(ah)) >> (offset * 2)) & 3); +} @@ -97,69 +79,59 @@ Signed-off-by: Felix Fietkau +/* 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); ++ struct ath_softc *sc = gpiochip_get_data(chip); + -+ return ath9k_hw_gpio_get(gc->sc->sc_ah, offset); ++ return ath9k_hw_gpio_get(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); ++ struct ath_softc *sc = gpiochip_get_data(chip); + -+ ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value); ++ ath9k_hw_set_gpio(sc->sc_ah, offset, value); +} + +/* register GPIO chip */ +static void ath9k_register_gpio_chip(struct ath_softc *sc) +{ -+ struct ath9k_gpio_chip *gc; ++ struct gpio_chip *gc = sc->gpiochip; + struct ath_hw *ah = sc->sc_ah; + -+ gc = kzalloc(sizeof(struct ath9k_gpio_chip), GFP_KERNEL); ++ gc = kzalloc(sizeof(struct gpio_chip), GFP_KERNEL); + if (!gc) + return; + -+ gc->sc = sc; -+ snprintf(gc->label, sizeof(gc->label), "ath9k-%s", -+ wiphy_name(sc->hw->wiphy)); -+#ifdef CONFIG_OF -+ gc->gchip.parent = sc->dev; -+#endif -+ 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.get = ath9k_gpio_pin_get; -+ gc->gchip.set = ath9k_gpio_pin_set; ++ gc->label = kasprintf(GFP_KERNEL, "ath9k-%s", ++ wiphy_name(sc->hw->wiphy)); ++ gc->parent = sc->dev; ++ gc->base = -1; /* determine base automatically */ ++ gc->ngpio = ah->caps.num_gpio_pins; ++ gc->direction_input = ath9k_gpio_pin_cfg_input; ++ gc->direction_output = ath9k_gpio_pin_cfg_output; ++ gc->get_direction = ath9k_gpio_pin_get_dir; ++ gc->get = ath9k_gpio_pin_get; ++ gc->set = ath9k_gpio_pin_set; + -+ if (gpiochip_add(&gc->gchip)) { ++ if (gpiochip_add_data(gc, sc)) { ++ kfree(gc->label); + kfree(gc); + return; + } -+ -+#ifdef CONFIG_OF -+ gc->gchip.owner = NULL; -+#endif -+ sc->gpiochip = gc; +} + +/* remove GPIO chip */ +static void ath9k_unregister_gpio_chip(struct ath_softc *sc) +{ -+ struct ath9k_gpio_chip *gc = sc->gpiochip; ++ struct gpio_chip *gc = sc->gpiochip; + + if (!gc) + return; + -+ gpiochip_remove(&gc->gchip); ++ gpiochip_remove(gc); ++ kfree(gc->label); + kfree(gc); -+ sc->gpiochip = NULL; +} + +#else /* CONFIG_GPIOLIB */ @@ -173,7 +145,7 @@ Signed-off-by: Felix Fietkau +} + +#endif /* CONFIG_GPIOLIB */ - ++ /********************************/ /* LED functions */ /********************************/ @@ -183,27 +155,27 @@ Signed-off-by: Felix Fietkau static void ath_fill_led_pin(struct ath_softc *sc) { struct ath_hw *ah = sc->sc_ah; -@@ -80,6 +202,12 @@ static int ath_add_led(struct ath_softc +@@ -80,6 +188,12 @@ static int ath_add_led(struct ath_softc else ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low); +#ifdef CONFIG_GPIOLIB + /* If there is GPIO chip configured, reserve LED pin */ + if (sc->gpiochip) -+ gpio_request(sc->gpiochip->gchip.base + gpio->gpio, gpio->name); ++ sc->gpiodesc = gpiod_get(sc->dev, gpio->name, GPIOD_ASIS); +#endif + return 0; } -@@ -136,17 +264,24 @@ void ath_deinit_leds(struct ath_softc *s +@@ -136,17 +250,24 @@ 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 + /* If there is GPIO chip configured, free LED pin */ + if (sc->gpiochip) -+ gpio_free(sc->gpiochip->gchip.base + led->gpio->gpio); ++ gpiod_put(sc->gpiodesc); +#endif list_del(&led->list); ath_led_brightness(&led->cdev, LED_OFF); @@ -221,7 +193,7 @@ Signed-off-by: Felix Fietkau char led_name[32]; const char *trigger; int i; -@@ -156,6 +291,15 @@ void ath_init_leds(struct ath_softc *sc) +@@ -156,6 +277,15 @@ void ath_init_leds(struct ath_softc *sc) if (AR_SREV_9100(sc->sc_ah)) return; @@ -237,11 +209,3 @@ Signed-off-by: Felix Fietkau ath_fill_led_pin(sc); if (pdata && pdata->leds && pdata->num_leds) -@@ -180,6 +324,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); - } -+ - #endif - - /*******************/ diff --git a/package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch index d164d890314..83f7a146e3c 100644 --- a/package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch +++ b/package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch @@ -10,27 +10,27 @@ Signed-off-by: Felix Fietkau --- --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -1057,6 +1057,7 @@ struct ath_softc { - struct list_head leds; +@@ -1051,6 +1051,7 @@ struct ath_softc { #ifdef CONFIG_GPIOLIB - struct ath9k_gpio_chip *gpiochip; + struct gpio_chip *gpiochip; + struct gpio_desc *gpiodesc; + struct platform_device *btnpdev; /* gpio-keys-polled */ #endif #endif --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c -@@ -17,6 +17,8 @@ +@@ -16,6 +16,8 @@ + #include "ath9k.h" #include - #include +#include +#include #ifdef CPTCFG_MAC80211_LEDS -@@ -129,6 +131,67 @@ static void ath9k_unregister_gpio_chip(s - sc->gpiochip = NULL; +@@ -115,6 +117,67 @@ static void ath9k_unregister_gpio_chip(s + kfree(gc); } +/******************/ @@ -64,7 +64,7 @@ Signed-off-by: Felix Fietkau + + ath9k_hw_gpio_request_in(sc->sc_ah, pdata->btns[i].gpio, + "ath9k-gpio"); -+ bt[i].gpio = sc->gpiochip->gchip.base + pdata->btns[i].gpio; ++ bt[i].gpio = sc->gpiochip->base + pdata->btns[i].gpio; + } + + memset(&gkpdata, 0, sizeof(struct gpio_keys_platform_data)); @@ -97,7 +97,7 @@ Signed-off-by: Felix Fietkau #else /* CONFIG_GPIOLIB */ static inline void ath9k_register_gpio_chip(struct ath_softc *sc) -@@ -139,6 +202,14 @@ static inline void ath9k_unregister_gpio +@@ -125,6 +188,14 @@ static inline void ath9k_unregister_gpio { } @@ -112,7 +112,7 @@ Signed-off-by: Felix Fietkau #endif /* CONFIG_GPIOLIB */ /********************************/ -@@ -262,6 +333,7 @@ void ath_deinit_leds(struct ath_softc *s +@@ -248,6 +319,7 @@ void ath_deinit_leds(struct ath_softc *s { struct ath_led *led; @@ -120,7 +120,7 @@ Signed-off-by: Felix Fietkau while (!list_empty(&sc->leds)) { led = list_first_entry(&sc->leds, struct ath_led, list); #ifdef CONFIG_GPIOLIB -@@ -301,6 +373,7 @@ void ath_init_leds(struct ath_softc *sc) +@@ -287,6 +359,7 @@ void ath_init_leds(struct ath_softc *sc) } ath_fill_led_pin(sc); diff --git a/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch index 3adc8bb8d68..0e4407b439b 100644 --- a/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch +++ b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch @@ -264,15 +264,15 @@ }; --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -26,6 +26,7 @@ - #include +@@ -27,6 +27,7 @@ #include #include + #include +#include #include "common.h" #include "debug.h" -@@ -1013,6 +1014,9 @@ struct ath_softc { +@@ -1006,6 +1007,9 @@ struct ath_softc { struct ath_hw *sc_ah; void __iomem *mem; int irq;