From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932890AbbLTLfp (ORCPT ); Sun, 20 Dec 2015 06:35:45 -0500 Received: from down.free-electrons.com ([37.187.137.238]:52111 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754319AbbLTLfn (ORCPT ); Sun, 20 Dec 2015 06:35:43 -0500 Date: Sun, 20 Dec 2015 12:35:40 +0100 From: Alexandre Belloni To: Juergen Borleis Cc: rtc-linux@googlegroups.com, Alessandro Zummo , linux-kernel@vger.kernel.org, kernel@pengutronix.de Subject: Re: [PATCH 2/3] RTC/PCF85063: fix time/date reading (part II) Message-ID: <20151220113540.GD3541@piout.net> References: <1449496174-7813-1-git-send-email-jbe@pengutronix.de> <1449496174-7813-3-git-send-email-jbe@pengutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1449496174-7813-3-git-send-email-jbe@pengutronix.de> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On 07/12/2015 at 14:49:33 +0100, Juergen Borleis wrote : > Use the function to read the whole time/date register in one turn and now > check if the RTC signals an invalid time/date (due to a battery power loss > for example). In this case ignore the time/date until it is really set > again. > > Signed-off-by: Juergen Borleis > --- > drivers/rtc/rtc-pcf85063.c | 45 +++++++++++++++++++-------------------------- > 1 file changed, 19 insertions(+), 26 deletions(-) > > diff --git a/drivers/rtc/rtc-pcf85063.c b/drivers/rtc/rtc-pcf85063.c > index 75f2866..abed934 100644 > --- a/drivers/rtc/rtc-pcf85063.c > +++ b/drivers/rtc/rtc-pcf85063.c > @@ -22,6 +22,7 @@ > #define PCF85063_REG_CTRL2 0x01 > > #define PCF85063_REG_SC 0x04 /* datetime */ > +#define PCF85063_REG_SC_OS 0x80 > #define PCF85063_REG_MN 0x05 > #define PCF85063_REG_HR 0x06 > #define PCF85063_REG_DM 0x07 > @@ -77,39 +78,31 @@ static int pcf85063_read_time(struct i2c_client *client, u8 *buf, u16 size) > */ > static int pcf85063_get_datetime(struct i2c_client *client, struct rtc_time *tm) > { > + int rc; > struct pcf85063 *pcf85063 = i2c_get_clientdata(client); > - unsigned char buf[13] = { PCF85063_REG_CTRL1 }; > - struct i2c_msg msgs[] = { > - {/* setup read ptr */ > - .addr = client->addr, > - .len = 1, > - .buf = buf > - }, > - {/* read status + date */ > - .addr = client->addr, > - .flags = I2C_M_RD, > - .len = 13, > - .buf = buf > - }, > - }; > + u8 regs[7]; > > - /* read registers */ > - if ((i2c_transfer(client->adapter, msgs, 2)) != 2) { > - dev_err(&client->dev, "%s: read error\n", __func__); > - return -EIO; Isn't that already reading the time and date register in one block? I'd say you are simply reading less registers. Also, maybe you could use i2c_smbus_read_block_data? > + rc = pcf85063_read_time(client, regs, sizeof(regs)); > + if (rc < 0) > + return rc; > + > + /* if the clock has lost its power it makes no sense to use its time */ > + if (regs[0] & PCF85063_REG_SC_OS) { > + dev_warn(&client->dev, "Power loss detected, invalid time\n"); > + return -EINVAL; > } That part is more useful and as I understand it is what you are trying to fix. -- Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com