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,
 | |
|  	},
 | |
|  };
 | |
|  
 |