From patchwork Sat Apr 13 10:47:46 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Herrmann X-Patchwork-Id: 2440321 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 B84313FD1A for ; Sat, 13 Apr 2013 10:48:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754048Ab3DMKsf (ORCPT ); Sat, 13 Apr 2013 06:48:35 -0400 Received: from mail-ea0-f170.google.com ([209.85.215.170]:43828 "EHLO mail-ea0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753371Ab3DMKse (ORCPT ); Sat, 13 Apr 2013 06:48:34 -0400 Received: by mail-ea0-f170.google.com with SMTP id a15so1525756eae.1 for ; Sat, 13 Apr 2013 03:48:33 -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=pYrrFuB42oUC3Qt6PoXh5NMJpI88hut9QesRrzXmWUs=; b=nrRh2jaQYNnWi3K3gDL2Rl+h3cG2nEuJ1tBbks+Yir/nn3A8H4eonzvhhM/UvWFMJD +/5ZdQLOYjPV0qDHsE1zH/eg5gvuCQmCpyXa/nBTZyIDQRxl1XMQhYjuh43kVZIdBPIP LoD6motdmkFi7ZgMfx+h2hOycuiwoowPJRXW3Urj1wIVmdYEW7sGZbrxTDBslRJJmo/j JEUy0VZQXqCuFbRw2oMG7j1BINVcv4dxrXDHUbxQ8DyG9gITCT0qGxBlpbL7usfuB9Cu IgOHBqJofVXBOxjFIl2FXFlvMIUUE4Spm+yoWv/sWfBv5Si6+7c9LZqUORSSHXUwQiQu HpUQ== X-Received: by 10.15.107.205 with SMTP id cb53mr38370287eeb.14.1365850113420; Sat, 13 Apr 2013 03:48:33 -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.31 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 13 Apr 2013 03:48:32 -0700 (PDT) From: David Herrmann To: linux-input@vger.kernel.org Cc: Jiri Kosina , David Herrmann Subject: [PATCH 05/21] HID: wiimote: use cached battery values on I/O failure Date: Sat, 13 Apr 2013 12:47:46 +0200 Message-Id: <1365850082-3585-6-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 Battery reports are sent along every status report of the Wii Remote. So chances are pretty high that we have an up-to-date battery cache at any time. Therefore, initialize the battery-cache to 100% and then return battery values from the cache if the query fails. This works around a power_supply limitation in that it requires us to be able to query the device during power_supply registration and removal. Otherwise, "add" or "remove" udev events are not sent. If we answer these requests from our cache instead, we avoid dropping these events and no longer cause warnings printed. Signed-off-by: David Herrmann --- drivers/hid/hid-wiimote-core.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c index 2d56a08..e47c949 100644 --- a/drivers/hid/hid-wiimote-core.c +++ b/drivers/hid/hid-wiimote-core.c @@ -461,12 +461,12 @@ static int wiimote_battery_get_property(struct power_supply *psy, wiiproto_req_status(wdata); spin_unlock_irqrestore(&wdata->state.lock, flags); - ret = wiimote_cmd_wait(wdata); - state = wdata->state.cmd_battery; + wiimote_cmd_wait(wdata); wiimote_cmd_release(wdata); - if (ret) - return ret; + spin_lock_irqsave(&wdata->state.lock, flags); + state = wdata->state.cmd_battery; + spin_unlock_irqrestore(&wdata->state.lock, flags); switch (psp) { case POWER_SUPPLY_PROP_CAPACITY: @@ -923,10 +923,9 @@ static void handler_status(struct wiimote_data *wdata, const __u8 *payload) wiiext_event(wdata, false); } - if (wiimote_cmd_pending(wdata, WIIPROTO_REQ_SREQ, 0)) { - wdata->state.cmd_battery = payload[5]; + wdata->state.cmd_battery = payload[5]; + if (wiimote_cmd_pending(wdata, WIIPROTO_REQ_SREQ, 0)) wiimote_cmd_complete(wdata); - } } /* reduced generic report with "BB BB" key data only */ @@ -1279,6 +1278,7 @@ static struct wiimote_data *wiimote_create(struct hid_device *hdev) init_completion(&wdata->state.ready); mutex_init(&wdata->state.sync); wdata->state.drm = WIIPROTO_REQ_DRM_K; + wdata->state.cmd_battery = 0xff; INIT_WORK(&wdata->init_worker, wiimote_init_worker);