aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm47xx/patches-3.10/121-MIPS-BCM47XX-Prepare-support-for-GPIO-buttons.patch
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2014-01-12 18:55:25 +0000
committerHauke Mehrtens <hauke@hauke-m.de>2014-01-12 18:55:25 +0000
commitc2992ee273b4dac36df2a2b4a9d3a74d315f8f2e (patch)
tree64f14a7a43380f8fcc0403501b5fca11ab195147 /target/linux/brcm47xx/patches-3.10/121-MIPS-BCM47XX-Prepare-support-for-GPIO-buttons.patch
parent30cf6f5815b898f956ae95a88f28d327677a3f62 (diff)
downloadupstream-c2992ee273b4dac36df2a2b4a9d3a74d315f8f2e.tar.gz
upstream-c2992ee273b4dac36df2a2b4a9d3a74d315f8f2e.tar.bz2
upstream-c2992ee273b4dac36df2a2b4a9d3a74d315f8f2e.zip
brcm47xx: add new led and button support
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> SVN-Revision: 39252
Diffstat (limited to 'target/linux/brcm47xx/patches-3.10/121-MIPS-BCM47XX-Prepare-support-for-GPIO-buttons.patch')
-rw-r--r--target/linux/brcm47xx/patches-3.10/121-MIPS-BCM47XX-Prepare-support-for-GPIO-buttons.patch152
1 files changed, 152 insertions, 0 deletions
diff --git a/target/linux/brcm47xx/patches-3.10/121-MIPS-BCM47XX-Prepare-support-for-GPIO-buttons.patch b/target/linux/brcm47xx/patches-3.10/121-MIPS-BCM47XX-Prepare-support-for-GPIO-buttons.patch
new file mode 100644
index 0000000000..627ea70b88
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.10/121-MIPS-BCM47XX-Prepare-support-for-GPIO-buttons.patch
@@ -0,0 +1,152 @@
+From e352ec3c581df40f159771b30c262c2bc7fb802e Mon Sep 17 00:00:00 2001
+From: Rafa? Mi?ecki <zajec5@gmail.com>
+Date: Thu, 2 Jan 2014 13:31:32 +0100
+Subject: [PATCH 030/110] MIPS: BCM47XX: Prepare support for GPIO buttons
+
+So far this adds support for one Netgear model only, but it's designed
+and ready to add many more device. We could hopefully import database
+from OpenWrt.
+Support for SSB is currently disabled, because SSB doesn't implement IRQ
+domain yet.
+
+Signed-off-by: Rafa? Mi?ecki <zajec5@gmail.com>
+Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
+Acked-by: John Crispin <blogic@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/6300/
+---
+ arch/mips/bcm47xx/Makefile | 2 +-
+ arch/mips/bcm47xx/bcm47xx_private.h | 3 ++
+ arch/mips/bcm47xx/buttons.c | 95 +++++++++++++++++++++++++++++++++++
+ arch/mips/bcm47xx/setup.c | 1 +
+ 4 files changed, 100 insertions(+), 1 deletion(-)
+ create mode 100644 arch/mips/bcm47xx/buttons.c
+
+--- 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 leds.o
++obj-y += board.o buttons.o leds.o
+ obj-$(CONFIG_BCM47XX_SSB) += wgt634u.o
+--- a/arch/mips/bcm47xx/bcm47xx_private.h
++++ b/arch/mips/bcm47xx/bcm47xx_private.h
+@@ -3,6 +3,9 @@
+
+ #include <linux/kernel.h>
+
++/* buttons.c */
++int __init bcm47xx_buttons_register(void);
++
+ /* leds.c */
+ void __init bcm47xx_leds_register(void);
+
+--- /dev/null
++++ b/arch/mips/bcm47xx/buttons.c
+@@ -0,0 +1,95 @@
++#include "bcm47xx_private.h"
++
++#include <linux/input.h>
++#include <linux/gpio_keys.h>
++#include <linux/interrupt.h>
++#include <linux/ssb/ssb_embedded.h>
++#include <bcm47xx_board.h>
++#include <bcm47xx.h>
++
++/**************************************************
++ * Database
++ **************************************************/
++
++static const struct gpio_keys_button
++bcm47xx_buttons_netgear_wndr4500_v1[] __initconst = {
++ {
++ .code = KEY_WPS_BUTTON,
++ .gpio = 4,
++ .active_low = 1,
++ },
++ {
++ .code = KEY_RFKILL,
++ .gpio = 5,
++ .active_low = 1,
++ },
++ {
++ .code = KEY_RESTART,
++ .gpio = 6,
++ .active_low = 1,
++ },
++};
++
++/**************************************************
++ * Init
++ **************************************************/
++
++static struct gpio_keys_platform_data bcm47xx_button_pdata;
++
++static struct platform_device bcm47xx_buttons_gpio_keys = {
++ .name = "gpio-keys",
++ .dev = {
++ .platform_data = &bcm47xx_button_pdata,
++ }
++};
++
++/* Copy data from __initconst */
++static int __init bcm47xx_buttons_copy(const struct gpio_keys_button *buttons,
++ size_t nbuttons)
++{
++ size_t size = nbuttons * sizeof(*buttons);
++
++ bcm47xx_button_pdata.buttons = kmalloc(size, GFP_KERNEL);
++ if (!bcm47xx_button_pdata.buttons)
++ return -ENOMEM;
++ memcpy(bcm47xx_button_pdata.buttons, buttons, size);
++ bcm47xx_button_pdata.nbuttons = nbuttons;
++
++ return 0;
++}
++
++#define bcm47xx_copy_bdata(dev_buttons) \
++ bcm47xx_buttons_copy(dev_buttons, ARRAY_SIZE(dev_buttons));
++
++int __init bcm47xx_buttons_register(void)
++{
++ enum bcm47xx_board board = bcm47xx_board_get();
++ int err;
++
++#ifdef CONFIG_BCM47XX_SSB
++ if (bcm47xx_bus_type == BCM47XX_BUS_TYPE_SSB) {
++ pr_debug("Buttons on SSB are not supported yet.\n");
++ return -ENOTSUPP;
++ }
++#endif
++
++ switch (board) {
++ case BCM47XX_BOARD_NETGEAR_WNDR4500V1:
++ err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr4500_v1);
++ break;
++ default:
++ pr_debug("No buttons configuration found for this device\n");
++ return -ENOTSUPP;
++ }
++
++ if (err)
++ return -ENOMEM;
++
++ err = platform_device_register(&bcm47xx_buttons_gpio_keys);
++ if (err) {
++ pr_err("Failed to register platform device: %d\n", err);
++ return err;
++ }
++
++ return 0;
++}
+--- a/arch/mips/bcm47xx/setup.c
++++ b/arch/mips/bcm47xx/setup.c
+@@ -246,6 +246,7 @@ static int __init bcm47xx_register_bus_c
+ #endif
+ }
+
++ bcm47xx_buttons_register();
+ bcm47xx_leds_register();
+
+ return 0;