diff options
Diffstat (limited to 'target/linux/omap24xx/patches-3.3/350-n8x0-gpioswitch-input.patch')
-rw-r--r-- | target/linux/omap24xx/patches-3.3/350-n8x0-gpioswitch-input.patch | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/target/linux/omap24xx/patches-3.3/350-n8x0-gpioswitch-input.patch b/target/linux/omap24xx/patches-3.3/350-n8x0-gpioswitch-input.patch new file mode 100644 index 0000000000..1a6c2812e4 --- /dev/null +++ b/target/linux/omap24xx/patches-3.3/350-n8x0-gpioswitch-input.patch @@ -0,0 +1,98 @@ +--- + 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, + }, + }; + |