From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932257AbbLGNtf (ORCPT ); Mon, 7 Dec 2015 08:49:35 -0500 Received: from metis.ext.4.pengutronix.de ([92.198.50.35]:41215 "EHLO metis.ext.4.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754253AbbLGNt2 (ORCPT ); Mon, 7 Dec 2015 08:49:28 -0500 From: Juergen Borleis To: rtc-linux@googlegroups.com Cc: Alessandro Zummo , Alexandre Belloni , linux-kernel@vger.kernel.org, kernel@pengutronix.de Subject: [PATCH 1/3] RTC/PCF85063: fix time/date reading (part 1) Date: Mon, 7 Dec 2015 14:49:32 +0100 Message-Id: <1449496174-7813-2-git-send-email-jbe@pengutronix.de> X-Mailer: git-send-email 2.6.2 In-Reply-To: <1449496174-7813-1-git-send-email-jbe@pengutronix.de> References: <1449496174-7813-1-git-send-email-jbe@pengutronix.de> X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::7 X-SA-Exim-Mail-From: jbe@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When reading the seconds register, all time/date registers are frozen until the year register is read. So, read all time/date registers in one turn. Signed-off-by: Juergen Borleis --- drivers/rtc/rtc-pcf85063.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/rtc/rtc-pcf85063.c b/drivers/rtc/rtc-pcf85063.c index 63334cb..75f2866 100644 --- a/drivers/rtc/rtc-pcf85063.c +++ b/drivers/rtc/rtc-pcf85063.c @@ -39,6 +39,38 @@ struct pcf85063 { int voltage_low; /* indicates if a low_voltage was detected */ }; +static int pcf85063_read_time(struct i2c_client *client, u8 *buf, u16 size) +{ + int rc; + u8 clk_ctrl = PCF85063_REG_SC; + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .len = sizeof(clk_ctrl), + .buf = &clk_ctrl, + }, { + .addr = client->addr, + .flags = I2C_M_RD, + .len = size, + .buf = buf + }, + }; + + /* + * while reading the time/date registers are blocked and not updated + * anymore until the access is finished. To not lose a second + * event, the access must be finished within one second. So, read all + * time/date registers in one turn. + */ + rc = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); + if (rc != ARRAY_SIZE(msgs)) { + dev_err(&client->dev, "date/time register read error\n"); + return -EIO; + } + + return 0; +} + /* * In the routines that deal directly with the pcf85063 hardware, we use * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch. -- 2.6.2