| 1 | --- |
| 2 | arch/arm/mach-omap2/board-n8x0.c | 73 +++++++++++++++++++++++++++++++++++++++ |
| 3 | 1 file changed, 73 insertions(+) |
| 4 | |
| 5 | --- a/arch/arm/mach-omap2/board-n8x0.c |
| 6 | +++ b/arch/arm/mach-omap2/board-n8x0.c |
| 7 | @@ -225,6 +225,77 @@ extern struct mipid_platform_data n8x0_m |
| 8 | extern void n8x0_mipid_init(void); |
| 9 | extern void n8x0_blizzard_init(void); |
| 10 | |
| 11 | +struct gpio_switch_input_dev { |
| 12 | + struct input_dev *idev; |
| 13 | + unsigned int swcode; |
| 14 | +}; |
| 15 | + |
| 16 | +static struct gpio_switch_input_dev *slide_input; |
| 17 | +static struct gpio_switch_input_dev *kblock_input; |
| 18 | + |
| 19 | +static void n8x0_gpio_switch_input_notify(struct gpio_switch_input_dev *gdev, |
| 20 | + int state) |
| 21 | +{ |
| 22 | + if (gdev) { |
| 23 | + input_report_switch(gdev->idev, gdev->swcode, state); |
| 24 | + input_sync(gdev->idev); |
| 25 | + } |
| 26 | +} |
| 27 | + |
| 28 | +static void n8x0_slide_notify(void *data, int state) |
| 29 | +{ |
| 30 | + n8x0_gpio_switch_input_notify(slide_input, state); |
| 31 | +} |
| 32 | + |
| 33 | +static void n8x0_kb_lock_notify(void *data, int state) |
| 34 | +{ |
| 35 | + n8x0_gpio_switch_input_notify(kblock_input, state); |
| 36 | +} |
| 37 | + |
| 38 | +static struct gpio_switch_input_dev * __init gpioswitch_input_init( |
| 39 | + const char *name, |
| 40 | + unsigned int swcode) |
| 41 | +{ |
| 42 | + struct gpio_switch_input_dev *gdev; |
| 43 | + int err; |
| 44 | + |
| 45 | + gdev = kzalloc(sizeof(*gdev), GFP_KERNEL); |
| 46 | + if (!gdev) |
| 47 | + goto error; |
| 48 | + gdev->swcode = swcode; |
| 49 | + |
| 50 | + gdev->idev = input_allocate_device(); |
| 51 | + if (!gdev->idev) |
| 52 | + goto err_free; |
| 53 | + |
| 54 | + gdev->idev->evbit[0] = BIT_MASK(EV_SW); |
| 55 | + gdev->idev->swbit[BIT_WORD(swcode)] = BIT_MASK(swcode); |
| 56 | + gdev->idev->name = name; |
| 57 | + |
| 58 | + err = input_register_device(gdev->idev); |
| 59 | + if (err) |
| 60 | + goto err_free_idev; |
| 61 | + |
| 62 | + return gdev; |
| 63 | + |
| 64 | +err_free_idev: |
| 65 | + input_free_device(gdev->idev); |
| 66 | +err_free: |
| 67 | + kfree(gdev); |
| 68 | +error: |
| 69 | + return NULL; |
| 70 | +} |
| 71 | + |
| 72 | +static int __init n8x0_gpio_switches_input_init(void) |
| 73 | +{ |
| 74 | + slide_input = gpioswitch_input_init("slide", SW_KEYPAD_SLIDE); |
| 75 | + kblock_input = gpioswitch_input_init("kb_lock", SW_LID); |
| 76 | + if (WARN_ON(!slide_input || !kblock_input)) |
| 77 | + return -ENODEV; |
| 78 | + return 0; |
| 79 | +} |
| 80 | +late_initcall(n8x0_gpio_switches_input_init); |
| 81 | + |
| 82 | static struct omap_gpio_switch n8x0_gpio_switches[] __initdata = { |
| 83 | { |
| 84 | .name = "headphone", |
| 85 | @@ -246,11 +317,13 @@ static struct omap_gpio_switch n8x0_gpio |
| 86 | .gpio = -1, |
| 87 | .debounce_rising = 200, |
| 88 | .debounce_falling = 200, |
| 89 | + .notify = n8x0_slide_notify, |
| 90 | }, { |
| 91 | .name = "kb_lock", |
| 92 | .gpio = -1, |
| 93 | .debounce_rising = 200, |
| 94 | .debounce_falling = 200, |
| 95 | + .notify = n8x0_kb_lock_notify, |
| 96 | }, |
| 97 | }; |
| 98 | |
| 99 | |