mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-04 06:54:27 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
---
 | 
						|
 arch/arm/mach-omap2/board-n8x0.c |   73 +++++++++++++++++++++++++++++++++++++++
 | 
						|
 1 file changed, 73 insertions(+)
 | 
						|
 | 
						|
--- a/arch/arm/mach-omap2/board-n8x0.c
 | 
						|
+++ b/arch/arm/mach-omap2/board-n8x0.c
 | 
						|
@@ -316,6 +316,77 @@ void __init n8x0_bt_init(void)
 | 
						|
 		BUG();
 | 
						|
 }
 | 
						|
 
 | 
						|
+struct gpio_switch_input_dev {
 | 
						|
+	struct input_dev *idev;
 | 
						|
+	unsigned int swcode;
 | 
						|
+};
 | 
						|
+
 | 
						|
+static struct gpio_switch_input_dev *slide_input;
 | 
						|
+static struct gpio_switch_input_dev *kblock_input;
 | 
						|
+
 | 
						|
+static void n8x0_gpio_switch_input_notify(struct gpio_switch_input_dev *gdev,
 | 
						|
+					  int state)
 | 
						|
+{
 | 
						|
+	if (gdev) {
 | 
						|
+		input_report_switch(gdev->idev, gdev->swcode, state);
 | 
						|
+		input_sync(gdev->idev);
 | 
						|
+	}
 | 
						|
+}
 | 
						|
+
 | 
						|
+static void n8x0_slide_notify(void *data, int state)
 | 
						|
+{
 | 
						|
+	n8x0_gpio_switch_input_notify(slide_input, state);
 | 
						|
+}
 | 
						|
+
 | 
						|
+static void n8x0_kb_lock_notify(void *data, int state)
 | 
						|
+{
 | 
						|
+	n8x0_gpio_switch_input_notify(kblock_input, state);
 | 
						|
+}
 | 
						|
+
 | 
						|
+static struct gpio_switch_input_dev * __init gpioswitch_input_init(
 | 
						|
+			const char *name,
 | 
						|
+			unsigned int swcode)
 | 
						|
+{
 | 
						|
+	struct gpio_switch_input_dev *gdev;
 | 
						|
+	int err;
 | 
						|
+
 | 
						|
+	gdev = kzalloc(sizeof(*gdev), GFP_KERNEL);
 | 
						|
+	if (!gdev)
 | 
						|
+		goto error;
 | 
						|
+	gdev->swcode = swcode;
 | 
						|
+
 | 
						|
+	gdev->idev = input_allocate_device();
 | 
						|
+	if (!gdev->idev)
 | 
						|
+		goto err_free;
 | 
						|
+
 | 
						|
+	gdev->idev->evbit[0] = BIT_MASK(EV_SW);
 | 
						|
+	gdev->idev->swbit[BIT_WORD(swcode)] = BIT_MASK(swcode);
 | 
						|
+	gdev->idev->name = name;
 | 
						|
+
 | 
						|
+	err = input_register_device(gdev->idev);
 | 
						|
+	if (err)
 | 
						|
+		goto err_free_idev;
 | 
						|
+
 | 
						|
+	return gdev;
 | 
						|
+
 | 
						|
+err_free_idev:
 | 
						|
+	input_free_device(gdev->idev);
 | 
						|
+err_free:
 | 
						|
+	kfree(gdev);
 | 
						|
+error:
 | 
						|
+	return NULL;
 | 
						|
+}
 | 
						|
+
 | 
						|
+static int __init n8x0_gpio_switches_input_init(void)
 | 
						|
+{
 | 
						|
+	slide_input = gpioswitch_input_init("slide", SW_KEYPAD_SLIDE);
 | 
						|
+	kblock_input = gpioswitch_input_init("kb_lock", SW_LID);
 | 
						|
+	if (WARN_ON(!slide_input || !kblock_input))
 | 
						|
+		return -ENODEV;
 | 
						|
+	return 0;
 | 
						|
+}
 | 
						|
+late_initcall(n8x0_gpio_switches_input_init);
 | 
						|
+
 | 
						|
 static struct omap_gpio_switch n8x0_gpio_switches[] __initdata = {
 | 
						|
 	{
 | 
						|
 		.name			= "headphone",
 | 
						|
@@ -337,11 +408,13 @@ static struct omap_gpio_switch n8x0_gpio
 | 
						|
 		.gpio			= -1,
 | 
						|
 		.debounce_rising	= 200,
 | 
						|
 		.debounce_falling	= 200,
 | 
						|
+		.notify			= n8x0_slide_notify,
 | 
						|
 	}, {
 | 
						|
 		.name			= "kb_lock",
 | 
						|
 		.gpio			= -1,
 | 
						|
 		.debounce_rising	= 200,
 | 
						|
 		.debounce_falling	= 200,
 | 
						|
+		.notify			= n8x0_kb_lock_notify,
 | 
						|
 	},
 | 
						|
 };
 | 
						|
 
 |