diff options
Diffstat (limited to 'drivers/rtc/rtc-r9701.c')
| -rw-r--r-- | drivers/rtc/rtc-r9701.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/drivers/rtc/rtc-r9701.c b/drivers/rtc/rtc-r9701.c index 7f8e6c24793..feeedbd8200 100644 --- a/drivers/rtc/rtc-r9701.c +++ b/drivers/rtc/rtc-r9701.c @@ -119,9 +119,10 @@ static const struct rtc_class_ops r9701_rtc_ops = { .set_time = r9701_set_datetime, }; -static int __devinit r9701_probe(struct spi_device *spi) +static int r9701_probe(struct spi_device *spi) { struct rtc_device *rtc; + struct rtc_time dt; unsigned char tmp; int res; @@ -132,21 +133,39 @@ static int __devinit r9701_probe(struct spi_device *spi) return -ENODEV; } - rtc = rtc_device_register("r9701", - &spi->dev, &r9701_rtc_ops, THIS_MODULE); + /* + * The device seems to be present. Now check if the registers + * contain invalid values. If so, try to write a default date: + * 2000/1/1 00:00:00 + */ + if (r9701_get_datetime(&spi->dev, &dt)) { + dev_info(&spi->dev, "trying to repair invalid date/time\n"); + dt.tm_sec = 0; + dt.tm_min = 0; + dt.tm_hour = 0; + dt.tm_mday = 1; + dt.tm_mon = 0; + dt.tm_year = 100; + + if (r9701_set_datetime(&spi->dev, &dt) || + r9701_get_datetime(&spi->dev, &dt)) { + dev_err(&spi->dev, "cannot repair RTC register\n"); + return -ENODEV; + } + } + + rtc = devm_rtc_device_register(&spi->dev, "r9701", + &r9701_rtc_ops, THIS_MODULE); if (IS_ERR(rtc)) return PTR_ERR(rtc); - dev_set_drvdata(&spi->dev, rtc); + spi_set_drvdata(spi, rtc); return 0; } -static int __devexit r9701_remove(struct spi_device *spi) +static int r9701_remove(struct spi_device *spi) { - struct rtc_device *rtc = dev_get_drvdata(&spi->dev); - - rtc_device_unregister(rtc); return 0; } @@ -156,7 +175,7 @@ static struct spi_driver r9701_driver = { .owner = THIS_MODULE, }, .probe = r9701_probe, - .remove = __devexit_p(r9701_remove), + .remove = r9701_remove, }; module_spi_driver(r9701_driver); |
