From patchwork Tue Nov 26 13:50:27 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 294328 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-pb0-x23a.google.com (mail-pb0-x23a.google.com [IPv6:2607:f8b0:400e:c01::23a]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 6CEB52C00B1 for ; Wed, 27 Nov 2013 00:50:44 +1100 (EST) Received: by mail-pb0-f58.google.com with SMTP id uo5sf1548001pbc.23 for ; Tue, 26 Nov 2013 05:50:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=mime-version:from:to:cc:subject:date:message-id:in-reply-to :references:x-original-sender:x-original-authentication-results :reply-to:precedence:mailing-list:list-id:list-post:list-help :list-archive:sender:list-subscribe:list-unsubscribe:content-type; bh=JiL8up6RehDzhTYouY02aYP7Lle/TNSSUvcrrGPgfEs=; b=D1L8vRrhiFxBozLN2DMeNEamt+vKszI0aVJwz5qfq+FVinbpJ3jaYqq5WI74ITbDET 0X+IFqPUi1Qvt6s4450OJQGqARAWFlhLZ6vVgKnc6H+9DwYT7/WLJJlzmglhNmAjjHzJ sqqrJR6u7KtYcgN0/FmlXUzXKAZB6wkifD6zdtY2r7hKDk6q2ub1jmCFvznXWeqn8bRH vPkz3hfpuOZA5nnIr96xAUS4uhHnU2e5e0Tj9a/cGlwL4T93iAt1lP7Pi2oyLpC8BXY8 pG7bskQXQi+qXkLa4wbxIlSaG7WuZ1kfPTd/E6NcQriCS8PmI+Wit4IAy/UdnnfHRMN8 np+Q== X-Received: by 10.49.81.162 with SMTP id b2mr727qey.41.1385473842370; Tue, 26 Nov 2013 05:50:42 -0800 (PST) MIME-Version: 1.0 X-BeenThere: rtc-linux@googlegroups.com Received: by 10.49.37.134 with SMTP id y6ls2615208qej.15.gmail; Tue, 26 Nov 2013 05:50:42 -0800 (PST) X-Received: by 10.59.5.68 with SMTP id ck4mr11737240ved.9.1385473842052; Tue, 26 Nov 2013 05:50:42 -0800 (PST) Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com. [210.118.77.12]) by gmr-mx.google.com with ESMTPS id kh12si5402246pab.2.2013.11.26.05.50.41 for (version=TLSv1 cipher=RC4-MD5 bits=128/128); Tue, 26 Nov 2013 05:50:42 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of k.kozlowski@samsung.com designates 210.118.77.12 as permitted sender) client-ip=210.118.77.12; Received: from eucpsbgm2.samsung.com (unknown [203.254.199.245]) by mailout2.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MWV00HO8IGG9310@mailout2.w1.samsung.com> for rtc-linux@googlegroups.com; Tue, 26 Nov 2013 13:50:40 +0000 (GMT) X-AuditID: cbfec7f5-b7f706d0000017c2-a0-5294a7309b4c Received: from eusync2.samsung.com ( [203.254.199.212]) by eucpsbgm2.samsung.com (EUCPMTA) with SMTP id 1C.5E.06082.037A4925; Tue, 26 Nov 2013 13:50:40 +0000 (GMT) Received: from AMDC1943.digital.local ([106.116.151.171]) by eusync2.samsung.com (Oracle Communications Messaging Server 7u4-23.01(7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0MWV00L4GIGAFY60@eusync2.samsung.com>; Tue, 26 Nov 2013 13:50:40 +0000 (GMT) From: Krzysztof Kozlowski To: Sangbeom Kim , Samuel Ortiz , Lee Jones , Alessandro Zummo , linux-kernel@vger.kernel.org, rtc-linux@googlegroups.com Cc: Marek Szyprowski , Geert Uytterhoeven , Kyungmin Park , Krzysztof Kozlowski Subject: [rtc-linux] [PATCH 4/5] mfd: sec: Add PM ops and make it a wake up source Date: Tue, 26 Nov 2013 14:50:27 +0100 Message-id: <1385473828-31078-5-git-send-email-k.kozlowski@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1385473828-31078-1-git-send-email-k.kozlowski@samsung.com> References: <1385473828-31078-1-git-send-email-k.kozlowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFuphluLIzCtJLcpLzFFi42I5/e/4FV2D5VOCDHYeVrRYcvEqu8WzW3uZ LF6/MLQ42/SG3eL+16OMFpd3zWGzWHvkLrvF/s4ORovT3awWF1d8YXLg8tgz8SSbx51re9g8 Dh3uYPSYdzLQo2/LKkaP6fN+Mnl83iQXwB7FZZOSmpNZllqkb5fAldG7egdjwRbxitnLZ7I0 MP4U6mLk5JAQMJG4dvwlK4QtJnHh3nq2LkYuDiGBpYwSvb9/sEA4fUwSvz/dZgOpYhMwlti8 fAlYlYjAVUaJiUsWs4M4zAK7GCXe/tzFCFIlLOAm8fXTbKAEBweLgKrElU/GIGFeAXeJF9vO soKEJQQUJOZMsgEJcwp4SMzsWcYCYgsBlZw7uItpAiPvAkaGVYyiqaXJBcVJ6blGesWJucWl eel6yfm5mxghIfh1B+PSY1aHGAU4GJV4eCU6JwcJsSaWFVfmHmKU4GBWEuGNnT4lSIg3JbGy KrUoP76oNCe1+BAjEwenVAOj0abCsvPPPjdpn2E22D7XWPmlzkyRKdNNrWLaI+On+vbeXdHM EGD6YdN8K7GVKipTVoiznX9+ra9Ec0Jt2ZG3W9WsXzHOmBj9rHcjg1Z7MONlvRSxgn7XSF/l Pd8PBdpaz9890++VzZnXDpwKjXWqe6YG8e4P2Lqii+eITu3GEyyBh6fotVgpsRRnJBpqMRcV JwIAQ+8w9B8CAAA= X-Original-Sender: k.kozlowski@samsung.com X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: best guess record for domain of k.kozlowski@samsung.com designates 210.118.77.12 as permitted sender) smtp.mail=k.kozlowski@samsung.com Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: X-Google-Group-Id: 712029733259 List-Post: , List-Help: , List-Archive: Sender: rtc-linux@googlegroups.com List-Subscribe: , List-Unsubscribe: , Add PM suspend/resume ops to the sec MFD core driver and make it a wake up source. This allows proper waking from suspend to RAM and also fixes broken interrupts after resuming: [ 42.705703] sec_pmic 7-0066: Failed to read IRQ status: -5 Interrupts stop working after first resume initiated by them (e.g. by RTC Alarm interrupt) because interrupt registers were not cleared properly. When device is woken up from suspend by RTC Alarm, an interrupt occurs before resuming I2C bus controller. The interrupt is handled by regmap_irq_thread which tries to read RTC registers. This read fails (I2C is still suspended) and RTC Alarm interrupt is disabled. Disable the S5M8767 interrupts during suspend (disable_irq()) and enable them during resume so the device will be still woken up but the interrupt won't happen before resuming I2C bus. Signed-off-by: Krzysztof Kozlowski Signed-off-by: Kyungmin Park --- drivers/mfd/sec-core.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c index a1a413a..8c86da4 100644 --- a/drivers/mfd/sec-core.c +++ b/drivers/mfd/sec-core.c @@ -323,6 +323,8 @@ static int sec_pmic_probe(struct i2c_client *i2c, if (ret) goto err; + device_init_wakeup(sec_pmic->dev, sec_pmic->wakeup); + return ret; err: @@ -341,6 +343,43 @@ static int sec_pmic_remove(struct i2c_client *i2c) return 0; } +static int sec_pmic_suspend(struct device *dev) +{ + struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); + struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c); + + if (device_may_wakeup(dev)) { + enable_irq_wake(sec_pmic->irq); + /* + * PMIC IRQ must be disabled during suspend for RTC alarm + * to work properly. + * When device is woken up from suspend by RTC Alarm, an + * interrupt occurs before resuming I2C bus controller. + * The interrupt is handled by regmap_irq_thread which tries + * to read RTC registers. This read fails (I2C is still + * suspended) and RTC Alarm interrupt is disabled. + */ + disable_irq(sec_pmic->irq); + } + + return 0; +} + +static int sec_pmic_resume(struct device *dev) +{ + struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); + struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c); + + if (device_may_wakeup(dev)) { + disable_irq_wake(sec_pmic->irq); + enable_irq(sec_pmic->irq); + } + + return 0; +} + +static SIMPLE_DEV_PM_OPS(sec_pmic_pm_ops, sec_pmic_suspend, sec_pmic_resume); + static const struct i2c_device_id sec_pmic_id[] = { { "sec_pmic", 0 }, { } @@ -351,6 +390,7 @@ static struct i2c_driver sec_pmic_driver = { .driver = { .name = "sec_pmic", .owner = THIS_MODULE, + .pm = &sec_pmic_pm_ops, .of_match_table = of_match_ptr(sec_dt_match), }, .probe = sec_pmic_probe,