diff options
| -rw-r--r-- | drivers/input/input.c | 27 | ||||
| -rw-r--r-- | drivers/input/keyboard/lkkbd.c | 101 | ||||
| -rw-r--r-- | drivers/input/keyboard/locomokbd.c | 63 | ||||
| -rw-r--r-- | drivers/input/mouse/logips2pp.c | 3 | ||||
| -rw-r--r-- | include/linux/input.h | 2 | ||||
| -rw-r--r-- | sound/oss/dmasound/dmasound_awacs.c | 31 |
6 files changed, 129 insertions, 98 deletions
diff --git a/drivers/input/input.c b/drivers/input/input.c index 1a1654caedd5..0879915b14d5 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
| @@ -377,7 +377,7 @@ static int input_devices_read(char *buf, char **start, off_t pos, int count, int | |||
| 377 | 377 | ||
| 378 | list_for_each_entry(dev, &input_dev_list, node) { | 378 | list_for_each_entry(dev, &input_dev_list, node) { |
| 379 | 379 | ||
| 380 | path = dev->dynalloc ? kobject_get_path(&dev->cdev.kobj, GFP_KERNEL) : NULL; | 380 | path = kobject_get_path(&dev->cdev.kobj, GFP_KERNEL); |
| 381 | 381 | ||
| 382 | len = sprintf(buf, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x\n", | 382 | len = sprintf(buf, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x\n", |
| 383 | dev->id.bustype, dev->id.vendor, dev->id.product, dev->id.version); | 383 | dev->id.bustype, dev->id.vendor, dev->id.product, dev->id.version); |
| @@ -741,15 +741,21 @@ static void input_register_classdevice(struct input_dev *dev) | |||
| 741 | sysfs_create_group(&dev->cdev.kobj, &input_dev_caps_attr_group); | 741 | sysfs_create_group(&dev->cdev.kobj, &input_dev_caps_attr_group); |
| 742 | } | 742 | } |
| 743 | 743 | ||
| 744 | void input_register_device(struct input_dev *dev) | 744 | int input_register_device(struct input_dev *dev) |
| 745 | { | 745 | { |
| 746 | struct input_handle *handle; | 746 | struct input_handle *handle; |
| 747 | struct input_handler *handler; | 747 | struct input_handler *handler; |
| 748 | struct input_device_id *id; | 748 | struct input_device_id *id; |
| 749 | 749 | ||
| 750 | set_bit(EV_SYN, dev->evbit); | 750 | if (!dev->dynalloc) { |
| 751 | printk(KERN_WARNING "input: device %s is statically allocated, will not register\n" | ||
| 752 | "Please convert to input_allocate_device() or contact dtor_core@ameritech.net\n", | ||
| 753 | dev->name ? dev->name : "<Unknown>"); | ||
| 754 | return -EINVAL; | ||
| 755 | } | ||
| 751 | 756 | ||
| 752 | init_MUTEX(&dev->sem); | 757 | init_MUTEX(&dev->sem); |
| 758 | set_bit(EV_SYN, dev->evbit); | ||
| 753 | 759 | ||
| 754 | /* | 760 | /* |
| 755 | * If delay and period are pre-set by the driver, then autorepeating | 761 | * If delay and period are pre-set by the driver, then autorepeating |
| @@ -767,8 +773,7 @@ void input_register_device(struct input_dev *dev) | |||
| 767 | INIT_LIST_HEAD(&dev->h_list); | 773 | INIT_LIST_HEAD(&dev->h_list); |
| 768 | list_add_tail(&dev->node, &input_dev_list); | 774 | list_add_tail(&dev->node, &input_dev_list); |
| 769 | 775 | ||
| 770 | if (dev->dynalloc) | 776 | input_register_classdevice(dev); |
| 771 | input_register_classdevice(dev); | ||
| 772 | 777 | ||
| 773 | list_for_each_entry(handler, &input_handler_list, node) | 778 | list_for_each_entry(handler, &input_handler_list, node) |
| 774 | if (!handler->blacklist || !input_match_device(handler->blacklist, dev)) | 779 | if (!handler->blacklist || !input_match_device(handler->blacklist, dev)) |
| @@ -776,8 +781,9 @@ void input_register_device(struct input_dev *dev) | |||
| 776 | if ((handle = handler->connect(handler, dev, id))) | 781 | if ((handle = handler->connect(handler, dev, id))) |
| 777 | input_link_handle(handle); | 782 | input_link_handle(handle); |
| 778 | 783 | ||
| 779 | |||
| 780 | input_wakeup_procfs_readers(); | 784 | input_wakeup_procfs_readers(); |
| 785 | |||
| 786 | return 0; | ||
| 781 | } | 787 | } |
| 782 | 788 | ||
| 783 | void input_unregister_device(struct input_dev *dev) | 789 | void input_unregister_device(struct input_dev *dev) |
| @@ -797,11 +803,10 @@ void input_unregister_device(struct input_dev *dev) | |||
| 797 | 803 | ||
| 798 | list_del_init(&dev->node); | 804 | list_del_init(&dev->node); |
| 799 | 805 | ||
| 800 | if (dev->dynalloc) { | 806 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_caps_attr_group); |
| 801 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_caps_attr_group); | 807 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_id_attr_group); |
| 802 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_id_attr_group); | 808 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_group); |
| 803 | class_device_unregister(&dev->cdev); | 809 | class_device_unregister(&dev->cdev); |
| 804 | } | ||
| 805 | 810 | ||
| 806 | input_wakeup_procfs_readers(); | 811 | input_wakeup_procfs_readers(); |
| 807 | } | 812 | } |
diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c index 9481132532d0..77c4d9669ad0 100644 --- a/drivers/input/keyboard/lkkbd.c +++ b/drivers/input/keyboard/lkkbd.c | |||
| @@ -273,11 +273,11 @@ static lk_keycode_t lkkbd_keycode[LK_NUM_KEYCODES] = { | |||
| 273 | [0xfb] = KEY_APOSTROPHE, | 273 | [0xfb] = KEY_APOSTROPHE, |
| 274 | }; | 274 | }; |
| 275 | 275 | ||
| 276 | #define CHECK_LED(LED, BITS) do { \ | 276 | #define CHECK_LED(LK, VAR_ON, VAR_OFF, LED, BITS) do { \ |
| 277 | if (test_bit (LED, lk->dev->led)) \ | 277 | if (test_bit (LED, (LK)->dev->led)) \ |
| 278 | leds_on |= BITS; \ | 278 | VAR_ON |= BITS; \ |
| 279 | else \ | 279 | else \ |
| 280 | leds_off |= BITS; \ | 280 | VAR_OFF |= BITS; \ |
| 281 | } while (0) | 281 | } while (0) |
| 282 | 282 | ||
| 283 | /* | 283 | /* |
| @@ -298,6 +298,42 @@ struct lkkbd { | |||
| 298 | int ctrlclick_volume; | 298 | int ctrlclick_volume; |
| 299 | }; | 299 | }; |
| 300 | 300 | ||
| 301 | #ifdef LKKBD_DEBUG | ||
| 302 | /* | ||
| 303 | * Responses from the keyboard and mapping back to their names. | ||
| 304 | */ | ||
| 305 | static struct { | ||
| 306 | unsigned char value; | ||
| 307 | unsigned char *name; | ||
| 308 | } lk_response[] = { | ||
| 309 | #define RESPONSE(x) { .value = (x), .name = #x, } | ||
| 310 | RESPONSE (LK_STUCK_KEY), | ||
| 311 | RESPONSE (LK_SELFTEST_FAILED), | ||
| 312 | RESPONSE (LK_ALL_KEYS_UP), | ||
| 313 | RESPONSE (LK_METRONOME), | ||
| 314 | RESPONSE (LK_OUTPUT_ERROR), | ||
| 315 | RESPONSE (LK_INPUT_ERROR), | ||
| 316 | RESPONSE (LK_KBD_LOCKED), | ||
| 317 | RESPONSE (LK_KBD_TEST_MODE_ACK), | ||
| 318 | RESPONSE (LK_PREFIX_KEY_DOWN), | ||
| 319 | RESPONSE (LK_MODE_CHANGE_ACK), | ||
| 320 | RESPONSE (LK_RESPONSE_RESERVED), | ||
| 321 | #undef RESPONSE | ||
| 322 | }; | ||
| 323 | |||
| 324 | static unsigned char * | ||
| 325 | response_name (unsigned char value) | ||
| 326 | { | ||
| 327 | int i; | ||
| 328 | |||
| 329 | for (i = 0; i < ARRAY_SIZE (lk_response); i++) | ||
| 330 | if (lk_response[i].value == value) | ||
| 331 | return lk_response[i].name; | ||
| 332 | |||
| 333 | return "<unknown>"; | ||
| 334 | } | ||
| 335 | #endif /* LKKBD_DEBUG */ | ||
| 336 | |||
| 301 | /* | 337 | /* |
| 302 | * Calculate volume parameter byte for a given volume. | 338 | * Calculate volume parameter byte for a given volume. |
| 303 | */ | 339 | */ |
| @@ -440,43 +476,24 @@ lkkbd_interrupt (struct serio *serio, unsigned char data, unsigned int flags, | |||
| 440 | input_report_key (lk->dev, lk->keycode[i], 0); | 476 | input_report_key (lk->dev, lk->keycode[i], 0); |
| 441 | input_sync (lk->dev); | 477 | input_sync (lk->dev); |
| 442 | break; | 478 | break; |
| 443 | case LK_METRONOME: | 479 | |
| 444 | DBG (KERN_INFO "Got LK_METRONOME and don't " | 480 | case 0x01: |
| 445 | "know how to handle...\n"); | 481 | DBG (KERN_INFO "Got 0x01, scheduling re-initialization\n"); |
| 482 | lk->ignore_bytes = LK_NUM_IGNORE_BYTES; | ||
| 483 | lk->id[LK_NUM_IGNORE_BYTES - lk->ignore_bytes--] = data; | ||
| 484 | schedule_work (&lk->tq); | ||
| 446 | break; | 485 | break; |
| 486 | |||
| 487 | case LK_METRONOME: | ||
| 447 | case LK_OUTPUT_ERROR: | 488 | case LK_OUTPUT_ERROR: |
| 448 | DBG (KERN_INFO "Got LK_OUTPUT_ERROR and don't " | ||
| 449 | "know how to handle...\n"); | ||
| 450 | break; | ||
| 451 | case LK_INPUT_ERROR: | 489 | case LK_INPUT_ERROR: |
| 452 | DBG (KERN_INFO "Got LK_INPUT_ERROR and don't " | ||
| 453 | "know how to handle...\n"); | ||
| 454 | break; | ||
| 455 | case LK_KBD_LOCKED: | 490 | case LK_KBD_LOCKED: |
| 456 | DBG (KERN_INFO "Got LK_KBD_LOCKED and don't " | ||
| 457 | "know how to handle...\n"); | ||
| 458 | break; | ||
| 459 | case LK_KBD_TEST_MODE_ACK: | 491 | case LK_KBD_TEST_MODE_ACK: |
| 460 | DBG (KERN_INFO "Got LK_KBD_TEST_MODE_ACK and don't " | ||
| 461 | "know how to handle...\n"); | ||
| 462 | break; | ||
| 463 | case LK_PREFIX_KEY_DOWN: | 492 | case LK_PREFIX_KEY_DOWN: |
| 464 | DBG (KERN_INFO "Got LK_PREFIX_KEY_DOWN and don't " | ||
| 465 | "know how to handle...\n"); | ||
| 466 | break; | ||
| 467 | case LK_MODE_CHANGE_ACK: | 493 | case LK_MODE_CHANGE_ACK: |
| 468 | DBG (KERN_INFO "Got LK_MODE_CHANGE_ACK and ignored " | ||
| 469 | "it properly...\n"); | ||
| 470 | break; | ||
| 471 | case LK_RESPONSE_RESERVED: | 494 | case LK_RESPONSE_RESERVED: |
| 472 | DBG (KERN_INFO "Got LK_RESPONSE_RESERVED and don't " | 495 | DBG (KERN_INFO "Got %s and don't know how to handle...\n", |
| 473 | "know how to handle...\n"); | 496 | response_name (data)); |
| 474 | break; | ||
| 475 | case 0x01: | ||
| 476 | DBG (KERN_INFO "Got 0x01, scheduling re-initialization\n"); | ||
| 477 | lk->ignore_bytes = LK_NUM_IGNORE_BYTES; | ||
| 478 | lk->id[LK_NUM_IGNORE_BYTES - lk->ignore_bytes--] = data; | ||
| 479 | schedule_work (&lk->tq); | ||
| 480 | break; | 497 | break; |
| 481 | 498 | ||
| 482 | default: | 499 | default: |
| @@ -509,10 +526,10 @@ lkkbd_event (struct input_dev *dev, unsigned int type, unsigned int code, | |||
| 509 | 526 | ||
| 510 | switch (type) { | 527 | switch (type) { |
| 511 | case EV_LED: | 528 | case EV_LED: |
| 512 | CHECK_LED (LED_CAPSL, LK_LED_SHIFTLOCK); | 529 | CHECK_LED (lk, leds_on, leds_off, LED_CAPSL, LK_LED_SHIFTLOCK); |
| 513 | CHECK_LED (LED_COMPOSE, LK_LED_COMPOSE); | 530 | CHECK_LED (lk, leds_on, leds_off, LED_COMPOSE, LK_LED_COMPOSE); |
| 514 | CHECK_LED (LED_SCROLLL, LK_LED_SCROLLLOCK); | 531 | CHECK_LED (lk, leds_on, leds_off, LED_SCROLLL, LK_LED_SCROLLLOCK); |
| 515 | CHECK_LED (LED_SLEEP, LK_LED_WAIT); | 532 | CHECK_LED (lk, leds_on, leds_off, LED_SLEEP, LK_LED_WAIT); |
| 516 | if (leds_on != 0) { | 533 | if (leds_on != 0) { |
| 517 | lk->serio->write (lk->serio, LK_CMD_LED_ON); | 534 | lk->serio->write (lk->serio, LK_CMD_LED_ON); |
| 518 | lk->serio->write (lk->serio, leds_on); | 535 | lk->serio->write (lk->serio, leds_on); |
| @@ -574,10 +591,10 @@ lkkbd_reinit (void *data) | |||
| 574 | lk->serio->write (lk->serio, LK_CMD_SET_DEFAULTS); | 591 | lk->serio->write (lk->serio, LK_CMD_SET_DEFAULTS); |
| 575 | 592 | ||
| 576 | /* Set LEDs */ | 593 | /* Set LEDs */ |
| 577 | CHECK_LED (LED_CAPSL, LK_LED_SHIFTLOCK); | 594 | CHECK_LED (lk, leds_on, leds_off, LED_CAPSL, LK_LED_SHIFTLOCK); |
| 578 | CHECK_LED (LED_COMPOSE, LK_LED_COMPOSE); | 595 | CHECK_LED (lk, leds_on, leds_off, LED_COMPOSE, LK_LED_COMPOSE); |
| 579 | CHECK_LED (LED_SCROLLL, LK_LED_SCROLLLOCK); | 596 | CHECK_LED (lk, leds_on, leds_off, LED_SCROLLL, LK_LED_SCROLLLOCK); |
| 580 | CHECK_LED (LED_SLEEP, LK_LED_WAIT); | 597 | CHECK_LED (lk, leds_on, leds_off, LED_SLEEP, LK_LED_WAIT); |
| 581 | if (leds_on != 0) { | 598 | if (leds_on != 0) { |
| 582 | lk->serio->write (lk->serio, LK_CMD_LED_ON); | 599 | lk->serio->write (lk->serio, LK_CMD_LED_ON); |
| 583 | lk->serio->write (lk->serio, leds_on); | 600 | lk->serio->write (lk->serio, leds_on); |
diff --git a/drivers/input/keyboard/locomokbd.c b/drivers/input/keyboard/locomokbd.c index 8935290256b3..2c510881874a 100644 --- a/drivers/input/keyboard/locomokbd.c +++ b/drivers/input/keyboard/locomokbd.c | |||
| @@ -76,7 +76,7 @@ static unsigned char locomokbd_keycode[LOCOMOKBD_NUMKEYS] = { | |||
| 76 | 76 | ||
| 77 | struct locomokbd { | 77 | struct locomokbd { |
| 78 | unsigned char keycode[LOCOMOKBD_NUMKEYS]; | 78 | unsigned char keycode[LOCOMOKBD_NUMKEYS]; |
| 79 | struct input_dev input; | 79 | struct input_dev *input; |
| 80 | char phys[32]; | 80 | char phys[32]; |
| 81 | 81 | ||
| 82 | struct locomo_dev *ldev; | 82 | struct locomo_dev *ldev; |
| @@ -136,8 +136,7 @@ static void locomokbd_scankeyboard(struct locomokbd *locomokbd, struct pt_regs * | |||
| 136 | 136 | ||
| 137 | spin_lock_irqsave(&locomokbd->lock, flags); | 137 | spin_lock_irqsave(&locomokbd->lock, flags); |
| 138 | 138 | ||
| 139 | if (regs) | 139 | input_regs(locomokbd->input, regs); |
| 140 | input_regs(&locomokbd->input, regs); | ||
| 141 | 140 | ||
| 142 | locomokbd_charge_all(membase); | 141 | locomokbd_charge_all(membase); |
| 143 | 142 | ||
| @@ -152,16 +151,16 @@ static void locomokbd_scankeyboard(struct locomokbd *locomokbd, struct pt_regs * | |||
| 152 | scancode = SCANCODE(col, row); | 151 | scancode = SCANCODE(col, row); |
| 153 | if (rowd & KB_ROWMASK(row)) { | 152 | if (rowd & KB_ROWMASK(row)) { |
| 154 | num_pressed += 1; | 153 | num_pressed += 1; |
| 155 | input_report_key(&locomokbd->input, locomokbd->keycode[scancode], 1); | 154 | input_report_key(locomokbd->input, locomokbd->keycode[scancode], 1); |
| 156 | } else { | 155 | } else { |
| 157 | input_report_key(&locomokbd->input, locomokbd->keycode[scancode], 0); | 156 | input_report_key(locomokbd->input, locomokbd->keycode[scancode], 0); |
| 158 | } | 157 | } |
| 159 | } | 158 | } |
| 160 | locomokbd_reset_col(membase, col); | 159 | locomokbd_reset_col(membase, col); |
| 161 | } | 160 | } |
| 162 | locomokbd_activate_all(membase); | 161 | locomokbd_activate_all(membase); |
| 163 | 162 | ||
| 164 | input_sync(&locomokbd->input); | 163 | input_sync(locomokbd->input); |
| 165 | 164 | ||
| 166 | /* if any keys are pressed, enable the timer */ | 165 | /* if any keys are pressed, enable the timer */ |
| 167 | if (num_pressed) | 166 | if (num_pressed) |
| @@ -196,13 +195,15 @@ static void locomokbd_timer_callback(unsigned long data) | |||
| 196 | static int locomokbd_probe(struct locomo_dev *dev) | 195 | static int locomokbd_probe(struct locomo_dev *dev) |
| 197 | { | 196 | { |
| 198 | struct locomokbd *locomokbd; | 197 | struct locomokbd *locomokbd; |
| 198 | struct input_dev *input_dev; | ||
| 199 | int i, ret; | 199 | int i, ret; |
| 200 | 200 | ||
| 201 | locomokbd = kmalloc(sizeof(struct locomokbd), GFP_KERNEL); | 201 | locomokbd = kzalloc(sizeof(struct locomokbd), GFP_KERNEL); |
| 202 | if (!locomokbd) | 202 | input_dev = input_allocate_device(); |
| 203 | return -ENOMEM; | 203 | if (!locomokbd || !input_dev) { |
| 204 | 204 | ret = -ENOMEM; | |
| 205 | memset(locomokbd, 0, sizeof(struct locomokbd)); | 205 | goto free; |
| 206 | } | ||
| 206 | 207 | ||
| 207 | /* try and claim memory region */ | 208 | /* try and claim memory region */ |
| 208 | if (!request_mem_region((unsigned long) dev->mapbase, | 209 | if (!request_mem_region((unsigned long) dev->mapbase, |
| @@ -224,27 +225,26 @@ static int locomokbd_probe(struct locomo_dev *dev) | |||
| 224 | locomokbd->timer.function = locomokbd_timer_callback; | 225 | locomokbd->timer.function = locomokbd_timer_callback; |
| 225 | locomokbd->timer.data = (unsigned long) locomokbd; | 226 | locomokbd->timer.data = (unsigned long) locomokbd; |
| 226 | 227 | ||
| 227 | locomokbd->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REP); | 228 | locomokbd->input = input_dev; |
| 229 | strcpy(locomokbd->phys, "locomokbd/input0"); | ||
| 230 | |||
| 231 | input_dev->name = "LoCoMo keyboard"; | ||
| 232 | input_dev->phys = locomokbd->phys; | ||
| 233 | input_dev->id.bustype = BUS_HOST; | ||
| 234 | input_dev->id.vendor = 0x0001; | ||
| 235 | input_dev->id.product = 0x0001; | ||
| 236 | input_dev->id.version = 0x0100; | ||
| 237 | input_dev->private = locomokbd; | ||
| 228 | 238 | ||
| 229 | init_input_dev(&locomokbd->input); | 239 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); |
| 230 | locomokbd->input.keycode = locomokbd->keycode; | 240 | input_dev->keycode = locomokbd->keycode; |
| 231 | locomokbd->input.keycodesize = sizeof(unsigned char); | 241 | input_dev->keycodesize = sizeof(unsigned char); |
| 232 | locomokbd->input.keycodemax = ARRAY_SIZE(locomokbd_keycode); | 242 | input_dev->keycodemax = ARRAY_SIZE(locomokbd_keycode); |
| 233 | locomokbd->input.private = locomokbd; | ||
| 234 | 243 | ||
| 235 | memcpy(locomokbd->keycode, locomokbd_keycode, sizeof(locomokbd->keycode)); | 244 | memcpy(locomokbd->keycode, locomokbd_keycode, sizeof(locomokbd->keycode)); |
| 236 | for (i = 0; i < LOCOMOKBD_NUMKEYS; i++) | 245 | for (i = 0; i < LOCOMOKBD_NUMKEYS; i++) |
| 237 | set_bit(locomokbd->keycode[i], locomokbd->input.keybit); | 246 | set_bit(locomokbd->keycode[i], input_dev->keybit); |
| 238 | clear_bit(0, locomokbd->input.keybit); | 247 | clear_bit(0, input_dev->keybit); |
| 239 | |||
| 240 | strcpy(locomokbd->phys, "locomokbd/input0"); | ||
| 241 | |||
| 242 | locomokbd->input.name = "LoCoMo keyboard"; | ||
| 243 | locomokbd->input.phys = locomokbd->phys; | ||
| 244 | locomokbd->input.id.bustype = BUS_XTKBD; | ||
| 245 | locomokbd->input.id.vendor = 0x0001; | ||
| 246 | locomokbd->input.id.product = 0x0001; | ||
| 247 | locomokbd->input.id.version = 0x0100; | ||
| 248 | 248 | ||
| 249 | /* attempt to get the interrupt */ | 249 | /* attempt to get the interrupt */ |
| 250 | ret = request_irq(dev->irq[0], locomokbd_interrupt, 0, "locomokbd", locomokbd); | 250 | ret = request_irq(dev->irq[0], locomokbd_interrupt, 0, "locomokbd", locomokbd); |
| @@ -253,9 +253,7 @@ static int locomokbd_probe(struct locomo_dev *dev) | |||
| 253 | goto out; | 253 | goto out; |
| 254 | } | 254 | } |
| 255 | 255 | ||
| 256 | input_register_device(&locomokbd->input); | 256 | input_register_device(locomokbd->input); |
| 257 | |||
| 258 | printk(KERN_INFO "input: LoCoMo keyboard on locomokbd\n"); | ||
| 259 | 257 | ||
| 260 | return 0; | 258 | return 0; |
| 261 | 259 | ||
| @@ -263,6 +261,7 @@ out: | |||
| 263 | release_mem_region((unsigned long) dev->mapbase, dev->length); | 261 | release_mem_region((unsigned long) dev->mapbase, dev->length); |
| 264 | locomo_set_drvdata(dev, NULL); | 262 | locomo_set_drvdata(dev, NULL); |
| 265 | free: | 263 | free: |
| 264 | input_free_device(input_dev); | ||
| 266 | kfree(locomokbd); | 265 | kfree(locomokbd); |
| 267 | 266 | ||
| 268 | return ret; | 267 | return ret; |
| @@ -276,7 +275,7 @@ static int locomokbd_remove(struct locomo_dev *dev) | |||
| 276 | 275 | ||
| 277 | del_timer_sync(&locomokbd->timer); | 276 | del_timer_sync(&locomokbd->timer); |
| 278 | 277 | ||
| 279 | input_unregister_device(&locomokbd->input); | 278 | input_unregister_device(locomokbd->input); |
| 280 | locomo_set_drvdata(dev, NULL); | 279 | locomo_set_drvdata(dev, NULL); |
| 281 | 280 | ||
| 282 | release_mem_region((unsigned long) dev->mapbase, dev->length); | 281 | release_mem_region((unsigned long) dev->mapbase, dev->length); |
diff --git a/drivers/input/mouse/logips2pp.c b/drivers/input/mouse/logips2pp.c index 0f69ff46c1ae..31a59f7abfaf 100644 --- a/drivers/input/mouse/logips2pp.c +++ b/drivers/input/mouse/logips2pp.c | |||
| @@ -217,6 +217,9 @@ static struct ps2pp_info *get_model_info(unsigned char model) | |||
| 217 | { 61, PS2PP_KIND_MX, /* MX700 */ | 217 | { 61, PS2PP_KIND_MX, /* MX700 */ |
| 218 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | | 218 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | |
| 219 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, | 219 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, |
| 220 | { 66, PS2PP_KIND_MX, /* MX3100 reciver */ | ||
| 221 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | | ||
| 222 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN | PS2PP_HWHEEL }, | ||
| 220 | { 73, 0, PS2PP_SIDE_BTN }, | 223 | { 73, 0, PS2PP_SIDE_BTN }, |
| 221 | { 75, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, | 224 | { 75, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, |
| 222 | { 76, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, | 225 | { 76, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, |
diff --git a/include/linux/input.h b/include/linux/input.h index f623c745c21c..3c5823368ddb 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
| @@ -1007,7 +1007,7 @@ static inline void input_put_device(struct input_dev *dev) | |||
| 1007 | class_device_put(&dev->cdev); | 1007 | class_device_put(&dev->cdev); |
| 1008 | } | 1008 | } |
| 1009 | 1009 | ||
| 1010 | void input_register_device(struct input_dev *); | 1010 | int input_register_device(struct input_dev *); |
| 1011 | void input_unregister_device(struct input_dev *); | 1011 | void input_unregister_device(struct input_dev *); |
| 1012 | 1012 | ||
| 1013 | void input_register_handler(struct input_handler *); | 1013 | void input_register_handler(struct input_handler *); |
diff --git a/sound/oss/dmasound/dmasound_awacs.c b/sound/oss/dmasound/dmasound_awacs.c index b2bf8bac842d..cebd881b91ae 100644 --- a/sound/oss/dmasound/dmasound_awacs.c +++ b/sound/oss/dmasound/dmasound_awacs.c | |||
| @@ -2805,16 +2805,7 @@ __init setup_beep(void) | |||
| 2805 | return 0 ; | 2805 | return 0 ; |
| 2806 | } | 2806 | } |
| 2807 | 2807 | ||
| 2808 | static struct input_dev awacs_beep_dev = { | 2808 | static struct input_dev *awacs_beep_dev; |
| 2809 | .evbit = { BIT(EV_SND) }, | ||
| 2810 | .sndbit = { BIT(SND_BELL) | BIT(SND_TONE) }, | ||
| 2811 | .event = awacs_beep_event, | ||
| 2812 | .name = "dmasound beeper", | ||
| 2813 | .phys = "macio/input0", /* what the heck is this?? */ | ||
| 2814 | .id = { | ||
| 2815 | .bustype = BUS_HOST, | ||
| 2816 | }, | ||
| 2817 | }; | ||
| 2818 | 2809 | ||
| 2819 | int __init dmasound_awacs_init(void) | 2810 | int __init dmasound_awacs_init(void) |
| 2820 | { | 2811 | { |
| @@ -2907,6 +2898,22 @@ printk("dmasound_pmac: couldn't find a Codec we can handle\n"); | |||
| 2907 | return -ENODEV; | 2898 | return -ENODEV; |
| 2908 | } | 2899 | } |
| 2909 | 2900 | ||
| 2901 | awacs_beep_dev = input_allocate_device(); | ||
| 2902 | if (!awacs_beep_dev) { | ||
| 2903 | release_OF_resource(io, 0); | ||
| 2904 | release_OF_resource(io, 1); | ||
| 2905 | release_OF_resource(io, 2); | ||
| 2906 | printk(KERN_ERR "dmasound: can't allocate input device !\n"); | ||
| 2907 | return -ENOMEM; | ||
| 2908 | } | ||
| 2909 | |||
| 2910 | awacs_beep_dev->name = "dmasound beeper"; | ||
| 2911 | awacs_beep_dev->phys = "macio/input0"; | ||
| 2912 | awacs_beep_dev->id.bustype = BUS_HOST; | ||
| 2913 | awacs_beep_dev->event = awacs_beep_event; | ||
| 2914 | awacs_beep_dev->sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE); | ||
| 2915 | awacs_beep_dev->evbit[0] = BIT(EV_SND); | ||
| 2916 | |||
| 2910 | /* all OF versions I've seen use this value */ | 2917 | /* all OF versions I've seen use this value */ |
| 2911 | if (i2s_node) | 2918 | if (i2s_node) |
| 2912 | i2s = ioremap(io->addrs[0].address, 0x1000); | 2919 | i2s = ioremap(io->addrs[0].address, 0x1000); |
| @@ -3140,14 +3147,14 @@ printk("dmasound_pmac: Awacs/Screamer Codec Mfct: %d Rev %d\n", mfg, rev); | |||
| 3140 | * XXX: we should handle errors here, but that would mean | 3147 | * XXX: we should handle errors here, but that would mean |
| 3141 | * rewriting the whole init code. later.. | 3148 | * rewriting the whole init code. later.. |
| 3142 | */ | 3149 | */ |
| 3143 | input_register_device(&awacs_beep_dev); | 3150 | input_register_device(awacs_beep_dev); |
| 3144 | 3151 | ||
| 3145 | return dmasound_init(); | 3152 | return dmasound_init(); |
| 3146 | } | 3153 | } |
| 3147 | 3154 | ||
| 3148 | static void __exit dmasound_awacs_cleanup(void) | 3155 | static void __exit dmasound_awacs_cleanup(void) |
| 3149 | { | 3156 | { |
| 3150 | input_unregister_device(&awacs_beep_dev); | 3157 | input_unregister_device(awacs_beep_dev); |
| 3151 | 3158 | ||
| 3152 | switch (awacs_revision) { | 3159 | switch (awacs_revision) { |
| 3153 | case AWACS_TUMBLER: | 3160 | case AWACS_TUMBLER: |
