From patchwork Sat Apr 13 10:47:44 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Herrmann X-Patchwork-Id: 2440301 X-Patchwork-Delegate: jikos@jikos.cz Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id CAABD3FD1A for ; Sat, 13 Apr 2013 10:48:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753186Ab3DMKsc (ORCPT ); Sat, 13 Apr 2013 06:48:32 -0400 Received: from mail-ea0-f178.google.com ([209.85.215.178]:41000 "EHLO mail-ea0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752703Ab3DMKsb (ORCPT ); Sat, 13 Apr 2013 06:48:31 -0400 Received: by mail-ea0-f178.google.com with SMTP id o10so1592541eaj.37 for ; Sat, 13 Apr 2013 03:48:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=MGR25C8NENHeqp4zYTULdrg6nP+B6/rTM+IoF9ssd5c=; b=ZLnV3SgXxxaOm1XECZZYOJttt6qkd4P19dhMR5ieQH101q2j4zqXPVl9nGUmg6+AWr T5CT0mjDqhAODt4exJQbCq6A26VNAKYzBuawpApYX1ioIi/ckg5rSwhlUH2bI4Or0LTU e872kT2c/2CMxOemmB8fyXrcw3/CBQdYfvjsdCbRe+jTDq2iR3M/d0cMdcHCPYsGnFht nG7XY+j3iGtF8v7vhovO780GVvwFykqeumvqkRgRyth2bW+/NLt8A23mKPtGGBqzh1TX pro4txi0rGI/EdO3OE8O2eEqwgo+umlA2n8k0NtSQQAaIGc8z4UjiSjysksVAZu5JLg0 i1Kw== X-Received: by 10.14.87.199 with SMTP id y47mr14663283eee.17.1365850109843; Sat, 13 Apr 2013 03:48:29 -0700 (PDT) Received: from localhost.localdomain (stgt-5f71827d.pool.mediaWays.net. [95.113.130.125]) by mx.google.com with ESMTPS id t4sm15859796eel.0.2013.04.13.03.48.28 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 13 Apr 2013 03:48:29 -0700 (PDT) From: David Herrmann To: linux-input@vger.kernel.org Cc: Jiri Kosina , David Herrmann Subject: [PATCH 03/21] HID: wiimote: keep HID device open Date: Sat, 13 Apr 2013 12:47:44 +0200 Message-Id: <1365850082-3585-4-git-send-email-dh.herrmann@gmail.com> X-Mailer: git-send-email 1.8.2.1 In-Reply-To: <1365850082-3585-1-git-send-email-dh.herrmann@gmail.com> References: <1365850082-3585-1-git-send-email-dh.herrmann@gmail.com> Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org 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 --- drivers/hid/hid-wiimote-core.c | 48 ++++++++++-------------------------------- 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 2d85d3a..02656a8 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 1c104fc..267c89c 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 */