diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2013-05-05 17:12:47 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2013-06-03 05:06:59 -0400 |
commit | 5682b1a8690cfae5ad3bd40a123510fd4014066d (patch) | |
tree | ce50800b45fe858ea45d3d9aab8780c8e3405b07 | |
parent | 139385383267de547f5dbdbd2049d3a9c996c85e (diff) |
HID: wiimote: keep HID device open
We need constant I/O to keep the state up-to-date and not miss any
packets. Hence, call hid_hw_open() during setup and hid_hw_close() during
destruction.
These are no-ops for Bluetooth HIDP, but lets be safe.
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r-- | drivers/hid/hid-wiimote-core.c | 48 | ||||
-rw-r--r-- | drivers/hid/hid-wiimote-ext.c | 12 |
2 files changed, 11 insertions, 49 deletions
diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c index 2d85d3a8b60a..02656a8cc7d7 100644 --- a/drivers/hid/hid-wiimote-core.c +++ b/drivers/hid/hid-wiimote-core.c | |||
@@ -626,30 +626,11 @@ static int wiimote_ff_play(struct input_dev *dev, void *data, | |||
626 | return 0; | 626 | return 0; |
627 | } | 627 | } |
628 | 628 | ||
629 | static int wiimote_input_open(struct input_dev *dev) | ||
630 | { | ||
631 | struct wiimote_data *wdata = input_get_drvdata(dev); | ||
632 | |||
633 | return hid_hw_open(wdata->hdev); | ||
634 | } | ||
635 | |||
636 | static void wiimote_input_close(struct input_dev *dev) | ||
637 | { | ||
638 | struct wiimote_data *wdata = input_get_drvdata(dev); | ||
639 | |||
640 | hid_hw_close(wdata->hdev); | ||
641 | } | ||
642 | |||
643 | static int wiimote_accel_open(struct input_dev *dev) | 629 | static int wiimote_accel_open(struct input_dev *dev) |
644 | { | 630 | { |
645 | struct wiimote_data *wdata = input_get_drvdata(dev); | 631 | struct wiimote_data *wdata = input_get_drvdata(dev); |
646 | int ret; | ||
647 | unsigned long flags; | 632 | unsigned long flags; |
648 | 633 | ||
649 | ret = hid_hw_open(wdata->hdev); | ||
650 | if (ret) | ||
651 | return ret; | ||
652 | |||
653 | spin_lock_irqsave(&wdata->state.lock, flags); | 634 | spin_lock_irqsave(&wdata->state.lock, flags); |
654 | wiiproto_req_accel(wdata, true); | 635 | wiiproto_req_accel(wdata, true); |
655 | spin_unlock_irqrestore(&wdata->state.lock, flags); | 636 | spin_unlock_irqrestore(&wdata->state.lock, flags); |
@@ -665,26 +646,13 @@ static void wiimote_accel_close(struct input_dev *dev) | |||
665 | spin_lock_irqsave(&wdata->state.lock, flags); | 646 | spin_lock_irqsave(&wdata->state.lock, flags); |
666 | wiiproto_req_accel(wdata, false); | 647 | wiiproto_req_accel(wdata, false); |
667 | spin_unlock_irqrestore(&wdata->state.lock, flags); | 648 | spin_unlock_irqrestore(&wdata->state.lock, flags); |
668 | |||
669 | hid_hw_close(wdata->hdev); | ||
670 | } | 649 | } |
671 | 650 | ||
672 | static int wiimote_ir_open(struct input_dev *dev) | 651 | static int wiimote_ir_open(struct input_dev *dev) |
673 | { | 652 | { |
674 | struct wiimote_data *wdata = input_get_drvdata(dev); | 653 | struct wiimote_data *wdata = input_get_drvdata(dev); |
675 | int ret; | ||
676 | |||
677 | ret = hid_hw_open(wdata->hdev); | ||
678 | if (ret) | ||
679 | return ret; | ||
680 | |||
681 | ret = wiimote_init_ir(wdata, WIIPROTO_FLAG_IR_BASIC); | ||
682 | if (ret) { | ||
683 | hid_hw_close(wdata->hdev); | ||
684 | return ret; | ||
685 | } | ||
686 | 654 | ||
687 | return 0; | 655 | return wiimote_init_ir(wdata, WIIPROTO_FLAG_IR_BASIC); |
688 | } | 656 | } |
689 | 657 | ||
690 | static void wiimote_ir_close(struct input_dev *dev) | 658 | static void wiimote_ir_close(struct input_dev *dev) |
@@ -692,7 +660,6 @@ static void wiimote_ir_close(struct input_dev *dev) | |||
692 | struct wiimote_data *wdata = input_get_drvdata(dev); | 660 | struct wiimote_data *wdata = input_get_drvdata(dev); |
693 | 661 | ||
694 | wiimote_init_ir(wdata, 0); | 662 | wiimote_init_ir(wdata, 0); |
695 | hid_hw_close(wdata->hdev); | ||
696 | } | 663 | } |
697 | 664 | ||
698 | static void handler_keys(struct wiimote_data *wdata, const __u8 *payload) | 665 | static void handler_keys(struct wiimote_data *wdata, const __u8 *payload) |
@@ -1091,8 +1058,6 @@ static struct wiimote_data *wiimote_create(struct hid_device *hdev) | |||
1091 | hid_set_drvdata(hdev, wdata); | 1058 | hid_set_drvdata(hdev, wdata); |
1092 | 1059 | ||
1093 | input_set_drvdata(wdata->input, wdata); | 1060 | input_set_drvdata(wdata->input, wdata); |
1094 | wdata->input->open = wiimote_input_open; | ||
1095 | wdata->input->close = wiimote_input_close; | ||
1096 | wdata->input->dev.parent = &wdata->hdev->dev; | 1061 | wdata->input->dev.parent = &wdata->hdev->dev; |
1097 | wdata->input->id.bustype = wdata->hdev->bus; | 1062 | wdata->input->id.bustype = wdata->hdev->bus; |
1098 | wdata->input->id.vendor = wdata->hdev->vendor; | 1063 | wdata->input->id.vendor = wdata->hdev->vendor; |
@@ -1193,6 +1158,7 @@ static void wiimote_destroy(struct wiimote_data *wdata) | |||
1193 | input_unregister_device(wdata->ir); | 1158 | input_unregister_device(wdata->ir); |
1194 | input_unregister_device(wdata->input); | 1159 | input_unregister_device(wdata->input); |
1195 | cancel_work_sync(&wdata->queue.worker); | 1160 | cancel_work_sync(&wdata->queue.worker); |
1161 | hid_hw_close(wdata->hdev); | ||
1196 | hid_hw_stop(wdata->hdev); | 1162 | hid_hw_stop(wdata->hdev); |
1197 | 1163 | ||
1198 | kfree(wdata); | 1164 | kfree(wdata); |
@@ -1224,10 +1190,16 @@ static int wiimote_hid_probe(struct hid_device *hdev, | |||
1224 | goto err; | 1190 | goto err; |
1225 | } | 1191 | } |
1226 | 1192 | ||
1193 | ret = hid_hw_open(hdev); | ||
1194 | if (ret) { | ||
1195 | hid_err(hdev, "cannot start hardware I/O\n"); | ||
1196 | goto err_stop; | ||
1197 | } | ||
1198 | |||
1227 | ret = input_register_device(wdata->accel); | 1199 | ret = input_register_device(wdata->accel); |
1228 | if (ret) { | 1200 | if (ret) { |
1229 | hid_err(hdev, "Cannot register input device\n"); | 1201 | hid_err(hdev, "Cannot register input device\n"); |
1230 | goto err_stop; | 1202 | goto err_close; |
1231 | } | 1203 | } |
1232 | 1204 | ||
1233 | ret = input_register_device(wdata->ir); | 1205 | ret = input_register_device(wdata->ir); |
@@ -1298,6 +1270,8 @@ err_input: | |||
1298 | err_ir: | 1270 | err_ir: |
1299 | input_unregister_device(wdata->accel); | 1271 | input_unregister_device(wdata->accel); |
1300 | wdata->accel = NULL; | 1272 | wdata->accel = NULL; |
1273 | err_close: | ||
1274 | hid_hw_close(hdev); | ||
1301 | err_stop: | 1275 | err_stop: |
1302 | hid_hw_stop(hdev); | 1276 | hid_hw_stop(hdev); |
1303 | err: | 1277 | err: |
diff --git a/drivers/hid/hid-wiimote-ext.c b/drivers/hid/hid-wiimote-ext.c index 1c104fca4199..267c89c46d3e 100644 --- a/drivers/hid/hid-wiimote-ext.c +++ b/drivers/hid/hid-wiimote-ext.c | |||
@@ -661,11 +661,6 @@ static DEVICE_ATTR(extension, S_IRUGO, wiiext_show, NULL); | |||
661 | static int wiiext_input_open(struct input_dev *dev) | 661 | static int wiiext_input_open(struct input_dev *dev) |
662 | { | 662 | { |
663 | struct wiimote_ext *ext = input_get_drvdata(dev); | 663 | struct wiimote_ext *ext = input_get_drvdata(dev); |
664 | int ret; | ||
665 | |||
666 | ret = hid_hw_open(ext->wdata->hdev); | ||
667 | if (ret) | ||
668 | return ret; | ||
669 | 664 | ||
670 | atomic_inc(&ext->opened); | 665 | atomic_inc(&ext->opened); |
671 | wiiext_schedule(ext); | 666 | wiiext_schedule(ext); |
@@ -679,17 +674,11 @@ static void wiiext_input_close(struct input_dev *dev) | |||
679 | 674 | ||
680 | atomic_dec(&ext->opened); | 675 | atomic_dec(&ext->opened); |
681 | wiiext_schedule(ext); | 676 | wiiext_schedule(ext); |
682 | hid_hw_close(ext->wdata->hdev); | ||
683 | } | 677 | } |
684 | 678 | ||
685 | static int wiiext_mp_open(struct input_dev *dev) | 679 | static int wiiext_mp_open(struct input_dev *dev) |
686 | { | 680 | { |
687 | struct wiimote_ext *ext = input_get_drvdata(dev); | 681 | struct wiimote_ext *ext = input_get_drvdata(dev); |
688 | int ret; | ||
689 | |||
690 | ret = hid_hw_open(ext->wdata->hdev); | ||
691 | if (ret) | ||
692 | return ret; | ||
693 | 682 | ||
694 | atomic_inc(&ext->mp_opened); | 683 | atomic_inc(&ext->mp_opened); |
695 | wiiext_schedule(ext); | 684 | wiiext_schedule(ext); |
@@ -703,7 +692,6 @@ static void wiiext_mp_close(struct input_dev *dev) | |||
703 | 692 | ||
704 | atomic_dec(&ext->mp_opened); | 693 | atomic_dec(&ext->mp_opened); |
705 | wiiext_schedule(ext); | 694 | wiiext_schedule(ext); |
706 | hid_hw_close(ext->wdata->hdev); | ||
707 | } | 695 | } |
708 | 696 | ||
709 | /* Initializes the extension driver of a wiimote */ | 697 | /* Initializes the extension driver of a wiimote */ |