diff options
Diffstat (limited to 'drivers/input/keyboard/newtonkbd.c')
| -rw-r--r-- | drivers/input/keyboard/newtonkbd.c | 83 |
1 files changed, 39 insertions, 44 deletions
diff --git a/drivers/input/keyboard/newtonkbd.c b/drivers/input/keyboard/newtonkbd.c index 2e8ce1613eec..d10983c521e6 100644 --- a/drivers/input/keyboard/newtonkbd.c +++ b/drivers/input/keyboard/newtonkbd.c | |||
| @@ -57,11 +57,9 @@ static unsigned char nkbd_keycode[128] = { | |||
| 57 | KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_UP, 0 | 57 | KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_UP, 0 |
| 58 | }; | 58 | }; |
| 59 | 59 | ||
| 60 | static char *nkbd_name = "Newton Keyboard"; | ||
| 61 | |||
| 62 | struct nkbd { | 60 | struct nkbd { |
| 63 | unsigned char keycode[128]; | 61 | unsigned char keycode[128]; |
| 64 | struct input_dev dev; | 62 | struct input_dev *dev; |
| 65 | struct serio *serio; | 63 | struct serio *serio; |
| 66 | char phys[32]; | 64 | char phys[32]; |
| 67 | }; | 65 | }; |
| @@ -73,13 +71,13 @@ static irqreturn_t nkbd_interrupt(struct serio *serio, | |||
| 73 | 71 | ||
| 74 | /* invalid scan codes are probably the init sequence, so we ignore them */ | 72 | /* invalid scan codes are probably the init sequence, so we ignore them */ |
| 75 | if (nkbd->keycode[data & NKBD_KEY]) { | 73 | if (nkbd->keycode[data & NKBD_KEY]) { |
| 76 | input_regs(&nkbd->dev, regs); | 74 | input_regs(nkbd->dev, regs); |
| 77 | input_report_key(&nkbd->dev, nkbd->keycode[data & NKBD_KEY], data & NKBD_PRESS); | 75 | input_report_key(nkbd->dev, nkbd->keycode[data & NKBD_KEY], data & NKBD_PRESS); |
| 78 | input_sync(&nkbd->dev); | 76 | input_sync(nkbd->dev); |
| 79 | } | 77 | } |
| 80 | 78 | ||
| 81 | else if (data == 0xe7) /* end of init sequence */ | 79 | else if (data == 0xe7) /* end of init sequence */ |
| 82 | printk(KERN_INFO "input: %s on %s\n", nkbd_name, serio->phys); | 80 | printk(KERN_INFO "input: %s on %s\n", nkbd->dev->name, serio->phys); |
| 83 | return IRQ_HANDLED; | 81 | return IRQ_HANDLED; |
| 84 | 82 | ||
| 85 | } | 83 | } |
| @@ -87,62 +85,59 @@ static irqreturn_t nkbd_interrupt(struct serio *serio, | |||
| 87 | static int nkbd_connect(struct serio *serio, struct serio_driver *drv) | 85 | static int nkbd_connect(struct serio *serio, struct serio_driver *drv) |
| 88 | { | 86 | { |
| 89 | struct nkbd *nkbd; | 87 | struct nkbd *nkbd; |
| 88 | struct input_dev *input_dev; | ||
| 89 | int err = -ENOMEM; | ||
| 90 | int i; | 90 | int i; |
| 91 | int err; | ||
| 92 | |||
| 93 | if (!(nkbd = kmalloc(sizeof(struct nkbd), GFP_KERNEL))) | ||
| 94 | return -ENOMEM; | ||
| 95 | |||
| 96 | memset(nkbd, 0, sizeof(struct nkbd)); | ||
| 97 | 91 | ||
| 98 | nkbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP); | 92 | nkbd = kzalloc(sizeof(struct nkbd), GFP_KERNEL); |
| 93 | input_dev = input_allocate_device(); | ||
| 94 | if (!nkbd || !input_dev) | ||
| 95 | goto fail; | ||
| 99 | 96 | ||
| 100 | nkbd->serio = serio; | 97 | nkbd->serio = serio; |
| 98 | nkbd->dev = input_dev; | ||
| 99 | sprintf(nkbd->phys, "%s/input0", serio->phys); | ||
| 100 | memcpy(nkbd->keycode, nkbd_keycode, sizeof(nkbd->keycode)); | ||
| 101 | 101 | ||
| 102 | init_input_dev(&nkbd->dev); | 102 | input_dev->name = "Newton Keyboard"; |
| 103 | nkbd->dev.keycode = nkbd->keycode; | 103 | input_dev->phys = nkbd->phys; |
| 104 | nkbd->dev.keycodesize = sizeof(unsigned char); | 104 | input_dev->id.bustype = BUS_RS232; |
| 105 | nkbd->dev.keycodemax = ARRAY_SIZE(nkbd_keycode); | 105 | input_dev->id.vendor = SERIO_NEWTON; |
| 106 | nkbd->dev.private = nkbd; | 106 | input_dev->id.product = 0x0001; |
| 107 | input_dev->id.version = 0x0100; | ||
| 108 | input_dev->cdev.dev = &serio->dev; | ||
| 109 | input_dev->private = nkbd; | ||
| 110 | |||
| 111 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); | ||
| 112 | input_dev->keycode = nkbd->keycode; | ||
| 113 | input_dev->keycodesize = sizeof(unsigned char); | ||
| 114 | input_dev->keycodemax = ARRAY_SIZE(nkbd_keycode); | ||
| 115 | for (i = 0; i < 128; i++) | ||
| 116 | set_bit(nkbd->keycode[i], input_dev->keybit); | ||
| 117 | clear_bit(0, input_dev->keybit); | ||
| 107 | 118 | ||
| 108 | serio_set_drvdata(serio, nkbd); | 119 | serio_set_drvdata(serio, nkbd); |
| 109 | 120 | ||
| 110 | err = serio_open(serio, drv); | 121 | err = serio_open(serio, drv); |
| 111 | if (err) { | 122 | if (err) |
| 112 | serio_set_drvdata(serio, NULL); | 123 | goto fail; |
| 113 | kfree(nkbd); | ||
| 114 | return err; | ||
| 115 | } | ||
| 116 | |||
| 117 | memcpy(nkbd->keycode, nkbd_keycode, sizeof(nkbd->keycode)); | ||
| 118 | for (i = 0; i < 128; i++) | ||
| 119 | set_bit(nkbd->keycode[i], nkbd->dev.keybit); | ||
| 120 | clear_bit(0, nkbd->dev.keybit); | ||
| 121 | |||
| 122 | sprintf(nkbd->phys, "%s/input0", serio->phys); | ||
| 123 | |||
| 124 | nkbd->dev.name = nkbd_name; | ||
| 125 | nkbd->dev.phys = nkbd->phys; | ||
| 126 | nkbd->dev.id.bustype = BUS_RS232; | ||
| 127 | nkbd->dev.id.vendor = SERIO_NEWTON; | ||
| 128 | nkbd->dev.id.product = 0x0001; | ||
| 129 | nkbd->dev.id.version = 0x0100; | ||
| 130 | nkbd->dev.dev = &serio->dev; | ||
| 131 | |||
| 132 | input_register_device(&nkbd->dev); | ||
| 133 | |||
| 134 | printk(KERN_INFO "input: %s on %s\n", nkbd_name, serio->phys); | ||
| 135 | 124 | ||
| 125 | input_register_device(nkbd->dev); | ||
| 136 | return 0; | 126 | return 0; |
| 127 | |||
| 128 | fail: serio_set_drvdata(serio, NULL); | ||
| 129 | input_free_device(input_dev); | ||
| 130 | kfree(nkbd); | ||
| 131 | return err; | ||
| 137 | } | 132 | } |
| 138 | 133 | ||
| 139 | static void nkbd_disconnect(struct serio *serio) | 134 | static void nkbd_disconnect(struct serio *serio) |
| 140 | { | 135 | { |
| 141 | struct nkbd *nkbd = serio_get_drvdata(serio); | 136 | struct nkbd *nkbd = serio_get_drvdata(serio); |
| 142 | 137 | ||
| 143 | input_unregister_device(&nkbd->dev); | ||
| 144 | serio_close(serio); | 138 | serio_close(serio); |
| 145 | serio_set_drvdata(serio, NULL); | 139 | serio_set_drvdata(serio, NULL); |
| 140 | input_unregister_device(nkbd->dev); | ||
| 146 | kfree(nkbd); | 141 | kfree(nkbd); |
| 147 | } | 142 | } |
| 148 | 143 | ||
