From patchwork Thu Dec 3 01:53:04 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julius Werner X-Patchwork-Id: 552026 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-ig0-x23b.google.com (mail-ig0-x23b.google.com [IPv6:2607:f8b0:4001:c05::23b]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 5620C1401DA for ; Thu, 3 Dec 2015 12:53:34 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.b=Sw1BTDhS; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b=LVX2rZ0d; dkim-atps=neutral Received: by igbgg5 with SMTP id gg5sf515079igb.0 for ; Wed, 02 Dec 2015 17:53:32 -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:x-original-sender :x-original-authentication-results:reply-to:content-type:precedence :mailing-list:list-id:x-spam-checked-in-group:list-post:list-help :list-archive:sender:list-subscribe:list-unsubscribe; bh=SQ+PK9X6wJlTOw0la6QYqujJnpyZ9sulw/WIVm0WsXY=; b=Sw1BTDhSfOBdcJPXciR62rUgKHwuclJhrN/eKygmR+xqDNPSo6eh1m9DtEnD8d6zwH JNlDo5DDYXvuhi9JIDAV9ZxP28mIKYWFFuiXviglJmq9W/NwEeWx4Z4SpdgOAAO+fhKk jdwk+Q9o1u02YBpmfaXZqfTq8OuPPucko2RWffJflFZrv346zpPt0rnxWMdjINNNTEsM Q8jMecawfiCY5bbqOlbD8+sP7NU8d7je0PjVplqXymBoDJBlBKnrNBPBxNqidPus7i23 hjR8n/i8aeL8ABzXw6JGXgVcgwFwarvRMTUmR7p08nHV4JzSZE0V5TKGlw3XAZcaNHyl qlgA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:from:to:cc:subject:date:message-id:x-original-sender :x-original-authentication-results:reply-to:content-type:precedence :mailing-list:list-id:x-spam-checked-in-group:list-post:list-help :list-archive:sender:list-subscribe:list-unsubscribe; bh=SQ+PK9X6wJlTOw0la6QYqujJnpyZ9sulw/WIVm0WsXY=; b=LVX2rZ0dJoH71tKxuHbPmBWB9kjTXbgj1VFkIcusCKgW7MphcwPx0YyfdQ61S8q1Uy qeI4BGmzmsLIpdYUUlMpLfMhk5SaireoQbDawbjz6FulQcj88avhFhstTESpJqK8U0gg M7qhBDtVfSnJglGSQgWXj42SGnfIIVWLgIbAk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :x-original-sender:x-original-authentication-results:reply-to :content-type:precedence:mailing-list:list-id :x-spam-checked-in-group:list-post:list-help:list-archive:sender :list-subscribe:list-unsubscribe; bh=SQ+PK9X6wJlTOw0la6QYqujJnpyZ9sulw/WIVm0WsXY=; b=BI4G6XXaG9Urw/o8b65CcZUT5Ed5ato4v43k0hQk0kvGdzSmouRzc/YQRJCXX1G57h 7wlY2qJo8WldkW8PIUAPWXa8/b4dJT5vIiocPcRJkn7cntu07mevHwN0C22GOOljkTvR SCRFULmBVW8V567enXDLLVVqGzzzk33Cm2islaQyvee4O8yErGVGGb1rfZPv5F9XPOr7 WtA/omymAy9k37pGMbHmTjbuP8NN5Wl11mxvx8aJXc2M/gGRK4zu+ueIHN1txZr12Izg BwXASlYmbpfA+zq8Ptz0BKC62O4u+UcII+UIpypdxaVwixP+K6YJaIwz+PiyLblEwBy0 x70A== X-Received: by 10.182.102.198 with SMTP id fq6mr77406obb.19.1449107612881; Wed, 02 Dec 2015 17:53:32 -0800 (PST) MIME-Version: 1.0 X-BeenThere: rtc-linux@googlegroups.com Received: by 10.182.213.33 with SMTP id np1ls561364obc.23.gmail; Wed, 02 Dec 2015 17:53:31 -0800 (PST) X-Received: by 10.182.176.73 with SMTP id cg9mr4677975obc.38.1449107611334; Wed, 02 Dec 2015 17:53:31 -0800 (PST) Received: from mail-pa0-x230.google.com (mail-pa0-x230.google.com. [2607:f8b0:400e:c03::230]) by gmr-mx.google.com with ESMTPS id fg10si943917pad.0.2015.12.02.17.53.31 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Dec 2015 17:53:31 -0800 (PST) Received-SPF: pass (google.com: domain of jwerner@chromium.org designates 2607:f8b0:400e:c03::230 as permitted sender) client-ip=2607:f8b0:400e:c03::230; Received: by mail-pa0-x230.google.com with SMTP id fh17so58388015pab.0 for ; Wed, 02 Dec 2015 17:53:31 -0800 (PST) X-Gm-Message-State: ALoCoQluKQWrfPREjValEl6D2rDLdehxpayu0g4AXWaIPYQOYFSaWSeTJ1HWZSJjgUpmEBmgoRQo X-Received: by 10.66.185.131 with SMTP id fc3mr9368461pac.93.1449107611161; Wed, 02 Dec 2015 17:53:31 -0800 (PST) Received: from jwerner-linux.mtv.corp.google.com ([172.22.64.164]) by smtp.gmail.com with ESMTPSA id jj5sm6837051pac.4.2015.12.02.17.53.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 02 Dec 2015 17:53:30 -0800 (PST) From: Julius Werner To: Andrew Morton Cc: Alessandro Zummo , Doug Anderson , Sonny Rao , Chris Zhong , Heiko Stuebner , linux-kernel@vger.kernel.org, rtc-linux@googlegroups.com, Julius Werner Subject: [rtc-linux] [PATCH] RTC: RK808: Work around hardware bug on November 31st Date: Wed, 2 Dec 2015 17:53:04 -0800 Message-Id: <1449107584-3192-1-git-send-email-jwerner@chromium.org> X-Mailer: git-send-email 2.6.0.rc2.230.g3dd15c0 X-Original-Sender: jwerner@chromium.org X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of jwerner@chromium.org designates 2607:f8b0:400e:c03::230 as permitted sender) smtp.mailfrom=jwerner@chromium.org; dmarc=pass (p=NONE dis=NONE) header.from=chromium.org Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: rtc-linux@googlegroups.com X-Google-Group-Id: 712029733259 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , In Fuzhou, China, the month of November seems to be having 31 days. That's nice and all (I'm sure you can get a lot more done in a year that way), but back here in other parts of the world we are not so lucky. Therefore, if we read that date from the RTC we should correct it to December 1st. This is not a full workaround. Since the RTC actually ticks all the way through that imaginary day, there's no easy way to detect and correct this issue if the device was offline the whole time and allowed it to tick through to December 1st on the Rockchip calendar (which would be December 2nd on the Gregorian one). Those edge cases can only really be solved by regularly syncing to an external time source (e.g. NTP). Signed-off-by: Julius Werner Reviewed-by: Chris Zhong --- drivers/rtc/rtc-rk808.c | 93 ++++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/drivers/rtc/rtc-rk808.c b/drivers/rtc/rtc-rk808.c index 91ca0bc..b605b35 100644 --- a/drivers/rtc/rtc-rk808.c +++ b/drivers/rtc/rtc-rk808.c @@ -56,6 +56,50 @@ struct rk808_rtc { int irq; }; +/* Set current time and date in RTC */ +static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm) +{ + struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev); + struct rk808 *rk808 = rk808_rtc->rk808; + u8 rtc_data[NUM_TIME_REGS]; + int ret; + + rtc_data[0] = bin2bcd(tm->tm_sec); + rtc_data[1] = bin2bcd(tm->tm_min); + rtc_data[2] = bin2bcd(tm->tm_hour); + rtc_data[3] = bin2bcd(tm->tm_mday); + rtc_data[4] = bin2bcd(tm->tm_mon + 1); + rtc_data[5] = bin2bcd(tm->tm_year - 100); + rtc_data[6] = bin2bcd(tm->tm_wday); + dev_dbg(dev, "set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", + 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday, + tm->tm_wday, tm->tm_hour , tm->tm_min, tm->tm_sec); + + /* Stop RTC while updating the RTC registers */ + ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, + BIT_RTC_CTRL_REG_STOP_RTC_M, + BIT_RTC_CTRL_REG_STOP_RTC_M); + if (ret) { + dev_err(dev, "Failed to update RTC control: %d\n", ret); + return ret; + } + + ret = regmap_bulk_write(rk808->regmap, RK808_SECONDS_REG, + rtc_data, NUM_TIME_REGS); + if (ret) { + dev_err(dev, "Failed to bull write rtc_data: %d\n", ret); + return ret; + } + /* Start RTC again */ + ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, + BIT_RTC_CTRL_REG_STOP_RTC_M, 0); + if (ret) { + dev_err(dev, "Failed to update RTC control: %d\n", ret); + return ret; + } + return 0; +} + /* Read current time and date in RTC */ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm) { @@ -105,51 +149,14 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm) 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday, tm->tm_wday, tm->tm_hour , tm->tm_min, tm->tm_sec); - return ret; -} - -/* Set current time and date in RTC */ -static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm) -{ - struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev); - struct rk808 *rk808 = rk808_rtc->rk808; - u8 rtc_data[NUM_TIME_REGS]; - int ret; - - rtc_data[0] = bin2bcd(tm->tm_sec); - rtc_data[1] = bin2bcd(tm->tm_min); - rtc_data[2] = bin2bcd(tm->tm_hour); - rtc_data[3] = bin2bcd(tm->tm_mday); - rtc_data[4] = bin2bcd(tm->tm_mon + 1); - rtc_data[5] = bin2bcd(tm->tm_year - 100); - rtc_data[6] = bin2bcd(tm->tm_wday); - dev_dbg(dev, "set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", - 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday, - tm->tm_wday, tm->tm_hour , tm->tm_min, tm->tm_sec); - - /* Stop RTC while updating the RTC registers */ - ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, - BIT_RTC_CTRL_REG_STOP_RTC_M, - BIT_RTC_CTRL_REG_STOP_RTC_M); - if (ret) { - dev_err(dev, "Failed to update RTC control: %d\n", ret); - return ret; + if (tm->tm_mon == 10 && tm->tm_mday == 31) { + dev_warn(dev, "correcting Nov 31st to Dec 1st (HW bug)\n"); + tm->tm_mon = 11; + tm->tm_mday = 1; + rk808_rtc_set_time(dev, tm); } - ret = regmap_bulk_write(rk808->regmap, RK808_SECONDS_REG, - rtc_data, NUM_TIME_REGS); - if (ret) { - dev_err(dev, "Failed to bull write rtc_data: %d\n", ret); - return ret; - } - /* Start RTC again */ - ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, - BIT_RTC_CTRL_REG_STOP_RTC_M, 0); - if (ret) { - dev_err(dev, "Failed to update RTC control: %d\n", ret); - return ret; - } - return 0; + return ret; } /* Read alarm time and date in RTC */