diff options
| author | Gabor Juhos <juhosg@openwrt.org> | 2011-01-04 21:28:18 +0100 | 
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2011-01-18 19:30:26 +0100 | 
| commit | d8fec1fc80cd8639449e2b5012688f5be109eeaf (patch) | |
| tree | 57882250166f98d561b126bf664f5abaef3a0a22 | |
| parent | 0cde72284c9c7d4b348ece9e1fe136f787185cd7 (diff) | |
| download | olio-linux-3.10-d8fec1fc80cd8639449e2b5012688f5be109eeaf.tar.xz olio-linux-3.10-d8fec1fc80cd8639449e2b5012688f5be109eeaf.zip  | |
MIPS: ath79: add common GPIO LEDs device
Almost all boards have one or more LEDs connected to GPIO lines. This
patch adds common code to register a platform_device for them.
The patch also adds support for the LEDs on the PB44 board.
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
Cc: linux-mips@linux-mips.org
Cc: Luis R. Rodriguez <lrodriguez@atheros.com>
Cc: Cliff Holden <Cliff.Holden@Atheros.com>
Cc: Kathy Giori <Kathy.Giori@Atheros.com>
Patchwork: https://patchwork.linux-mips.org/patch/1953/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
| -rw-r--r-- | arch/mips/ath79/Kconfig | 4 | ||||
| -rw-r--r-- | arch/mips/ath79/Makefile | 1 | ||||
| -rw-r--r-- | arch/mips/ath79/dev-leds-gpio.c | 56 | ||||
| -rw-r--r-- | arch/mips/ath79/dev-leds-gpio.h | 21 | ||||
| -rw-r--r-- | arch/mips/ath79/mach-pb44.c | 18 | 
5 files changed, 100 insertions, 0 deletions
diff --git a/arch/mips/ath79/Kconfig b/arch/mips/ath79/Kconfig index fabb2b0412d..5bc480e28b0 100644 --- a/arch/mips/ath79/Kconfig +++ b/arch/mips/ath79/Kconfig @@ -5,6 +5,7 @@ menu "Atheros AR71XX/AR724X/AR913X machine selection"  config ATH79_MACH_PB44  	bool "Atheros PB44 reference board"  	select SOC_AR71XX +	select ATH79_DEV_LEDS_GPIO  	help  	  Say 'Y' here if you want your kernel to support the  	  Atheros PB44 reference board. @@ -20,4 +21,7 @@ config SOC_AR724X  config SOC_AR913X  	def_bool n +config ATH79_DEV_LEDS_GPIO +	def_bool n +  endif diff --git a/arch/mips/ath79/Makefile b/arch/mips/ath79/Makefile index c3093f7d401..f41c0296aa2 100644 --- a/arch/mips/ath79/Makefile +++ b/arch/mips/ath79/Makefile @@ -16,6 +16,7 @@ obj-$(CONFIG_EARLY_PRINTK)		+= early_printk.o  # Devices  #  obj-y					+= dev-common.o +obj-$(CONFIG_ATH79_DEV_LEDS_GPIO)	+= dev-leds-gpio.o  #  # Machines diff --git a/arch/mips/ath79/dev-leds-gpio.c b/arch/mips/ath79/dev-leds-gpio.c new file mode 100644 index 00000000000..cdade68dcd1 --- /dev/null +++ b/arch/mips/ath79/dev-leds-gpio.c @@ -0,0 +1,56 @@ +/* + *  Atheros AR71XX/AR724X/AR913X common GPIO LEDs support + * + *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> + *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> + * + *  This program is free software; you can redistribute it and/or modify it + *  under the terms of the GNU General Public License version 2 as published + *  by the Free Software Foundation. + */ + +#include <linux/init.h> +#include <linux/slab.h> +#include <linux/platform_device.h> + +#include "dev-leds-gpio.h" + +void __init ath79_register_leds_gpio(int id, +				     unsigned num_leds, +				     struct gpio_led *leds) +{ +	struct platform_device *pdev; +	struct gpio_led_platform_data pdata; +	struct gpio_led *p; +	int err; + +	p = kmalloc(num_leds * sizeof(*p), GFP_KERNEL); +	if (!p) +		return; + +	memcpy(p, leds, num_leds * sizeof(*p)); + +	pdev = platform_device_alloc("leds-gpio", id); +	if (!pdev) +		goto err_free_leds; + +	memset(&pdata, 0, sizeof(pdata)); +	pdata.num_leds = num_leds; +	pdata.leds = p; + +	err = platform_device_add_data(pdev, &pdata, sizeof(pdata)); +	if (err) +		goto err_put_pdev; + +	err = platform_device_add(pdev); +	if (err) +		goto err_put_pdev; + +	return; + +err_put_pdev: +	platform_device_put(pdev); + +err_free_leds: +	kfree(p); +} diff --git a/arch/mips/ath79/dev-leds-gpio.h b/arch/mips/ath79/dev-leds-gpio.h new file mode 100644 index 00000000000..6e5d8851ebc --- /dev/null +++ b/arch/mips/ath79/dev-leds-gpio.h @@ -0,0 +1,21 @@ +/* + *  Atheros AR71XX/AR724X/AR913X common GPIO LEDs support + * + *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> + *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> + * + *  This program is free software; you can redistribute it and/or modify it + *  under the terms of the GNU General Public License version 2 as published + *  by the Free Software Foundation. + */ + +#ifndef _ATH79_DEV_LEDS_GPIO_H +#define _ATH79_DEV_LEDS_GPIO_H + +#include <linux/leds.h> + +void ath79_register_leds_gpio(int id, +			      unsigned num_leds, +			      struct gpio_led *leds); + +#endif /* _ATH79_DEV_LEDS_GPIO_H */ diff --git a/arch/mips/ath79/mach-pb44.c b/arch/mips/ath79/mach-pb44.c index ffc24d7a255..e176779af66 100644 --- a/arch/mips/ath79/mach-pb44.c +++ b/arch/mips/ath79/mach-pb44.c @@ -15,11 +15,14 @@  #include <linux/i2c/pcf857x.h>  #include "machtypes.h" +#include "dev-leds-gpio.h"  #define PB44_GPIO_I2C_SCL	0  #define PB44_GPIO_I2C_SDA	1  #define PB44_GPIO_EXP_BASE	16 +#define PB44_GPIO_LED_JUMP1	(PB44_GPIO_EXP_BASE + 9) +#define PB44_GPIO_LED_JUMP2	(PB44_GPIO_EXP_BASE + 10)  static struct i2c_gpio_platform_data pb44_i2c_gpio_data = {  	.sda_pin        = PB44_GPIO_I2C_SDA, @@ -45,11 +48,26 @@ static struct i2c_board_info pb44_i2c_board_info[] __initdata = {  	},  }; +static struct gpio_led pb44_leds_gpio[] __initdata = { +	{ +		.name		= "pb44:amber:jump1", +		.gpio		= PB44_GPIO_LED_JUMP1, +		.active_low	= 1, +	}, { +		.name		= "pb44:green:jump2", +		.gpio		= PB44_GPIO_LED_JUMP2, +		.active_low	= 1, +	}, +}; +  static void __init pb44_init(void)  {  	i2c_register_board_info(0, pb44_i2c_board_info,  				ARRAY_SIZE(pb44_i2c_board_info));  	platform_device_register(&pb44_i2c_gpio_device); + +	ath79_register_leds_gpio(-1, ARRAY_SIZE(pb44_leds_gpio), +				 pb44_leds_gpio);  }  MIPS_MACHINE(ATH79_MACH_PB44, "PB44", "Atheros PB44 reference board",  |