diff options
Diffstat (limited to 'drivers/usb/input/ati_remote.c')
-rw-r--r-- | drivers/usb/input/ati_remote.c | 135 |
1 files changed, 77 insertions, 58 deletions
diff --git a/drivers/usb/input/ati_remote.c b/drivers/usb/input/ati_remote.c index 5a56f6cb36a8..3719fcb04b8f 100644 --- a/drivers/usb/input/ati_remote.c +++ b/drivers/usb/input/ati_remote.c | |||
@@ -157,9 +157,6 @@ MODULE_DEVICE_TABLE(usb, ati_remote_table); | |||
157 | static char init1[] = { 0x01, 0x00, 0x20, 0x14 }; | 157 | static char init1[] = { 0x01, 0x00, 0x20, 0x14 }; |
158 | static char init2[] = { 0x01, 0x00, 0x20, 0x14, 0x20, 0x20, 0x20 }; | 158 | static char init2[] = { 0x01, 0x00, 0x20, 0x14, 0x20, 0x20, 0x20 }; |
159 | 159 | ||
160 | /* Acceleration curve for directional control pad */ | ||
161 | static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 }; | ||
162 | |||
163 | struct ati_remote { | 160 | struct ati_remote { |
164 | struct input_dev *idev; | 161 | struct input_dev *idev; |
165 | struct usb_device *udev; | 162 | struct usb_device *udev; |
@@ -417,6 +414,43 @@ static int ati_remote_event_lookup(int rem, unsigned char d1, unsigned char d2) | |||
417 | } | 414 | } |
418 | 415 | ||
419 | /* | 416 | /* |
417 | * ati_remote_compute_accel | ||
418 | * | ||
419 | * Implements acceleration curve for directional control pad | ||
420 | * If elapsed time since last event is > 1/4 second, user "stopped", | ||
421 | * so reset acceleration. Otherwise, user is probably holding the control | ||
422 | * pad down, so we increase acceleration, ramping up over two seconds to | ||
423 | * a maximum speed. | ||
424 | */ | ||
425 | static int ati_remote_compute_accel(struct ati_remote *ati_remote) | ||
426 | { | ||
427 | static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 }; | ||
428 | unsigned long now = jiffies; | ||
429 | int acc; | ||
430 | |||
431 | if (time_after(now, ati_remote->old_jiffies + msecs_to_jiffies(250))) { | ||
432 | acc = 1; | ||
433 | ati_remote->acc_jiffies = now; | ||
434 | } | ||
435 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(125))) | ||
436 | acc = accel[0]; | ||
437 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(250))) | ||
438 | acc = accel[1]; | ||
439 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(500))) | ||
440 | acc = accel[2]; | ||
441 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(1000))) | ||
442 | acc = accel[3]; | ||
443 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(1500))) | ||
444 | acc = accel[4]; | ||
445 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(2000))) | ||
446 | acc = accel[5]; | ||
447 | else | ||
448 | acc = accel[6]; | ||
449 | |||
450 | return acc; | ||
451 | } | ||
452 | |||
453 | /* | ||
420 | * ati_remote_report_input | 454 | * ati_remote_report_input |
421 | */ | 455 | */ |
422 | static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) | 456 | static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) |
@@ -494,63 +528,48 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) | |||
494 | ati_remote_tbl[index].code, 0); | 528 | ati_remote_tbl[index].code, 0); |
495 | input_sync(dev); | 529 | input_sync(dev); |
496 | 530 | ||
497 | return; | 531 | } else { |
498 | } | ||
499 | 532 | ||
500 | /* | 533 | /* |
501 | * Other event kinds are from the directional control pad, and have an | 534 | * Other event kinds are from the directional control pad, and have an |
502 | * acceleration factor applied to them. Without this acceleration, the | 535 | * acceleration factor applied to them. Without this acceleration, the |
503 | * control pad is mostly unusable. | 536 | * control pad is mostly unusable. |
504 | * | 537 | */ |
505 | * If elapsed time since last event is > 1/4 second, user "stopped", | 538 | acc = ati_remote_compute_accel(ati_remote); |
506 | * so reset acceleration. Otherwise, user is probably holding the control | ||
507 | * pad down, so we increase acceleration, ramping up over two seconds to | ||
508 | * a maximum speed. The acceleration curve is #defined above. | ||
509 | */ | ||
510 | if (time_after(jiffies, ati_remote->old_jiffies + (HZ >> 2))) { | ||
511 | acc = 1; | ||
512 | ati_remote->acc_jiffies = jiffies; | ||
513 | } | ||
514 | else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ >> 3))) acc = accel[0]; | ||
515 | else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ >> 2))) acc = accel[1]; | ||
516 | else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ >> 1))) acc = accel[2]; | ||
517 | else if (time_before(jiffies, ati_remote->acc_jiffies + HZ)) acc = accel[3]; | ||
518 | else if (time_before(jiffies, ati_remote->acc_jiffies + HZ+(HZ>>1))) acc = accel[4]; | ||
519 | else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ << 1))) acc = accel[5]; | ||
520 | else acc = accel[6]; | ||
521 | |||
522 | input_regs(dev, regs); | ||
523 | switch (ati_remote_tbl[index].kind) { | ||
524 | case KIND_ACCEL: | ||
525 | input_event(dev, ati_remote_tbl[index].type, | ||
526 | ati_remote_tbl[index].code, | ||
527 | ati_remote_tbl[index].value * acc); | ||
528 | break; | ||
529 | case KIND_LU: | ||
530 | input_report_rel(dev, REL_X, -acc); | ||
531 | input_report_rel(dev, REL_Y, -acc); | ||
532 | break; | ||
533 | case KIND_RU: | ||
534 | input_report_rel(dev, REL_X, acc); | ||
535 | input_report_rel(dev, REL_Y, -acc); | ||
536 | break; | ||
537 | case KIND_LD: | ||
538 | input_report_rel(dev, REL_X, -acc); | ||
539 | input_report_rel(dev, REL_Y, acc); | ||
540 | break; | ||
541 | case KIND_RD: | ||
542 | input_report_rel(dev, REL_X, acc); | ||
543 | input_report_rel(dev, REL_Y, acc); | ||
544 | break; | ||
545 | default: | ||
546 | dev_dbg(&ati_remote->interface->dev, "ati_remote kind=%d\n", | ||
547 | ati_remote_tbl[index].kind); | ||
548 | } | ||
549 | input_sync(dev); | ||
550 | 539 | ||
551 | ati_remote->old_jiffies = jiffies; | 540 | input_regs(dev, regs); |
552 | ati_remote->old_data[0] = data[1]; | 541 | switch (ati_remote_tbl[index].kind) { |
553 | ati_remote->old_data[1] = data[2]; | 542 | case KIND_ACCEL: |
543 | input_event(dev, ati_remote_tbl[index].type, | ||
544 | ati_remote_tbl[index].code, | ||
545 | ati_remote_tbl[index].value * acc); | ||
546 | break; | ||
547 | case KIND_LU: | ||
548 | input_report_rel(dev, REL_X, -acc); | ||
549 | input_report_rel(dev, REL_Y, -acc); | ||
550 | break; | ||
551 | case KIND_RU: | ||
552 | input_report_rel(dev, REL_X, acc); | ||
553 | input_report_rel(dev, REL_Y, -acc); | ||
554 | break; | ||
555 | case KIND_LD: | ||
556 | input_report_rel(dev, REL_X, -acc); | ||
557 | input_report_rel(dev, REL_Y, acc); | ||
558 | break; | ||
559 | case KIND_RD: | ||
560 | input_report_rel(dev, REL_X, acc); | ||
561 | input_report_rel(dev, REL_Y, acc); | ||
562 | break; | ||
563 | default: | ||
564 | dev_dbg(&ati_remote->interface->dev, "ati_remote kind=%d\n", | ||
565 | ati_remote_tbl[index].kind); | ||
566 | } | ||
567 | input_sync(dev); | ||
568 | |||
569 | ati_remote->old_jiffies = jiffies; | ||
570 | ati_remote->old_data[0] = data[1]; | ||
571 | ati_remote->old_data[1] = data[2]; | ||
572 | } | ||
554 | } | 573 | } |
555 | 574 | ||
556 | /* | 575 | /* |