diff options
| -rw-r--r-- | arch/mips/ath79/Kconfig | 4 | ||||
| -rw-r--r-- | arch/mips/ath79/Makefile | 1 | ||||
| -rw-r--r-- | arch/mips/ath79/dev-gpio-buttons.c | 58 | ||||
| -rw-r--r-- | arch/mips/ath79/dev-gpio-buttons.h | 23 | ||||
| -rw-r--r-- | arch/mips/ath79/mach-pb44.c | 27 |
5 files changed, 113 insertions, 0 deletions
diff --git a/arch/mips/ath79/Kconfig b/arch/mips/ath79/Kconfig index 5bc480e28b0c..185a8d6c73de 100644 --- a/arch/mips/ath79/Kconfig +++ b/arch/mips/ath79/Kconfig | |||
| @@ -5,6 +5,7 @@ menu "Atheros AR71XX/AR724X/AR913X machine selection" | |||
| 5 | config ATH79_MACH_PB44 | 5 | config ATH79_MACH_PB44 |
| 6 | bool "Atheros PB44 reference board" | 6 | bool "Atheros PB44 reference board" |
| 7 | select SOC_AR71XX | 7 | select SOC_AR71XX |
| 8 | select ATH79_DEV_GPIO_BUTTONS | ||
| 8 | select ATH79_DEV_LEDS_GPIO | 9 | select ATH79_DEV_LEDS_GPIO |
| 9 | help | 10 | help |
| 10 | Say 'Y' here if you want your kernel to support the | 11 | Say 'Y' here if you want your kernel to support the |
| @@ -21,6 +22,9 @@ config SOC_AR724X | |||
| 21 | config SOC_AR913X | 22 | config SOC_AR913X |
| 22 | def_bool n | 23 | def_bool n |
| 23 | 24 | ||
| 25 | config ATH79_DEV_GPIO_BUTTONS | ||
| 26 | def_bool n | ||
| 27 | |||
| 24 | config ATH79_DEV_LEDS_GPIO | 28 | config ATH79_DEV_LEDS_GPIO |
| 25 | def_bool n | 29 | def_bool n |
| 26 | 30 | ||
diff --git a/arch/mips/ath79/Makefile b/arch/mips/ath79/Makefile index f41c0296aa20..344e9ab1e106 100644 --- a/arch/mips/ath79/Makefile +++ b/arch/mips/ath79/Makefile | |||
| @@ -16,6 +16,7 @@ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | |||
| 16 | # Devices | 16 | # Devices |
| 17 | # | 17 | # |
| 18 | obj-y += dev-common.o | 18 | obj-y += dev-common.o |
| 19 | obj-$(CONFIG_ATH79_DEV_GPIO_BUTTONS) += dev-gpio-buttons.o | ||
| 19 | obj-$(CONFIG_ATH79_DEV_LEDS_GPIO) += dev-leds-gpio.o | 20 | obj-$(CONFIG_ATH79_DEV_LEDS_GPIO) += dev-leds-gpio.o |
| 20 | 21 | ||
| 21 | # | 22 | # |
diff --git a/arch/mips/ath79/dev-gpio-buttons.c b/arch/mips/ath79/dev-gpio-buttons.c new file mode 100644 index 000000000000..4b0168a11c01 --- /dev/null +++ b/arch/mips/ath79/dev-gpio-buttons.c | |||
| @@ -0,0 +1,58 @@ | |||
| 1 | /* | ||
| 2 | * Atheros AR71XX/AR724X/AR913X GPIO button support | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
| 5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify it | ||
| 8 | * under the terms of the GNU General Public License version 2 as published | ||
| 9 | * by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include "linux/init.h" | ||
| 13 | #include "linux/slab.h" | ||
| 14 | #include <linux/platform_device.h> | ||
| 15 | |||
| 16 | #include "dev-gpio-buttons.h" | ||
| 17 | |||
| 18 | void __init ath79_register_gpio_keys_polled(int id, | ||
| 19 | unsigned poll_interval, | ||
| 20 | unsigned nbuttons, | ||
| 21 | struct gpio_keys_button *buttons) | ||
| 22 | { | ||
| 23 | struct platform_device *pdev; | ||
| 24 | struct gpio_keys_platform_data pdata; | ||
| 25 | struct gpio_keys_button *p; | ||
| 26 | int err; | ||
| 27 | |||
| 28 | p = kmalloc(nbuttons * sizeof(*p), GFP_KERNEL); | ||
| 29 | if (!p) | ||
| 30 | return; | ||
| 31 | |||
| 32 | memcpy(p, buttons, nbuttons * sizeof(*p)); | ||
| 33 | |||
| 34 | pdev = platform_device_alloc("gpio-keys-polled", id); | ||
| 35 | if (!pdev) | ||
| 36 | goto err_free_buttons; | ||
| 37 | |||
| 38 | memset(&pdata, 0, sizeof(pdata)); | ||
| 39 | pdata.poll_interval = poll_interval; | ||
| 40 | pdata.nbuttons = nbuttons; | ||
| 41 | pdata.buttons = p; | ||
| 42 | |||
| 43 | err = platform_device_add_data(pdev, &pdata, sizeof(pdata)); | ||
| 44 | if (err) | ||
| 45 | goto err_put_pdev; | ||
| 46 | |||
| 47 | err = platform_device_add(pdev); | ||
| 48 | if (err) | ||
| 49 | goto err_put_pdev; | ||
| 50 | |||
| 51 | return; | ||
| 52 | |||
| 53 | err_put_pdev: | ||
| 54 | platform_device_put(pdev); | ||
| 55 | |||
| 56 | err_free_buttons: | ||
| 57 | kfree(p); | ||
| 58 | } | ||
diff --git a/arch/mips/ath79/dev-gpio-buttons.h b/arch/mips/ath79/dev-gpio-buttons.h new file mode 100644 index 000000000000..481847ac1cba --- /dev/null +++ b/arch/mips/ath79/dev-gpio-buttons.h | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | /* | ||
| 2 | * Atheros AR71XX/AR724X/AR913X GPIO button support | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
| 5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify it | ||
| 8 | * under the terms of the GNU General Public License version 2 as published | ||
| 9 | * by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ATH79_DEV_GPIO_BUTTONS_H | ||
| 13 | #define _ATH79_DEV_GPIO_BUTTONS_H | ||
| 14 | |||
| 15 | #include <linux/input.h> | ||
| 16 | #include <linux/gpio_keys.h> | ||
| 17 | |||
| 18 | void ath79_register_gpio_keys_polled(int id, | ||
| 19 | unsigned poll_interval, | ||
| 20 | unsigned nbuttons, | ||
| 21 | struct gpio_keys_button *buttons); | ||
| 22 | |||
| 23 | #endif /* _ATH79_DEV_GPIO_BUTTONS_H */ | ||
diff --git a/arch/mips/ath79/mach-pb44.c b/arch/mips/ath79/mach-pb44.c index e176779af660..3dc5080185cb 100644 --- a/arch/mips/ath79/mach-pb44.c +++ b/arch/mips/ath79/mach-pb44.c | |||
| @@ -15,15 +15,21 @@ | |||
| 15 | #include <linux/i2c/pcf857x.h> | 15 | #include <linux/i2c/pcf857x.h> |
| 16 | 16 | ||
| 17 | #include "machtypes.h" | 17 | #include "machtypes.h" |
| 18 | #include "dev-gpio-buttons.h" | ||
| 18 | #include "dev-leds-gpio.h" | 19 | #include "dev-leds-gpio.h" |
| 19 | 20 | ||
| 20 | #define PB44_GPIO_I2C_SCL 0 | 21 | #define PB44_GPIO_I2C_SCL 0 |
| 21 | #define PB44_GPIO_I2C_SDA 1 | 22 | #define PB44_GPIO_I2C_SDA 1 |
| 22 | 23 | ||
| 23 | #define PB44_GPIO_EXP_BASE 16 | 24 | #define PB44_GPIO_EXP_BASE 16 |
| 25 | #define PB44_GPIO_SW_RESET (PB44_GPIO_EXP_BASE + 6) | ||
| 26 | #define PB44_GPIO_SW_JUMP (PB44_GPIO_EXP_BASE + 8) | ||
| 24 | #define PB44_GPIO_LED_JUMP1 (PB44_GPIO_EXP_BASE + 9) | 27 | #define PB44_GPIO_LED_JUMP1 (PB44_GPIO_EXP_BASE + 9) |
| 25 | #define PB44_GPIO_LED_JUMP2 (PB44_GPIO_EXP_BASE + 10) | 28 | #define PB44_GPIO_LED_JUMP2 (PB44_GPIO_EXP_BASE + 10) |
| 26 | 29 | ||
| 30 | #define PB44_KEYS_POLL_INTERVAL 20 /* msecs */ | ||
| 31 | #define PB44_KEYS_DEBOUNCE_INTERVAL (3 * PB44_KEYS_POLL_INTERVAL) | ||
| 32 | |||
| 27 | static struct i2c_gpio_platform_data pb44_i2c_gpio_data = { | 33 | static struct i2c_gpio_platform_data pb44_i2c_gpio_data = { |
| 28 | .sda_pin = PB44_GPIO_I2C_SDA, | 34 | .sda_pin = PB44_GPIO_I2C_SDA, |
| 29 | .scl_pin = PB44_GPIO_I2C_SCL, | 35 | .scl_pin = PB44_GPIO_I2C_SCL, |
| @@ -60,6 +66,24 @@ static struct gpio_led pb44_leds_gpio[] __initdata = { | |||
| 60 | }, | 66 | }, |
| 61 | }; | 67 | }; |
| 62 | 68 | ||
| 69 | static struct gpio_keys_button pb44_gpio_keys[] __initdata = { | ||
| 70 | { | ||
| 71 | .desc = "soft_reset", | ||
| 72 | .type = EV_KEY, | ||
| 73 | .code = KEY_RESTART, | ||
| 74 | .debounce_interval = PB44_KEYS_DEBOUNCE_INTERVAL, | ||
| 75 | .gpio = PB44_GPIO_SW_RESET, | ||
| 76 | .active_low = 1, | ||
| 77 | } , { | ||
| 78 | .desc = "jumpstart", | ||
| 79 | .type = EV_KEY, | ||
| 80 | .code = KEY_WPS_BUTTON, | ||
| 81 | .debounce_interval = PB44_KEYS_DEBOUNCE_INTERVAL, | ||
| 82 | .gpio = PB44_GPIO_SW_JUMP, | ||
| 83 | .active_low = 1, | ||
| 84 | } | ||
| 85 | }; | ||
| 86 | |||
| 63 | static void __init pb44_init(void) | 87 | static void __init pb44_init(void) |
| 64 | { | 88 | { |
| 65 | i2c_register_board_info(0, pb44_i2c_board_info, | 89 | i2c_register_board_info(0, pb44_i2c_board_info, |
| @@ -68,6 +92,9 @@ static void __init pb44_init(void) | |||
| 68 | 92 | ||
| 69 | ath79_register_leds_gpio(-1, ARRAY_SIZE(pb44_leds_gpio), | 93 | ath79_register_leds_gpio(-1, ARRAY_SIZE(pb44_leds_gpio), |
| 70 | pb44_leds_gpio); | 94 | pb44_leds_gpio); |
| 95 | ath79_register_gpio_keys_polled(-1, PB44_KEYS_POLL_INTERVAL, | ||
| 96 | ARRAY_SIZE(pb44_gpio_keys), | ||
| 97 | pb44_gpio_keys); | ||
| 71 | } | 98 | } |
| 72 | 99 | ||
| 73 | MIPS_MACHINE(ATH79_MACH_PB44, "PB44", "Atheros PB44 reference board", | 100 | MIPS_MACHINE(ATH79_MACH_PB44, "PB44", "Atheros PB44 reference board", |
