aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2013-05-05 17:12:47 -0400
committerJiri Kosina <jkosina@suse.cz>2013-06-03 05:06:59 -0400
commit5682b1a8690cfae5ad3bd40a123510fd4014066d (patch)
treece50800b45fe858ea45d3d9aab8780c8e3405b07
parent139385383267de547f5dbdbd2049d3a9c996c85e (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.c48
-rw-r--r--drivers/hid/hid-wiimote-ext.c12
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
629static 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
636static 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
643static int wiimote_accel_open(struct input_dev *dev) 629static 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
672static int wiimote_ir_open(struct input_dev *dev) 651static 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
690static void wiimote_ir_close(struct input_dev *dev) 658static 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
698static void handler_keys(struct wiimote_data *wdata, const __u8 *payload) 665static 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:
1298err_ir: 1270err_ir:
1299 input_unregister_device(wdata->accel); 1271 input_unregister_device(wdata->accel);
1300 wdata->accel = NULL; 1272 wdata->accel = NULL;
1273err_close:
1274 hid_hw_close(hdev);
1301err_stop: 1275err_stop:
1302 hid_hw_stop(hdev); 1276 hid_hw_stop(hdev);
1303err: 1277err:
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);
661static int wiiext_input_open(struct input_dev *dev) 661static 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
685static int wiiext_mp_open(struct input_dev *dev) 679static 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 */