| --- a/arch/mips/ath25/Makefile |
| +++ b/arch/mips/ath25/Makefile |
| @@ -8,7 +8,7 @@ |
| # Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org> |
| # |
| |
| -obj-y += board.o prom.o devices.o |
| +obj-y += board.o prom.o devices.o reset.o |
| |
| obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
| |
| --- /dev/null |
| +++ b/arch/mips/ath25/reset.c |
| @@ -0,0 +1,57 @@ |
| +#include <linux/init.h> |
| +#include <linux/slab.h> |
| +#include <linux/platform_device.h> |
| +#include <linux/gpio_keys.h> |
| +#include <linux/input.h> |
| +#include <ath25_platform.h> |
| +#include "devices.h" |
| + |
| +static int __init |
| +ar231x_init_reset(void) |
| +{ |
| + struct platform_device *pdev; |
| + struct gpio_keys_platform_data pdata; |
| + struct gpio_keys_button *p; |
| + int err; |
| + |
| + if (ath25_board.config->reset_config_gpio == 0xffff) |
| + return -ENODEV; |
| + |
| + p = kzalloc(sizeof(*p), GFP_KERNEL); |
| + if (!p) |
| + goto err; |
| + |
| + p->desc = "reset"; |
| + p->type = EV_KEY; |
| + p->code = KEY_RESTART; |
| + p->debounce_interval = 60; |
| + p->gpio = ath25_board.config->reset_config_gpio; |
| + |
| + memset(&pdata, 0, sizeof(pdata)); |
| + pdata.poll_interval = 20; |
| + pdata.buttons = p; |
| + pdata.nbuttons = 1; |
| + |
| + pdev = platform_device_alloc("gpio-keys-polled", 0); |
| + if (!pdev) |
| + goto err_free; |
| + |
| + 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 0; |
| + |
| +err_put_pdev: |
| + platform_device_put(pdev); |
| +err_free: |
| + kfree(p); |
| +err: |
| + return -ENOMEM; |
| +} |
| + |
| +device_initcall(ar231x_init_reset); |