MIPS: ath79: add common GPIO LEDs device
authorGabor Juhos <juhosg@openwrt.org>
Tue, 4 Jan 2011 20:28:18 +0000 (21:28 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 18 Jan 2011 18:30:26 +0000 (19:30 +0100)
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>
arch/mips/ath79/Kconfig
arch/mips/ath79/Makefile
arch/mips/ath79/dev-leds-gpio.c [new file with mode: 0644]
arch/mips/ath79/dev-leds-gpio.h [new file with mode: 0644]
arch/mips/ath79/mach-pb44.c

index fabb2b0412d742b4f06d386a21d7491a121f0e4f..5bc480e28b0ca093014122eb39f176fa189f6196 100644 (file)
@@ -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
index c3093f7d401f563e383a2f6609d7dfa581eba0c3..f41c0296aa208b3104f431fad89391f5135dd1ef 100644 (file)
@@ -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 (file)
index 0000000..cdade68
--- /dev/null
@@ -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 (file)
index 0000000..6e5d885
--- /dev/null
@@ -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 */
index ffc24d7a25522173d2fa8515f954cb7ab108640c..e176779af660dd1893fdd057cc2e301e0de1ce3f 100644 (file)
 #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",