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