rtc: imxdi: when locked, do not fail silently
authorJuergen Borleis <jbe@pengutronix.de>
Mon, 27 Apr 2015 13:59:51 +0000 (15:59 +0200)
committerAlexandre Belloni <alexandre.belloni@free-electrons.com>
Fri, 19 Jun 2015 18:03:21 +0000 (20:03 +0200)
If the DryICE unit is locked it is impossible to set the time. Provide an
error message for this case.

Signed-off-by: Juergen Borleis <jbe@pengutronix.de>
Signed-off-by: Robert Schwebel <rsc@pengutronix.de>
[rsc: got NDA clearance from Freescale]
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
drivers/rtc/rtc-imxdi.c

index a08da4a353dbdb1d774630cc6d1d333abac834c4..7bffd7f0e30685d38d52aed7fc03e4983c4da9f9 100644 (file)
@@ -566,14 +566,35 @@ static int dryice_rtc_read_time(struct device *dev, struct rtc_time *tm)
 static int dryice_rtc_set_mmss(struct device *dev, unsigned long secs)
 {
        struct imxdi_dev *imxdi = dev_get_drvdata(dev);
+       u32 dcr, dsr;
        int rc;
 
+       dcr = readl(imxdi->ioaddr + DCR);
+       dsr = readl(imxdi->ioaddr + DSR);
+
+       if (!(dcr & DCR_TCE) || (dsr & DSR_SVF)) {
+               if (dcr & DCR_TCHL) {
+                       /* we are even more out of luck */
+                       di_what_is_to_be_done(imxdi, "battery");
+                       return -EPERM;
+               }
+               if ((dcr & DCR_TCSL) || (dsr & DSR_SVF)) {
+                       /* we are out of luck for now */
+                       di_what_is_to_be_done(imxdi, "main");
+                       return -EPERM;
+               }
+       }
+
        /* zero the fractional part first */
        rc = di_write_wait(imxdi, 0, DTCLR);
-       if (rc == 0)
-               rc = di_write_wait(imxdi, secs, DTCMR);
+       if (rc != 0)
+               return rc;
 
-       return rc;
+       rc = di_write_wait(imxdi, secs, DTCMR);
+       if (rc != 0)
+               return rc;
+
+       return di_write_wait(imxdi, readl(imxdi->ioaddr + DCR) | DCR_TCE, DCR);
 }
 
 static int dryice_rtc_alarm_irq_enable(struct device *dev,