Re: [PATCH 4/4] rtc: s3c: Fix RTC read on first boot

From: Sam Protsenko
Date: Tue Oct 19 2021 - 12:04:57 EST


On Tue, 19 Oct 2021 at 18:48, Alexandre Belloni
<alexandre.belloni@xxxxxxxxxxx> wrote:
>
> On 19/10/2021 16:17:24+0300, Sam Protsenko wrote:
> > On first RTC boot it has the month register value set to 0.
> > Unconditional subtracting of 1 subsequently in s3c_rtc_gettime() leads
> > to the next error message in kernel log:
> >
> > hctosys: unable to read the hardware clock
> >
> > That happens in s3c_rtc_probe() when trying to register the RTC, which
> > in turn tries to read and validate the time. Initialize RTC date/time
> > registers to valid values in probe function on the first boot to prevent
> > such errors.
> >
>
> No, never ever do that, the time is bogus and it has to stay this way,
> else userspace can't know whether the time on the RTC is the actual wall
> time or just some random value that you have set from the driver.
>

Thought about that, but that error message looked distracting and not
very helpful in understanding what's actually going on. Anyway, can
you please drop this patch from series (and maybe [PATCH 3/4] too) and
apply the rest?

> > Signed-off-by: Sam Protsenko <semen.protsenko@xxxxxxxxxx>
> > ---
> > drivers/rtc/rtc-s3c.c | 26 ++++++++++++++++++++++++++
> > 1 file changed, 26 insertions(+)
> >
> > diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c
> > index 238928e29fbc..c7e763bcf61f 100644
> > --- a/drivers/rtc/rtc-s3c.c
> > +++ b/drivers/rtc/rtc-s3c.c
> > @@ -403,6 +403,28 @@ static int s3c_rtc_remove(struct platform_device *pdev)
> > return 0;
> > }
> >
> > +/* Set RTC with valid date/time values on first boot */
> > +static int s3c_rtc_init_time(struct s3c_rtc *info)
> > +{
> > + struct rtc_time tm;
> > + int ret;
> > +
> > + ret = s3c_rtc_read_time(info, &tm);
> > + if (ret)
> > + return ret;
> > +
> > + /* Only init RTC date/time on first boot */
> > + if (tm.tm_mday > 0)
> > + return 0;
> > +
> > + /* Init date/time: 1 Jan 2000 00:00:00 */
> > + memset(&tm, 0, sizeof(struct rtc_time));
> > + tm.tm_mday = 1; /* tm_mday min valid value is 1 */
> > + tm.tm_mon = 1; /* January in internal representation */
> > +
> > + return s3c_rtc_write_time(info, &tm);
> > +}
> > +
> > static int s3c_rtc_probe(struct platform_device *pdev)
> > {
> > struct s3c_rtc *info = NULL;
> > @@ -471,6 +493,10 @@ static int s3c_rtc_probe(struct platform_device *pdev)
> >
> > device_init_wakeup(&pdev->dev, 1);
> >
> > + ret = s3c_rtc_init_time(info);
> > + if (ret)
> > + goto err_nortc;
> > +
> > info->rtc = devm_rtc_allocate_device(&pdev->dev);
> > if (IS_ERR(info->rtc)) {
> > ret = PTR_ERR(info->rtc);
> > --
> > 2.30.2
> >
>
> --
> Alexandre Belloni, co-owner and COO, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com