From: Corey Minyard <cminyard@mvista.com>
To: Alexander Bigga <ab@mycable.de>, alexandre.belloni@bootlin.com
Cc: linux-rtc@vger.kernel.org, linux-kernel@vger.kernel.org,
nmydeen@mvista.com
Subject: Re: [PATCH] rtc-m41t62: kickstart ocillator upon failure
Date: Tue, 4 Feb 2025 05:54:49 -0600 [thread overview]
Message-ID: <Z6IACQ8fx-EuooD9@mail.minyard.net> (raw)
In-Reply-To: <20250116062641.366679-1-nmydeen@mvista.com>
[-- Attachment #1: Type: text/plain, Size: 5064 bytes --]
Adding Alexander
On Thu, Jan 16, 2025 at 11:56:41AM +0530, nmydeen@mvista.com wrote:
> From: "A. Niyas Ahamed Mydeen" <nmydeen@mvista.com>
>
> The ocillator on the m41t62 (and other chips of this type) needs
> a kickstart upon a failure; the RTC read routine will notice the
> oscillator failure and fail reads. This is added in the RTC write
> routine; this allows the system to know that the time in the RTC
> is accurate. This is following the procedure described in section
> 3.11 of "https://www.st.com/resource/en/datasheet/m41t62.pdf"
Any comments on this? I just saw that Alexander wasn't on the email,
not sure if they are still involved.
-corey
>
> Signed-off-by: A. Niyas Ahamed Mydeen <nmydeen@mvista.com>
> Reviewed-by: Corey Minyard <cminyard@mvista.com>
> ---
> drivers/rtc/rtc-m41t80.c | 70 ++++++++++++++++++++++++++++------------
> 1 file changed, 49 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c
> index 1f58ae8b151e..77c21c91bae3 100644
> --- a/drivers/rtc/rtc-m41t80.c
> +++ b/drivers/rtc/rtc-m41t80.c
> @@ -22,6 +22,7 @@
> #include <linux/slab.h>
> #include <linux/mutex.h>
> #include <linux/string.h>
> +#include <linux/delay.h>
> #ifdef CONFIG_RTC_DRV_M41T80_WDT
> #include <linux/fs.h>
> #include <linux/ioctl.h>
> @@ -204,7 +205,7 @@ static int m41t80_rtc_read_time(struct device *dev, struct rtc_time *tm)
> return flags;
>
> if (flags & M41T80_FLAGS_OF) {
> - dev_err(&client->dev, "Oscillator failure, data is invalid.\n");
> + dev_err(&client->dev, "Oscillator failure, time may not be accurate, write time to RTC to fix it.\n");
> return -EINVAL;
> }
>
> @@ -227,21 +228,60 @@ static int m41t80_rtc_read_time(struct device *dev, struct rtc_time *tm)
> return 0;
> }
>
> -static int m41t80_rtc_set_time(struct device *dev, struct rtc_time *tm)
> +static int m41t80_rtc_set_time(struct device *dev, struct rtc_time *in_tm)
> {
> struct i2c_client *client = to_i2c_client(dev);
> struct m41t80_data *clientdata = i2c_get_clientdata(client);
> + struct rtc_time tm = *in_tm;
> unsigned char buf[8];
> int err, flags;
> + time64_t time = 0;
>
> + flags = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
> + if (flags < 0)
> + return flags;
> + if (flags & M41T80_FLAGS_OF) {
> + /* OF cannot be immediately reset: oscillator has to be restarted. */
> + dev_warn(&client->dev, "OF bit is still set, kickstarting clock.\n");
> + err = i2c_smbus_write_byte_data(client, M41T80_REG_SEC, M41T80_SEC_ST);
> + if (err < 0) {
> + dev_err(&client->dev, "Can't set ST bit\n");
> + return err;
> + }
> + err = i2c_smbus_write_byte_data(client, M41T80_REG_SEC,
> + flags & ~M41T80_SEC_ST);
> + if (err < 0) {
> + dev_err(&client->dev, "Can't clear ST bit\n");
> + return err;
> + }
> + /* oscillator must run for 4sec before we attempt to reset OF bit */
> + msleep(4000);
> + /* Clear the OF bit of Flags Register */
> + err = i2c_smbus_write_byte_data(client, M41T80_REG_FLAGS,
> + flags & ~M41T80_FLAGS_OF);
> + if (err < 0) {
> + dev_err(&client->dev, "Unable to write flags register\n");
> + return err;
> + }
> + flags = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
> + if (flags < 0)
> + return flags;
> + else if (flags & M41T80_FLAGS_OF) {
> + dev_err(&client->dev, "Can't clear the OF bit check battery\n");
> + return err;
> + }
> + /* add 4sec of oscillator stablize time otherwise we are behind 4sec */
> + time = rtc_tm_to_time64(&tm);
> + rtc_time64_to_tm(time+4, &tm);
> + }
> buf[M41T80_REG_SSEC] = 0;
> - buf[M41T80_REG_SEC] = bin2bcd(tm->tm_sec);
> - buf[M41T80_REG_MIN] = bin2bcd(tm->tm_min);
> - buf[M41T80_REG_HOUR] = bin2bcd(tm->tm_hour);
> - buf[M41T80_REG_DAY] = bin2bcd(tm->tm_mday);
> - buf[M41T80_REG_MON] = bin2bcd(tm->tm_mon + 1);
> - buf[M41T80_REG_YEAR] = bin2bcd(tm->tm_year - 100);
> - buf[M41T80_REG_WDAY] = tm->tm_wday;
> + buf[M41T80_REG_SEC] = bin2bcd(tm.tm_sec);
> + buf[M41T80_REG_MIN] = bin2bcd(tm.tm_min);
> + buf[M41T80_REG_HOUR] = bin2bcd(tm.tm_hour);
> + buf[M41T80_REG_DAY] = bin2bcd(tm.tm_mday);
> + buf[M41T80_REG_MON] = bin2bcd(tm.tm_mon + 1);
> + buf[M41T80_REG_YEAR] = bin2bcd(tm.tm_year - 100);
> + buf[M41T80_REG_WDAY] = tm.tm_wday;
>
> /* If the square wave output is controlled in the weekday register */
> if (clientdata->features & M41T80_FEATURE_SQ_ALT) {
> @@ -261,18 +301,6 @@ static int m41t80_rtc_set_time(struct device *dev, struct rtc_time *tm)
> return err;
> }
>
> - /* Clear the OF bit of Flags Register */
> - flags = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
> - if (flags < 0)
> - return flags;
> -
> - err = i2c_smbus_write_byte_data(client, M41T80_REG_FLAGS,
> - flags & ~M41T80_FLAGS_OF);
> - if (err < 0) {
> - dev_err(&client->dev, "Unable to write flags register\n");
> - return err;
> - }
> -
> return err;
> }
>
> --
> 2.34.1
>
[-- Attachment #2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 3365 bytes --]
next prev parent reply other threads:[~2025-02-04 11:54 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-16 6:26 nmydeen
2025-02-04 11:54 ` Corey Minyard [this message]
2025-04-01 9:04 ` Alexandre Belloni
2025-04-01 19:40 ` Niyas Mydeen
2025-04-02 12:05 ` nmydeen
2025-04-02 12:05 ` [PATCH v2] " nmydeen
2025-05-25 22:24 ` Alexandre Belloni
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=Z6IACQ8fx-EuooD9@mail.minyard.net \
--to=cminyard@mvista.com \
--cc=ab@mycable.de \
--cc=alexandre.belloni@bootlin.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rtc@vger.kernel.org \
--cc=nmydeen@mvista.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®