From: Andrey Smirnov <andrew.smirnov@gmail.com>
To: rtc-linux@googlegroups.com
Cc: Andrey Smirnov <andrew.smirnov@gmail.com>,
Alessandro Zummo <a.zummo@towertech.it>,
Alexandre Belloni <alexandre.belloni@free-electrons.com>,
linux-kernel@vger.kernel.org, cphealy@gmail.com
Subject: [PATCH v2 11/17] RTC: ds1307: Convert goto to a loop
Date: Tue, 21 Jun 2016 00:22:44 -0700 [thread overview]
Message-ID: <1466493770-11895-10-git-send-email-andrew.smirnov@gmail.com> (raw)
In-Reply-To: <1466493770-11895-1-git-send-email-andrew.smirnov@gmail.com>
Convert goto to a loop and set a hard upper limit on the number of times
driver would try to make RTC work (as opposed to having an infinite
retry loop).
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
drivers/rtc/rtc-ds1307.c | 151 +++++++++++++++++++++++++----------------------
1 file changed, 82 insertions(+), 69 deletions(-)
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
index 67907f1..cbbe9f0 100644
--- a/drivers/rtc/rtc-ds1307.c
+++ b/drivers/rtc/rtc-ds1307.c
@@ -1424,87 +1424,100 @@ static int ds1307_chip_configure(const struct ds1307 *ds1307)
static int ds1307_chip_sanity_check(const struct ds1307 *ds1307)
{
- int tmp;
+ int tmp, retries;
u8 regs[DS1307_REG_COUNT];
struct i2c_client *client = ds1307->client;
-read_rtc:
- /* read RTC registers */
- tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, regs);
- if (tmp != 8) {
- dev_dbg(&client->dev, "read error %d\n", tmp);
- return -EIO;
- }
-
- /*
- * minimal sanity checking; some chips (like DS1340) don't
- * specify the extra bits as must-be-zero, but there are
- * still a few values that are clearly out-of-range.
- */
- tmp = regs[DS1307_REG_SECS];
- switch (ds1307->type) {
- case ds_1307:
- case m41t00:
- /* clock halted? turn it on, so clock can tick. */
- if (tmp & DS1307_BIT_CH) {
- i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
- dev_warn(&client->dev, "SET TIME!\n");
- goto read_rtc;
- }
- break;
- case ds_1338:
- /* clock halted? turn it on, so clock can tick. */
- if (tmp & DS1307_BIT_CH)
- i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
-
- /* oscillator fault? clear flag, and warn */
- if (regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
- i2c_smbus_write_byte_data(client, DS1307_REG_CONTROL,
- regs[DS1307_REG_CONTROL]
- & ~DS1338_BIT_OSF);
- dev_warn(&client->dev, "SET TIME!\n");
- goto read_rtc;
- }
- break;
- case ds_1340:
- /* clock halted? turn it on, so clock can tick. */
- if (tmp & DS1340_BIT_nEOSC)
- i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
-
- tmp = i2c_smbus_read_byte_data(client, DS1340_REG_FLAG);
- if (tmp < 0) {
+ for (retries = 0; retries < 5; retries++) {
+ /* read RTC registers */
+ tmp = ds1307->read_block_data(ds1307->client,
+ ds1307->offset, 8, regs);
+ if (tmp != 8) {
dev_dbg(&client->dev, "read error %d\n", tmp);
return -EIO;
}
- /* oscillator fault? clear flag, and warn */
- if (tmp & DS1340_BIT_OSF) {
- i2c_smbus_write_byte_data(client, DS1340_REG_FLAG, 0);
- dev_warn(&client->dev, "SET TIME!\n");
- }
- break;
- case mcp794xx:
- /* make sure that the backup battery is enabled */
- if (!(regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
- i2c_smbus_write_byte_data(client, DS1307_REG_WDAY,
- regs[DS1307_REG_WDAY]
- | MCP794XX_BIT_VBATEN);
- }
+ /*
+ * minimal sanity checking; some chips (like DS1340)
+ * don't specify the extra bits as must-be-zero, but
+ * there are still a few values that are clearly
+ * out-of-range.
+ */
+ tmp = regs[DS1307_REG_SECS];
+ switch (ds1307->type) {
+ case ds_1307:
+ case m41t00:
+ /* clock halted? turn it on, so clock can tick. */
+ if (tmp & DS1307_BIT_CH) {
+ i2c_smbus_write_byte_data(client,
+ DS1307_REG_SECS, 0);
+ dev_warn(&client->dev, "SET TIME!\n");
+ continue;
+ }
+ break;
+ case ds_1338:
+ /* clock halted? turn it on, so clock can tick. */
+ if (tmp & DS1307_BIT_CH)
+ i2c_smbus_write_byte_data(client,
+ DS1307_REG_SECS, 0);
+
+ /* oscillator fault? clear flag, and warn */
+ if (regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
+ i2c_smbus_write_byte_data(client,
+ DS1307_REG_CONTROL,
+ regs[DS1307_REG_CONTROL]
+ & ~DS1338_BIT_OSF);
+ dev_warn(&client->dev, "SET TIME!\n");
+ continue;
+ }
+ break;
+ case ds_1340:
+ /* clock halted? turn it on, so clock can tick. */
+ if (tmp & DS1340_BIT_nEOSC)
+ i2c_smbus_write_byte_data(client,
+ DS1307_REG_SECS, 0);
+
+ tmp = i2c_smbus_read_byte_data(client, DS1340_REG_FLAG);
+ if (tmp < 0) {
+ dev_dbg(&client->dev, "read error %d\n", tmp);
+ return -EIO;
+ }
+
+ /* oscillator fault? clear flag, and warn */
+ if (tmp & DS1340_BIT_OSF) {
+ i2c_smbus_write_byte_data(client,
+ DS1340_REG_FLAG, 0);
+ dev_warn(&client->dev, "SET TIME!\n");
+ }
+ return 0;
- /* clock halted? turn it on, so clock can tick. */
- if (!(tmp & MCP794XX_BIT_ST)) {
- i2c_smbus_write_byte_data(client, DS1307_REG_SECS,
- MCP794XX_BIT_ST);
- dev_warn(&client->dev, "SET TIME!\n");
- goto read_rtc;
+ case mcp794xx:
+ /* make sure that the backup battery is enabled */
+ if (!(regs[DS1307_REG_WDAY] & MCP794XX_BIT_VBATEN)) {
+ i2c_smbus_write_byte_data(client,
+ DS1307_REG_WDAY,
+ regs[DS1307_REG_WDAY]
+ | MCP794XX_BIT_VBATEN);
+ }
+
+ /* clock halted? turn it on, so clock can tick. */
+ if (!(tmp & MCP794XX_BIT_ST)) {
+ i2c_smbus_write_byte_data(client,
+ DS1307_REG_SECS,
+ MCP794XX_BIT_ST);
+ dev_warn(&client->dev, "SET TIME!\n");
+ continue;
+ }
+
+ break;
+ default:
+ break;
}
- break;
- default:
- break;
+ return 0;
}
- return 0;
+ return -EIO;
}
static int ds1307_probe(struct i2c_client *client,
--
2.5.5
next prev parent reply other threads:[~2016-06-21 7:25 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-21 7:22 [PATCH v2 02/17] RTC: ds1307: Disable square wave and timers as default Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 03/17] RTC: ds1307: Add devicetree bindings for DS1341 Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 04/17] RTC: ds1307: Add DS1341 specific power-saving options Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 05/17] RTC: ds1307: Convert ds1307_can_wakeup_device into a predicate Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 06/17] RTC: ds1307: Convert want_irq " Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 07/17] RTC: ds1307: Move chip configuration into a separate routine Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 08/17] RTC: ds1307: Move chip sanity checking " Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 09/17] RTC: ds1307: Remove register "cache" Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 10/17] RTC: ds1307: Constify struct ds1307 where possible Andrey Smirnov
2016-06-21 7:22 ` Andrey Smirnov [this message]
2016-06-21 7:22 ` [PATCH v2 12/17] RTC: ds1307: Redefine RX8025_REG_* to minimize extra code Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 13/17] RTC: ds1307: Report oscillator problems more intelligently Andrey Smirnov
2016-06-21 21:22 ` Alexandre Belloni
2016-06-21 23:06 ` Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 14/17] RTC: ds1307: Move last bits of sanity checking out of chip_configure Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 15/17] RTC: rtctest: Change alarm IRQ support detection Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 16/17] RTC: rtctest: Change no IRQ detection for RTC_IRQP_READ Andrey Smirnov
2016-06-21 7:22 ` [PATCH v2 17/17] RTC: rtctest: Change no IRQ detection for RTC_IRQP_SET Andrey Smirnov
2016-06-21 21:17 ` [PATCH v2 02/17] RTC: ds1307: Disable square wave and timers as default Alexandre Belloni
2016-06-21 23:43 ` Andrey Smirnov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1466493770-11895-10-git-send-email-andrew.smirnov@gmail.com \
--to=andrew.smirnov@gmail.com \
--cc=a.zummo@towertech.it \
--cc=alexandre.belloni@free-electrons.com \
--cc=cphealy@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rtc-linux@googlegroups.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®