diff options
author | Hauke Mehrtens <hauke@hauke-m.de> | 2014-01-12 18:55:25 +0000 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2014-01-12 18:55:25 +0000 |
commit | c2992ee273b4dac36df2a2b4a9d3a74d315f8f2e (patch) | |
tree | 64f14a7a43380f8fcc0403501b5fca11ab195147 /target/linux/brcm47xx/patches-3.10/121-MIPS-BCM47XX-Prepare-support-for-GPIO-buttons.patch | |
parent | 30cf6f5815b898f956ae95a88f28d327677a3f62 (diff) | |
download | upstream-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.patch | 152 |
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; |