From patchwork Mon Mar 9 19:44:47 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 5970731 X-Patchwork-Delegate: jikos@jikos.cz Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id D2148BF440 for ; Mon, 9 Mar 2015 19:45:05 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 09DBC20426 for ; Mon, 9 Mar 2015 19:45:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 136D92041E for ; Mon, 9 Mar 2015 19:45:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751318AbbCITpD (ORCPT ); Mon, 9 Mar 2015 15:45:03 -0400 Received: from mail-ig0-f172.google.com ([209.85.213.172]:36751 "EHLO mail-ig0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751138AbbCITpB (ORCPT ); Mon, 9 Mar 2015 15:45:01 -0400 Received: by igkb16 with SMTP id b16so24255544igk.1 for ; Mon, 09 Mar 2015 12:45:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id; bh=uq2Bs93oD/Acl1a7g74JfF9yxMXrI80tqFsm5ZoipIk=; b=NVVmpNA89MDO5jnfa61XeV8jRRUvhZm8vf2bzQ0ehaX1Y4v61Zqz61fof00ct5JxAJ CvjKErKzdacdmeX64sHFSjsqGt4g2uhQK/HqccWSlA61Faoji8aStFbGhw3MulVj7BaV 1YN738OvH3TUWlW6QnyB4oPzNXccQjKEpGJwE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=uq2Bs93oD/Acl1a7g74JfF9yxMXrI80tqFsm5ZoipIk=; b=WVhS48tO7wyquShJJ5qN08ahbpHlSWMtFkEN1liCMGa+9rorzejpzjIY+J541pbSVw xLYbh/Hue6uxL4EQBNrbRlWg/y8NwbY/tTTbfRj0le/DYGhr4ADAocqW939iT7a3T2j2 uqr4KoBuPVKQanFxskOlG77op2buXL8F8p8djvLve4/dp9PXtjoQvZwsBPdaC+MdZbep jDU/AsYLD2hSibxUhwAi05Xz4I8OgZ6CqHpY8JaxoDp0eoRtrWsgAUHQgd+Xbq6yP19K QtBnV3cT9zoDjYh5vV9LuQZkAGo+lWsVHDbh5657SpY1DjmQnHcsRCRS1LYIKO0HDDIg NRmA== X-Gm-Message-State: ALoCoQn7mkxq/D7USpEmLMfrf6t84uFHxEYpi94oVKYAGZdwKeeuDQBwu9fTn507T2ukrqzuxXZi X-Received: by 10.107.11.226 with SMTP id 95mr22610846iol.5.1425930300364; Mon, 09 Mar 2015 12:45:00 -0700 (PDT) Received: from tictac.mtv.corp.google.com ([172.22.65.76]) by mx.google.com with ESMTPSA id h15sm12687679ioh.27.2015.03.09.12.44.58 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 09 Mar 2015 12:44:59 -0700 (PDT) From: Doug Anderson To: Jiri Kosina , Andrew Duggan , Vincent Huang Cc: Benjamin Tissoires , Mika Westerberg , Dmitry Torokhov , Doug Anderson , jmaneyrol@invensense.com, borneo.antonio@gmail.com, seth.forshee@canonical.com, archana.patni@linux.intel.com, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] HID: i2c-hid: Fix suspend/resume when already runtime suspended Date: Mon, 9 Mar 2015 12:44:47 -0700 Message-Id: <1425930287-4615-1-git-send-email-dianders@chromium.org> X-Mailer: git-send-email 2.2.0.rc0.207.ga3a616c Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP If the i2c-hid device was runtime suspended and then the system suspended itself we'd end up disabling interrupts twice (in i2c_hid_runtime_suspend and i2c_hid_suspend) and not reenabling them until later when the i2c-hid device was runtime resumed. Unfortunately the i2c_hid_resume() calls i2c_hid_hwreset() and that only works properly if interrupts are enabled. We can fix this by taking the advice from "runtime_pm.txt". Specifically we'll change i2c-hid to always resume to full power. This only works if our parents are also resumed to full power, but given the suggestion in "runtime_pm.txt" this seems a reasonable assumption. Signed-off-by: Doug Anderson --- Note that this was tested on a 3.14 kernel with backports. Any testing that folks can do on ToT is appreciated. Changes in v2: - Move pm_runtime_enable() higher in resume drivers/hid/i2c-hid/i2c-hid.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c index ab4dd95..9e013f6 100644 --- a/drivers/hid/i2c-hid/i2c-hid.c +++ b/drivers/hid/i2c-hid/i2c-hid.c @@ -1090,15 +1090,18 @@ static int i2c_hid_suspend(struct device *dev) struct hid_device *hid = ihid->hid; int ret = 0; - disable_irq(ihid->irq); - if (device_may_wakeup(&client->dev)) - enable_irq_wake(ihid->irq); + if (!pm_runtime_suspended(dev)) { + /* Save some power */ + i2c_hid_set_power(client, I2C_HID_PWR_SLEEP); + + disable_irq(ihid->irq); + } if (hid->driver && hid->driver->suspend) ret = hid->driver->suspend(hid, PMSG_SUSPEND); - /* Save some power */ - i2c_hid_set_power(client, I2C_HID_PWR_SLEEP); + if (device_may_wakeup(&client->dev)) + enable_irq_wake(ihid->irq); return ret; } @@ -1110,6 +1113,11 @@ static int i2c_hid_resume(struct device *dev) struct i2c_hid *ihid = i2c_get_clientdata(client); struct hid_device *hid = ihid->hid; + /* We'll resume to full power */ + pm_runtime_disable(dev); + pm_runtime_set_active(dev); + pm_runtime_enable(dev); + enable_irq(ihid->irq); ret = i2c_hid_hwreset(client); if (ret)