|
@@ -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,
|