72 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
--- 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;
 | 
						|
+}
 | 
						|
+
 | 
						|
+module_init(ar231x_init_reset);
 |