ath9k: unset the default LED pin if used by platform leds
Unset the default LED gpio pin if the same gpio pin is used by a LED defined via platform LED. This prevents that the default led trigger gets assigned to this LED and the GPIO value gets changed on wifi up/down in case the led is not used for signaling the wifi state. Signed-off-by: Mathias Kresin <dev@kresin.me>
This commit is contained in:
		| @@ -56,16 +56,21 @@ | |||||||
|   |   | ||||||
|  	INIT_LIST_HEAD(&sc->leds); |  	INIT_LIST_HEAD(&sc->leds); | ||||||
|   |   | ||||||
| @@ -144,6 +165,12 @@ void ath_init_leds(struct ath_softc *sc) | @@ -134,6 +155,17 @@ void ath_init_leds(struct ath_softc *sc) | ||||||
|   |   | ||||||
|  	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, |  	ath_fill_led_pin(sc); | ||||||
|  			   !sc->sc_ah->config.led_active_high); |   | ||||||
|  | +	if (pdata && pdata->leds && pdata->num_leds) | ||||||
|  | +		for (i = 0; i < pdata->num_leds; i++) { | ||||||
|  | +			if (pdata->leds[i].gpio == sc->sc_ah->led_pin) | ||||||
|  | +				sc->sc_ah->led_pin = -1; | ||||||
| + | + | ||||||
| +	if (!pdata) | +			ath_create_platform_led(sc, &pdata->leds[i]); | ||||||
|  | +		} | ||||||
|  | + | ||||||
|  | +	if (sc->sc_ah->led_pin < 0) | ||||||
| +		return; | +		return; | ||||||
| + | + | ||||||
| +	for (i = 0; i < pdata->num_leds; i++) |  	snprintf(led_name, sizeof(led_name), "ath9k-%s", | ||||||
| +		ath_create_platform_led(sc, &pdata->leds[i]); |  		 wiphy_name(sc->hw->wiphy)); | ||||||
|  } |  | ||||||
|  #endif |  | ||||||
|   |   | ||||||
|   | |||||||
| @@ -7,15 +7,15 @@ Enable platform-supplied WLAN LED name for ath9k device. It replaces generic | |||||||
|  |  | ||||||
| Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl> | Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl> | ||||||
| --- | --- | ||||||
|  drivers/net/wireless/ath/ath9k/gpio.c |   10 +++++++--- |  drivers/net/wireless/ath/ath9k/gpio.c | 7 +++++-- | ||||||
|  include/linux/ath9k_platform.h        |    1 + |  include/linux/ath9k_platform.h        | 1 + | ||||||
|  2 files changed, 8 insertions(+), 3 deletions(-) |  2 files changed, 6 insertions(+), 2 deletions(-) | ||||||
|  |  | ||||||
| --- a/drivers/net/wireless/ath/ath9k/gpio.c | --- a/drivers/net/wireless/ath/ath9k/gpio.c | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/gpio.c | +++ b/drivers/net/wireless/ath/ath9k/gpio.c | ||||||
| @@ -155,8 +155,11 @@ void ath_init_leds(struct ath_softc *sc) | @@ -166,8 +166,11 @@ void ath_init_leds(struct ath_softc *sc) | ||||||
|   |  	if (sc->sc_ah->led_pin < 0) | ||||||
|  	ath_fill_led_pin(sc); |  		return; | ||||||
|   |   | ||||||
| -	snprintf(led_name, sizeof(led_name), "ath9k-%s", | -	snprintf(led_name, sizeof(led_name), "ath9k-%s", | ||||||
| -		 wiphy_name(sc->hw->wiphy)); | -		 wiphy_name(sc->hw->wiphy)); | ||||||
|   | |||||||
| @@ -221,12 +221,12 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|   |   | ||||||
| +	ath9k_register_gpio_chip(sc); | +	ath9k_register_gpio_chip(sc); | ||||||
| + | + | ||||||
|  	if (pdata && pdata->led_name) |  	if (pdata && pdata->leds && pdata->num_leds) | ||||||
|  		strncpy(led_name, pdata->led_name, sizeof(led_name)); |  		for (i = 0; i < pdata->num_leds; i++) { | ||||||
|  	else |  			if (pdata->leds[i].gpio == sc->sc_ah->led_pin) | ||||||
| @@ -178,6 +314,7 @@ void ath_init_leds(struct ath_softc *sc) | @@ -183,6 +319,7 @@ void ath_init_leds(struct ath_softc *sc) | ||||||
|  	for (i = 0; i < pdata->num_leds; i++) |  	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, | ||||||
|  		ath_create_platform_led(sc, &pdata->leds[i]); |  			   !sc->sc_ah->config.led_active_high); | ||||||
|  } |  } | ||||||
| + | + | ||||||
|  #endif |  #endif | ||||||
|   | |||||||
| @@ -123,17 +123,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  	ath9k_register_gpio_chip(sc); |  	ath9k_register_gpio_chip(sc); | ||||||
| +	ath9k_init_buttons(sc); | +	ath9k_init_buttons(sc); | ||||||
|   |   | ||||||
|  	if (pdata && pdata->led_name) |  	if (pdata && pdata->leds && pdata->num_leds) | ||||||
|  		strncpy(led_name, pdata->led_name, sizeof(led_name)); |  		for (i = 0; i < pdata->num_leds; i++) { | ||||||
| @@ -308,7 +378,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); |  | ||||||
|   |  | ||||||
| -	if (!pdata) |  | ||||||
| +	if (!pdata || !pdata->leds || !pdata->num_leds) |  | ||||||
|  		return; |  | ||||||
|   |  | ||||||
|  	for (i = 0; i < pdata->num_leds; i++) |  | ||||||
| --- a/include/linux/ath9k_platform.h | --- a/include/linux/ath9k_platform.h | ||||||
| +++ b/include/linux/ath9k_platform.h | +++ b/include/linux/ath9k_platform.h | ||||||
| @@ -50,6 +50,10 @@ struct ath9k_platform_data { | @@ -50,6 +50,10 @@ struct ath9k_platform_data { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Mathias Kresin
					Mathias Kresin