diff options
Diffstat (limited to 'drivers/input/keyboard/maple_keyb.c')
| -rw-r--r-- | drivers/input/keyboard/maple_keyb.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/drivers/input/keyboard/maple_keyb.c b/drivers/input/keyboard/maple_keyb.c index 3d5538dd4f23..e277b929a375 100644 --- a/drivers/input/keyboard/maple_keyb.c +++ b/drivers/input/keyboard/maple_keyb.c @@ -107,7 +107,7 @@ static void dc_scan_kbd(struct dc_kbd *kbd) } ptr = memchr(kbd->old + 2, kbd->new[i], 6); code = kbd->new[i]; - if (code > 3 && ptr) { + if (code > 3 && !ptr) { keycode = kbd->keycode[code]; if (keycode) { input_event(dev, EV_MSC, MSC_SCAN, code); @@ -140,16 +140,32 @@ static void dc_kbd_callback(struct mapleq *mq) } } +static int dc_kbd_open(struct input_dev *dev) +{ + struct maple_device *mdev = input_get_drvdata(dev); + + /* Maple polling is locked to VBLANK - which may be just 50/s */ + maple_getcond_callback(mdev, dc_kbd_callback, HZ / 50, + MAPLE_FUNC_KEYBOARD); + + return 0; +} + +static void dc_kbd_close(struct input_dev *dev) +{ + struct maple_device *mdev = input_get_drvdata(dev); + + maple_getcond_callback(mdev, NULL, 0, MAPLE_FUNC_KEYBOARD); +} + static int probe_maple_kbd(struct device *dev) { struct maple_device *mdev; - struct maple_driver *mdrv; int i, error; struct dc_kbd *kbd; struct input_dev *idev; mdev = to_maple_dev(dev); - mdrv = to_maple_driver(dev->driver); kbd = kzalloc_obj(*kbd); if (!kbd) { @@ -167,6 +183,7 @@ static int probe_maple_kbd(struct device *dev) memcpy(kbd->keycode, dc_kbd_keycode, sizeof(kbd->keycode)); maple_set_drvdata(mdev, kbd); + input_set_drvdata(idev, mdev); idev->name = mdev->product_name; idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); @@ -175,6 +192,8 @@ static int probe_maple_kbd(struct device *dev) idev->keycodemax = ARRAY_SIZE(kbd->keycode); idev->id.bustype = BUS_HOST; idev->dev.parent = &mdev->dev; + idev->open = dc_kbd_open; + idev->close = dc_kbd_close; for (i = 0; i < NR_SCANCODES; i++) __set_bit(dc_kbd_keycode[i], idev->keybit); @@ -185,17 +204,9 @@ static int probe_maple_kbd(struct device *dev) error = input_register_device(idev); if (error) goto fail_register; - - /* Maple polling is locked to VBLANK - which may be just 50/s */ - maple_getcond_callback(mdev, dc_kbd_callback, HZ/50, - MAPLE_FUNC_KEYBOARD); - - mdev->driver = mdrv; - return error; fail_register: - maple_set_drvdata(mdev, NULL); input_free_device(idev); fail_idev_alloc: kfree(kbd); @@ -213,7 +224,6 @@ static int remove_maple_kbd(struct device *dev) input_unregister_device(kbd->dev); kfree(kbd); - maple_set_drvdata(mdev, NULL); return 0; } |
