From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932786AbcFUHZO (ORCPT ); Tue, 21 Jun 2016 03:25:14 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:35580 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754447AbcFUHYY (ORCPT ); Tue, 21 Jun 2016 03:24:24 -0400 From: Andrey Smirnov To: rtc-linux@googlegroups.com Cc: Andrey Smirnov , Alessandro Zummo , Alexandre Belloni , linux-kernel@vger.kernel.org, cphealy@gmail.com Subject: [PATCH v2 14/17] RTC: ds1307: Move last bits of sanity checking out of chip_configure Date: Tue, 21 Jun 2016 00:22:47 -0700 Message-Id: <1466493770-11895-13-git-send-email-andrew.smirnov@gmail.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1466493770-11895-1-git-send-email-andrew.smirnov@gmail.com> References: <1466493770-11895-1-git-send-email-andrew.smirnov@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Signed-off-by: Andrey Smirnov --- drivers/rtc/rtc-ds1307.c | 106 ++++++++++++++++++++++++++--------------------- 1 file changed, 59 insertions(+), 47 deletions(-) diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 2169e5b..45b2adb 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -1344,66 +1344,23 @@ static int ds1307_chip_configure(const struct ds1307 *ds1307) DS1337_REG_CONTROL, regs[0]); - /* oscillator fault? clear flag, and warn */ - if (regs[1] & DS1337_BIT_OSF) { - i2c_smbus_write_byte_data(client, - DS1337_REG_STATUS, - regs[1] & ~DS1337_BIT_OSF); - dev_warn(&ds1307->client->dev, "SET TIME!\n"); - } break; } case rx_8025: - tmp = i2c_smbus_read_i2c_block_data(client, - RX8025_REG_CTRL1, - 2, regs); - if (tmp != 2) { + tmp = i2c_smbus_read_byte_data(client, RX8025_REG_CTRL1); + if (tmp < 0) { dev_dbg(&client->dev, "read error %d\n", tmp); return -EIO; } - /* oscillator off? turn it on, so clock can tick. */ - if (!(regs[1] & RX8025_BIT_XST)) { - regs[1] |= RX8025_BIT_XST; - i2c_smbus_write_byte_data(client, - RX8025_REG_CTRL2, - regs[1]); - dev_warn(&client->dev, - "oscillator stop detected - SET TIME!\n"); - } - - if (regs[1] & RX8025_BIT_PON) { - regs[1] &= ~RX8025_BIT_PON; - i2c_smbus_write_byte_data(client, - RX8025_REG_CTRL2, - regs[1]); - dev_warn(&client->dev, "power-on detected\n"); - } - - if (regs[1] & RX8025_BIT_VDET) { - regs[1] &= ~RX8025_BIT_VDET; - i2c_smbus_write_byte_data(client, - RX8025_REG_CTRL2, - regs[1]); - dev_warn(&client->dev, "voltage drop detected\n"); - } - /* make sure we are running in 24hour mode */ - if (!(regs[0] & RX8025_BIT_2412)) { + if (!(tmp & RX8025_BIT_2412)) { u8 hour; /* switch to 24 hour mode */ i2c_smbus_write_byte_data(client, RX8025_REG_CTRL1, - regs[0] | RX8025_BIT_2412); - - tmp = i2c_smbus_read_i2c_block_data(client, - RX8025_REG_CTRL1, - 2, regs); - if (tmp != 2) { - dev_dbg(&client->dev, "read error %d\n", tmp); - return -EIO; - } + tmp | RX8025_BIT_2412); /* correct hour */ hour = bcd2bin(regs[DS1307_REG_HOUR]); @@ -1486,6 +1443,27 @@ static int ds1307_chip_sanity_check(const struct ds1307 *ds1307) continue; } break; + + case ds_1337: + case ds_1339: + case ds_3231: + case ds_1341: + tmp = i2c_smbus_read_byte_data(client, + DS1337_REG_STATUS); + if (tmp < 0) { + dev_dbg(&client->dev, "read error %d\n", tmp); + return -EIO; + } + + /* oscillator fault? clear flag, and warn */ + if (tmp & DS1337_BIT_OSF) { + i2c_smbus_write_byte_data(client, + DS1337_REG_STATUS, + regs[1] & ~DS1337_BIT_OSF); + ds1307_report_oscillator_fault(ds1307); + } + return 0; + case ds_1340: /* clock halted? turn it on, so clock can tick. */ if (tmp & DS1340_BIT_nEOSC) { @@ -1530,6 +1508,40 @@ static int ds1307_chip_sanity_check(const struct ds1307 *ds1307) } break; + + case rx_8025: + tmp = i2c_smbus_read_byte_data(client, + RX8025_REG_CTRL2); + if (tmp < 0) { + dev_dbg(&client->dev, "read error %d\n", tmp); + return -EIO; + } + + /* oscillator off? turn it on, so clock can tick. */ + if (!(tmp & RX8025_BIT_XST)) { + tmp |= RX8025_BIT_XST; + i2c_smbus_write_byte_data(client, + RX8025_REG_CTRL2, + tmp); + ds1307_report_clock_halt(ds1307); + } + + if (tmp & RX8025_BIT_PON) { + tmp &= ~RX8025_BIT_PON; + i2c_smbus_write_byte_data(client, + RX8025_REG_CTRL2, + tmp); + dev_warn(&client->dev, "power-on detected\n"); + } + + if (tmp & RX8025_BIT_VDET) { + tmp &= ~RX8025_BIT_VDET; + i2c_smbus_write_byte_data(client, + RX8025_REG_CTRL2, + tmp); + dev_warn(&client->dev, "voltage drop detected\n"); + } + break; default: break; } -- 2.5.5