diff options
| author | Rafał Miłecki <zajec5@gmail.com> | 2014-01-14 12:14:41 +0100 | 
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2014-01-24 22:39:51 +0100 | 
| commit | 515fa75d4845c424c853a727a4f02b0e02340370 (patch) | |
| tree | aff49e83e72804e9bf1eb4cd2cc253263950cdf3 /arch/mips/bcm47xx | |
| parent | 76b573e46016eabc79e6764a458a559a30dfa7e9 (diff) | |
| download | linux-515fa75d4845c424c853a727a4f02b0e02340370.tar.bz2 | |
MIPS: BCM47XX: Prepare support for LEDs
So far this is mostly just a proof of concept, database consists of a
single device. Creating a nice iterateable array wasn't an option
because devices have different amount of LEDs. And we don't want to
waste memory just because of support for a device with dozens on LEDs.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: John Crispin <blogic@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/6299/
Diffstat (limited to 'arch/mips/bcm47xx')
| -rw-r--r-- | arch/mips/bcm47xx/Kconfig | 2 | ||||
| -rw-r--r-- | arch/mips/bcm47xx/Makefile | 2 | ||||
| -rw-r--r-- | arch/mips/bcm47xx/bcm47xx_private.h | 9 | ||||
| -rw-r--r-- | arch/mips/bcm47xx/leds.c | 73 | ||||
| -rw-r--r-- | arch/mips/bcm47xx/setup.c | 4 | 
5 files changed, 89 insertions, 1 deletions
| diff --git a/arch/mips/bcm47xx/Kconfig b/arch/mips/bcm47xx/Kconfig index df549af380af..09cb6f7aa3db 100644 --- a/arch/mips/bcm47xx/Kconfig +++ b/arch/mips/bcm47xx/Kconfig @@ -12,6 +12,7 @@ config BCM47XX_SSB  	select SSB_PCICORE_HOSTMODE if PCI  	select SSB_DRIVER_GPIO  	select GPIOLIB +	select LEDS_GPIO_REGISTER  	default y  	help  	 Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support. @@ -29,6 +30,7 @@ config BCM47XX_BCMA  	select BCMA_DRIVER_PCI_HOSTMODE if PCI  	select BCMA_DRIVER_GPIO  	select GPIOLIB +	select LEDS_GPIO_REGISTER  	default y  	help  	 Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus. diff --git a/arch/mips/bcm47xx/Makefile b/arch/mips/bcm47xx/Makefile index c52daf9b05c6..84e9aed25027 100644 --- a/arch/mips/bcm47xx/Makefile +++ b/arch/mips/bcm47xx/Makefile @@ -4,5 +4,5 @@  #  obj-y				+= irq.o nvram.o prom.o serial.o setup.o time.o sprom.o -obj-y				+= board.o +obj-y				+= board.o leds.o  obj-$(CONFIG_BCM47XX_SSB)	+= wgt634u.o diff --git a/arch/mips/bcm47xx/bcm47xx_private.h b/arch/mips/bcm47xx/bcm47xx_private.h new file mode 100644 index 000000000000..1a1e600b74e6 --- /dev/null +++ b/arch/mips/bcm47xx/bcm47xx_private.h @@ -0,0 +1,9 @@ +#ifndef LINUX_BCM47XX_PRIVATE_H_ +#define LINUX_BCM47XX_PRIVATE_H_ + +#include <linux/kernel.h> + +/* leds.c */ +void __init bcm47xx_leds_register(void); + +#endif diff --git a/arch/mips/bcm47xx/leds.c b/arch/mips/bcm47xx/leds.c new file mode 100644 index 000000000000..6a49d4c6c9c3 --- /dev/null +++ b/arch/mips/bcm47xx/leds.c @@ -0,0 +1,73 @@ +#include "bcm47xx_private.h" + +#include <linux/leds.h> +#include <bcm47xx_board.h> + +static const struct gpio_led +bcm47xx_leds_netgear_wndr4500_v1_leds[] __initconst = { +	{ +		.name		= "bcm47xx:green:wps", +		.gpio		= 1, +		.active_low	= 1, +		.default_state	= LEDS_GPIO_DEFSTATE_KEEP, +	}, +	{ +		.name		= "bcm47xx:green:power", +		.gpio		= 2, +		.active_low	= 1, +		.default_state	= LEDS_GPIO_DEFSTATE_KEEP, +	}, +	{ +		.name		= "bcm47xx:orange:power", +		.gpio		= 3, +		.active_low	= 1, +		.default_state	= LEDS_GPIO_DEFSTATE_KEEP, +	}, +	{ +		.name		= "bcm47xx:green:usb1", +		.gpio		= 8, +		.active_low	= 1, +		.default_state	= LEDS_GPIO_DEFSTATE_KEEP, +	}, +	{ +		.name		= "bcm47xx:green:2ghz", +		.gpio		= 9, +		.active_low	= 1, +		.default_state	= LEDS_GPIO_DEFSTATE_KEEP, +	}, +	{ +		.name		= "bcm47xx:blue:5ghz", +		.gpio		= 11, +		.active_low	= 1, +		.default_state	= LEDS_GPIO_DEFSTATE_KEEP, +	}, +	{ +		.name		= "bcm47xx:green:usb2", +		.gpio		= 14, +		.active_low	= 1, +		.default_state	= LEDS_GPIO_DEFSTATE_KEEP, +	}, +}; + +static struct gpio_led_platform_data bcm47xx_leds_pdata; + +#define bcm47xx_set_pdata(dev_leds) do {				\ +	bcm47xx_leds_pdata.leds = dev_leds;				\ +	bcm47xx_leds_pdata.num_leds = ARRAY_SIZE(dev_leds);		\ +} while (0) + +void __init bcm47xx_leds_register(void) +{ +	enum bcm47xx_board board = bcm47xx_board_get(); + +	switch (board) { +	case BCM47XX_BOARD_NETGEAR_WNDR4500V1: +		bcm47xx_set_pdata(bcm47xx_leds_netgear_wndr4500_v1_leds); +		break; +	default: +		pr_debug("No LEDs configuration found for this device\n"); +		return; +	} + +	gpio_led_register_device(-1, &bcm47xx_leds_pdata); +} diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c index aa2d8e39a9b0..91166967f8f7 100644 --- a/arch/mips/bcm47xx/setup.c +++ b/arch/mips/bcm47xx/setup.c @@ -26,6 +26,8 @@   *  675 Mass Ave, Cambridge, MA 02139, USA.   */ +#include "bcm47xx_private.h" +  #include <linux/export.h>  #include <linux/types.h>  #include <linux/ssb/ssb.h> @@ -253,6 +255,8 @@ static int __init bcm47xx_register_bus_complete(void)  		break;  #endif  	} +	bcm47xx_leds_register(); +  	return 0;  }  device_initcall(bcm47xx_register_bus_complete); |