From patchwork Fri Nov 14 23:06:53 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Arnaud Ebalard X-Patchwork-Id: 5310121 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 95CEBC11AC for ; Fri, 14 Nov 2014 23:07:34 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id AFA9120125 for ; Fri, 14 Nov 2014 23:07:33 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D19B520123 for ; Fri, 14 Nov 2014 23:07:32 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1XpPvn-0005iP-QF; Fri, 14 Nov 2014 23:05:31 +0000 Received: from 36.223.133.77.rev.sfr.net ([77.133.223.36] helo=smtp.natisbad.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1XpPvb-0004ur-HK for linux-arm-kernel@lists.infradead.org; Fri, 14 Nov 2014 23:05:20 +0000 Received: by smtp.natisbad.org (Postfix, from userid 109) id A59E61700690; Sat, 15 Nov 2014 00:05:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=natisbad.org; s=mail; t=1416006300; bh=RNYytb6SSoW4ERq82lUDLksKZ6u82X2CK3RSCPd67j8=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From; b=AgoQeRKxuLQzJ+QuYZfFg0lUsNZ6UPYt4yg0UcSKSF1X9p809wIhiTh5VU19ib35b 2Ev9IgTqp5XaLMgBMYLUeS9qNGCGDBx4u6l3D7w1oyiyQyjelhMPxYIEnOTuQ7F+AR y1SRrNLzBlIRIAZM7BMdrxsxMTxa1Qa8H1fuRzYQ= X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_LOW, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from small (localhost [IPv6:::1]) by smtp.natisbad.org (Postfix) with ESMTP id 4B3571700529; Sat, 15 Nov 2014 00:03:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=natisbad.org; s=mail; t=1416006215; bh=RNYytb6SSoW4ERq82lUDLksKZ6u82X2CK3RSCPd67j8=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From; b=geNvr7Fw+raQPR+Ys5veTfk99hLYIF5fTLsKiYOvsCAJu4dHg0hluEgTuflmnj4DM oA7Os+ZEprwf3zdITrNdYSq0q1wSf6Ykft4m3mN24jaBh1QhqCXoq3S7lWy5ojiZIq m68PyNxo8eDRP8DsQeeUmqCM3UMsOVtUVCWQ7KMY= X-Hashcash: 1:20:141114:mark.rutland@arm.com::nXf/PMrsS9Qkwjm4:000000000000000000000000000000000000000000Emb X-Hashcash: 1:20:141114:a.zummo@towertech.it::zSfX7TzaqddMt9jX:0000000000000000000000000000000000000000002Ee X-Hashcash: 1:20:141114:peter.huewe@infineon.com::W6JQ2zByjM7dSBrC:0000000000000000000000000000000000000T1zh X-Hashcash: 1:20:141114:linus.walleij@linaro.org::A5iyQW4LoM0eLLS+:00000000000000000000000000000000000006RwR X-Hashcash: 1:20:141114:treding@nvidia.com::e5jnYAZ9PKJh9CoE:00000000000000000000000000000000000000000003+qU X-Hashcash: 1:20:141114:broonie@kernel.org::HNGyN1WBkNSuW7nd:00000000000000000000000000000000000000000005CJ3 X-Hashcash: 1:20:141114:rob.herring@calxeda.com::WZ59PrVD5Ty48S6M:000000000000000000000000000000000000002EhS X-Hashcash: 1:20:141114:pawel.moll@arm.com::tOKUdmzAW0jfpzXH:000000000000000000000000000000000000000000061Wd X-Hashcash: 1:20:141114:swarren@wwwdotorg.org::63iIyur4I7BkoFY/:00000000000000000000000000000000000000006VCH X-Hashcash: 1:20:141114:ijc+devicetree@hellion.org.uk::aSDdi1FlIcETlDmv:000000000000000000000000000000001NVN X-Hashcash: 1:20:141114:grant.likely@linaro.org::M0gOgoea1r2BPf+D:000000000000000000000000000000000000001J5o X-Hashcash: 1:20:141114:devicetree@vger.kernel.org::lJ772KtAt8/yx4kV:000000000000000000000000000000000006w8U X-Hashcash: 1:20:141114:linux-doc@vger.kernel.org::eFDw12936PAuS46f:0000000000000000000000000000000000004DS3 X-Hashcash: 1:20:141114:rob@landley.net::eafnheu3+i7YKA4y:0046eD X-Hashcash: 1:20:141114:rtc-linux@googlegroups.com::wJT9PMQXJdVwwSu6:000000000000000000000000000000000004RyB X-Hashcash: 1:20:141114:jason@lakedaemon.net::FTGUSFEbTYp3c3Eo:000000000000000000000000000000000000000000yu5 X-Hashcash: 1:20:141114:linux@roeck-us.net::yW7I9gJuWq6dvjFO:00000000000000000000000000000000000000000004tjJ X-Hashcash: 1:20:141114:jgunthorpe@obsidianresearch.com::97Vmga9y5nU5iOrz:0000000000000000000000000000000t6h X-Hashcash: 1:20:141114:galak@codeaurora.org::H5j9lrdMQ+nq4roD:000000000000000000000000000000000000000008OQp X-Hashcash: 1:20:141114:linux-arm-kernel@lists.infradead.org::wiZJAdne9zzpMG96:00000000000000000000000000wLJ X-Hashcash: 1:20:141114:uwe@kleine-koenig.org::rp7DqFC5k44GVl/b:00000000000000000000000000000000000000002Y0M From: Arnaud Ebalard To: Mark Rutland , Alessandro Zummo , Peter Huewe , Linus Walleij , Thierry Reding , Mark Brown Subject: [PATCHv1 3/6] rtc: rtc-isl12057: add proper handling of oscillator failure bit In-Reply-To: References: Message-Id: <2bf30d76514c212644453be840ee2379c0f97ea8.1416006090.git.arno@natisbad.org> Date: Sat, 15 Nov 2014 00:06:53 +0100 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20141114_150519_941984_0E9F67E4 X-CRM114-Status: GOOD ( 16.80 ) X-Spam-Score: 0.3 (/) Cc: devicetree@vger.kernel.org, rtc-linux@googlegroups.com, Pawel Moll , Ian Campbell , Stephen Warren , linux-doc@vger.kernel.org, Rob Herring , Jason Gunthorpe , Uwe =?utf-8?Q?Kleine-K=C3=B6nig?= , linux-arm-kernel@lists.infradead.org, Rob Landley , Kumar Gala , Grant Likely , Guenter Roeck , Jason Cooper X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP As suggested by Uwe, instead of clearing oscillator failure bit unconditionally at driver load, this patch adds proper handling of the flag. The driver now returns -ENODATA when reading time from the device and oscillator failure bit is set. The flag is now cleared only when the a new time value is pushed to the device. Reported-by: Uwe Kleine-König Signed-off-by: Arnaud Ebalard --- drivers/rtc/rtc-isl12057.c | 47 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/drivers/rtc/rtc-isl12057.c b/drivers/rtc/rtc-isl12057.c index b538fabfcfd3..fe562820a54a 100644 --- a/drivers/rtc/rtc-isl12057.c +++ b/drivers/rtc/rtc-isl12057.c @@ -164,17 +164,32 @@ static int isl12057_rtc_read_time(struct device *dev, struct rtc_time *tm) { struct isl12057_rtc_data *data = dev_get_drvdata(dev); u8 regs[ISL12057_RTC_SEC_LEN]; + unsigned int sr; int ret; mutex_lock(&data->lock); + ret = regmap_read(data->regmap, ISL12057_REG_SR, &sr); + if (ret) { + dev_err(dev, "%s: unable to read oscillator status flag\n", + __func__); + goto out; + } else { + if (sr & ISL12057_REG_SR_OSF) { + ret = -ENODATA; + goto out; + } + } + ret = regmap_bulk_read(data->regmap, ISL12057_REG_RTC_SC, regs, ISL12057_RTC_SEC_LEN); + if (ret) + dev_err(dev, "%s: unable to read RTC time\n", __func__); + +out: mutex_unlock(&data->lock); - if (ret) { - dev_err(dev, "%s: RTC read failed\n", __func__); + if (ret) return ret; - } isl12057_rtc_regs_to_tm(tm, regs); @@ -194,10 +209,22 @@ static int isl12057_rtc_set_time(struct device *dev, struct rtc_time *tm) mutex_lock(&data->lock); ret = regmap_bulk_write(data->regmap, ISL12057_REG_RTC_SC, regs, ISL12057_RTC_SEC_LEN); - mutex_unlock(&data->lock); + if (ret) { + dev_err(dev, "%s: writing RTC time failed\n", __func__); + goto out; + } - if (ret) - dev_err(dev, "%s: RTC write failed\n", __func__); + /* + * Now that RTC time has been updated, let's clear oscillator + * failure flag, if needed. + */ + ret = regmap_update_bits(data->regmap, ISL12057_REG_SR, + ISL12057_REG_SR_OSF, 0); + if (ret < 0) + dev_err(dev, "Unable to clear oscillator failure bit\n"); + +out: + mutex_unlock(&data->lock); return ret; } @@ -219,14 +246,6 @@ static int isl12057_check_rtc_status(struct device *dev, struct regmap *regmap) return ret; } - /* Clear oscillator failure bit if needed */ - ret = regmap_update_bits(regmap, ISL12057_REG_SR, - ISL12057_REG_SR_OSF, 0); - if (ret < 0) { - dev_err(dev, "Unable to clear oscillator failure bit\n"); - return ret; - } - /* Clear alarm bit if needed */ ret = regmap_update_bits(regmap, ISL12057_REG_SR, ISL12057_REG_SR_A1F, 0);