diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2013-05-05 23:12:47 +0200 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2013-06-03 11:06:59 +0200 |
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, return 0; } -static int wiimote_input_open(struct input_dev *dev) -{ - struct wiimote_data *wdata = input_get_drvdata(dev); - - return hid_hw_open(wdata->hdev); -} - -static void wiimote_input_close(struct input_dev *dev) -{ - struct wiimote_data *wdata = input_get_drvdata(dev); - - hid_hw_close(wdata->hdev); -} - static int wiimote_accel_open(struct input_dev *dev) { struct wiimote_data *wdata = input_get_drvdata(dev); - int ret; unsigned long flags; - ret = hid_hw_open(wdata->hdev); - if (ret) - return ret; - spin_lock_irqsave(&wdata->state.lock, flags); wiiproto_req_accel(wdata, true); spin_unlock_irqrestore(&wdata->state.lock, flags); @@ -665,26 +646,13 @@ static void wiimote_accel_close(struct input_dev *dev) spin_lock_irqsave(&wdata->state.lock, flags); wiiproto_req_accel(wdata, false); spin_unlock_irqrestore(&wdata->state.lock, flags); - - hid_hw_close(wdata->hdev); } static int wiimote_ir_open(struct input_dev *dev) { struct wiimote_data *wdata = input_get_drvdata(dev); - int ret; - - ret = hid_hw_open(wdata->hdev); - if (ret) - return ret; - - ret = wiimote_init_ir(wdata, WIIPROTO_FLAG_IR_BASIC); - if (ret) { - hid_hw_close(wdata->hdev); - return ret; - } - return 0; + return wiimote_init_ir(wdata, WIIPROTO_FLAG_IR_BASIC); } static void wiimote_ir_close(struct input_dev *dev) @@ -692,7 +660,6 @@ static void wiimote_ir_close(struct input_dev *dev) struct wiimote_data *wdata = input_get_drvdata(dev); wiimote_init_ir(wdata, 0); - hid_hw_close(wdata->hdev); } 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) hid_set_drvdata(hdev, wdata); input_set_drvdata(wdata->input, wdata); - wdata->input->open = wiimote_input_open; - wdata->input->close = wiimote_input_close; wdata->input->dev.parent = &wdata->hdev->dev; wdata->input->id.bustype = wdata->hdev->bus; wdata->input->id.vendor = wdata->hdev->vendor; @@ -1193,6 +1158,7 @@ static void wiimote_destroy(struct wiimote_data *wdata) input_unregister_device(wdata->ir); input_unregister_device(wdata->input); cancel_work_sync(&wdata->queue.worker); + hid_hw_close(wdata->hdev); hid_hw_stop(wdata->hdev); kfree(wdata); @@ -1224,10 +1190,16 @@ static int wiimote_hid_probe(struct hid_device *hdev, goto err; } + ret = hid_hw_open(hdev); + if (ret) { + hid_err(hdev, "cannot start hardware I/O\n"); + goto err_stop; + } + ret = input_register_device(wdata->accel); if (ret) { hid_err(hdev, "Cannot register input device\n"); - goto err_stop; + goto err_close; } ret = input_register_device(wdata->ir); @@ -1298,6 +1270,8 @@ err_input: err_ir: input_unregister_device(wdata->accel); wdata->accel = NULL; +err_close: + hid_hw_close(hdev); err_stop: hid_hw_stop(hdev); 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); static int wiiext_input_open(struct input_dev *dev) { struct wiimote_ext *ext = input_get_drvdata(dev); - int ret; - - ret = hid_hw_open(ext->wdata->hdev); - if (ret) - return ret; atomic_inc(&ext->opened); wiiext_schedule(ext); @@ -679,17 +674,11 @@ static void wiiext_input_close(struct input_dev *dev) atomic_dec(&ext->opened); wiiext_schedule(ext); - hid_hw_close(ext->wdata->hdev); } static int wiiext_mp_open(struct input_dev *dev) { struct wiimote_ext *ext = input_get_drvdata(dev); - int ret; - - ret = hid_hw_open(ext->wdata->hdev); - if (ret) - return ret; atomic_inc(&ext->mp_opened); wiiext_schedule(ext); @@ -703,7 +692,6 @@ static void wiiext_mp_close(struct input_dev *dev) atomic_dec(&ext->mp_opened); wiiext_schedule(ext); - hid_hw_close(ext->wdata->hdev); } /* Initializes the extension driver of a wiimote */ |