-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 368362 b: refs/heads/master c: cd86452 h: refs/heads/master v: v3
- Loading branch information
Piotr Haber
authored and
John W. Linville
committed
Mar 6, 2013
1 parent
908e53a
commit 72537f6
Showing
7 changed files
with
178 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 98929824eec490984e42ac9dc3b96f7f12033996 | ||
refs/heads/master: cd864522b349cfe88903cf6f3415293c39856b6c |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
#include <net/mac80211.h> | ||
#include <linux/bcma/bcma_driver_chipcommon.h> | ||
#include <linux/gpio.h> | ||
|
||
#include "mac80211_if.h" | ||
#include "pub.h" | ||
#include "main.h" | ||
#include "led.h" | ||
|
||
/* number of leds */ | ||
#define BRCMS_LED_NO 4 | ||
/* behavior mask */ | ||
#define BRCMS_LED_BEH_MASK 0x7f | ||
/* activelow (polarity) bit */ | ||
#define BRCMS_LED_AL_MASK 0x80 | ||
/* radio enabled */ | ||
#define BRCMS_LED_RADIO 3 | ||
|
||
static void brcms_radio_led_ctrl(struct brcms_info *wl, bool state) | ||
{ | ||
if (wl->radio_led.gpio == -1) | ||
return; | ||
|
||
if (wl->radio_led.active_low) | ||
state = !state; | ||
|
||
if (state) | ||
gpio_set_value(wl->radio_led.gpio, 1); | ||
else | ||
gpio_set_value(wl->radio_led.gpio, 0); | ||
} | ||
|
||
|
||
/* Callback from the LED subsystem. */ | ||
static void brcms_led_brightness_set(struct led_classdev *led_dev, | ||
enum led_brightness brightness) | ||
{ | ||
struct brcms_info *wl = container_of(led_dev, | ||
struct brcms_info, led_dev); | ||
brcms_radio_led_ctrl(wl, brightness); | ||
} | ||
|
||
void brcms_led_unregister(struct brcms_info *wl) | ||
{ | ||
if (wl->led_dev.dev) | ||
led_classdev_unregister(&wl->led_dev); | ||
if (wl->radio_led.gpio != -1) | ||
gpio_free(wl->radio_led.gpio); | ||
} | ||
|
||
int brcms_led_register(struct brcms_info *wl) | ||
{ | ||
int i, err; | ||
struct brcms_led *radio_led = &wl->radio_led; | ||
/* get CC core */ | ||
struct bcma_drv_cc *cc_drv = &wl->wlc->hw->d11core->bus->drv_cc; | ||
struct gpio_chip *bcma_gpio = &cc_drv->gpio; | ||
struct ssb_sprom *sprom = &wl->wlc->hw->d11core->bus->sprom; | ||
u8 *leds[] = { &sprom->gpio0, | ||
&sprom->gpio1, | ||
&sprom->gpio2, | ||
&sprom->gpio3 }; | ||
unsigned gpio = -1; | ||
bool active_low = false; | ||
|
||
/* none by default */ | ||
radio_led->gpio = -1; | ||
radio_led->active_low = false; | ||
|
||
if (!bcma_gpio || !gpio_is_valid(bcma_gpio->base)) | ||
return -ENODEV; | ||
|
||
/* find radio enabled LED */ | ||
for (i = 0; i < BRCMS_LED_NO; i++) { | ||
u8 led = *leds[i]; | ||
if ((led & BRCMS_LED_BEH_MASK) == BRCMS_LED_RADIO) { | ||
gpio = bcma_gpio->base + i; | ||
if (led & BRCMS_LED_AL_MASK) | ||
active_low = true; | ||
break; | ||
} | ||
} | ||
|
||
if (gpio == -1 || !gpio_is_valid(gpio)) | ||
return -ENODEV; | ||
|
||
/* request and configure LED gpio */ | ||
err = gpio_request_one(gpio, | ||
active_low ? GPIOF_OUT_INIT_HIGH | ||
: GPIOF_OUT_INIT_LOW, | ||
"radio on"); | ||
if (err) { | ||
wiphy_err(wl->wiphy, "requesting led gpio %d failed (err: %d)\n", | ||
gpio, err); | ||
return err; | ||
} | ||
err = gpio_direction_output(gpio, 1); | ||
if (err) { | ||
wiphy_err(wl->wiphy, "cannot set led gpio %d to output (err: %d)\n", | ||
gpio, err); | ||
return err; | ||
} | ||
|
||
snprintf(wl->radio_led.name, sizeof(wl->radio_led.name), | ||
"brcmsmac-%s:radio", wiphy_name(wl->wiphy)); | ||
|
||
wl->led_dev.name = wl->radio_led.name; | ||
wl->led_dev.default_trigger = | ||
ieee80211_get_radio_led_name(wl->pub->ieee_hw); | ||
wl->led_dev.brightness_set = brcms_led_brightness_set; | ||
err = led_classdev_register(wiphy_dev(wl->wiphy), &wl->led_dev); | ||
|
||
if (err) { | ||
wiphy_err(wl->wiphy, "cannot register led device: %s (err: %d)\n", | ||
wl->radio_led.name, err); | ||
return err; | ||
} | ||
|
||
wiphy_info(wl->wiphy, "registered radio enabled led device: %s gpio: %d\n", | ||
wl->radio_led.name, | ||
gpio); | ||
radio_led->gpio = gpio; | ||
radio_led->active_low = active_low; | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* | ||
* Copyright (c) 2012 Broadcom Corporation | ||
* | ||
* Permission to use, copy, modify, and/or distribute this software for any | ||
* purpose with or without fee is hereby granted, provided that the above | ||
* copyright notice and this permission notice appear in all copies. | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | ||
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION | ||
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
*/ | ||
|
||
#ifndef _BRCM_LED_H_ | ||
#define _BRCM_LED_H_ | ||
struct brcms_led { | ||
char name[32]; | ||
unsigned gpio; | ||
bool active_low; | ||
}; | ||
|
||
#ifdef CONFIG_BCMA_DRIVER_GPIO | ||
void brcms_led_unregister(struct brcms_info *wl); | ||
int brcms_led_register(struct brcms_info *wl); | ||
#else | ||
static inline void brcms_led_unregister(struct brcms_info *wl) {}; | ||
static inline int brcms_led_register(struct brcms_info *wl) | ||
{ | ||
return -ENOTSUPP; | ||
}; | ||
#endif | ||
|
||
#endif /* _BRCM_LED_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters