]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/rtc/rtc-rs5c348.c
Merge tag 'xtensa-20181115' of git://github.com/jcmvbkbc/linux-xtensa
[linux.git] / drivers / rtc / rtc-rs5c348.c
index f2de8b17e7e36541dcf52653d37188eb4cec9de2..6582be707bd0f73609c83038afcd92fbc45f5441 100644 (file)
@@ -66,6 +66,17 @@ rs5c348_rtc_set_time(struct device *dev, struct rtc_time *tm)
        u8 txbuf[5+7], *txp;
        int ret;
 
+       ret = spi_w8r8(spi, RS5C348_CMD_R(RS5C348_REG_CTL2));
+       if (ret < 0)
+               return ret;
+       if (ret & RS5C348_BIT_XSTP) {
+               txbuf[0] = RS5C348_CMD_W(RS5C348_REG_CTL2);
+               txbuf[1] = 0;
+               ret = spi_write_then_read(spi, txbuf, 2, NULL, 0);
+               if (ret < 0)
+                       return ret;
+       }
+
        /* Transfer 5 bytes before writing SEC.  This gives 31us for carry. */
        txp = txbuf;
        txbuf[0] = RS5C348_CMD_R(RS5C348_REG_CTL2); /* cmd, ctl2 */
@@ -102,6 +113,16 @@ rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm)
        u8 txbuf[5], rxbuf[7];
        int ret;
 
+       ret = spi_w8r8(spi, RS5C348_CMD_R(RS5C348_REG_CTL2));
+       if (ret < 0)
+               return ret;
+       if (ret & RS5C348_BIT_VDET)
+               dev_warn(&spi->dev, "voltage-low detected.\n");
+       if (ret & RS5C348_BIT_XSTP) {
+               dev_warn(&spi->dev, "oscillator-stop detected.\n");
+               return -EINVAL;
+       }
+
        /* Transfer 5 byte befores reading SEC.  This gives 31us for carry. */
        txbuf[0] = RS5C348_CMD_R(RS5C348_REG_CTL2); /* cmd, ctl2 */
        txbuf[1] = 0;   /* dummy */
@@ -143,8 +164,6 @@ static const struct rtc_class_ops rs5c348_rtc_ops = {
        .set_time       = rs5c348_rtc_set_time,
 };
 
-static struct spi_driver rs5c348_driver;
-
 static int rs5c348_probe(struct spi_device *spi)
 {
        int ret;
@@ -161,53 +180,27 @@ static int rs5c348_probe(struct spi_device *spi)
        ret = spi_w8r8(spi, RS5C348_CMD_R(RS5C348_REG_SECS));
        if (ret < 0 || (ret & 0x80)) {
                dev_err(&spi->dev, "not found.\n");
-               goto kfree_exit;
+               return ret;
        }
 
        dev_info(&spi->dev, "spiclk %u KHz.\n",
                 (spi->max_speed_hz + 500) / 1000);
 
-       /* turn RTC on if it was not on */
-       ret = spi_w8r8(spi, RS5C348_CMD_R(RS5C348_REG_CTL2));
-       if (ret < 0)
-               goto kfree_exit;
-       if (ret & (RS5C348_BIT_XSTP | RS5C348_BIT_VDET)) {
-               u8 buf[2];
-               struct rtc_time tm;
-               if (ret & RS5C348_BIT_VDET)
-                       dev_warn(&spi->dev, "voltage-low detected.\n");
-               if (ret & RS5C348_BIT_XSTP)
-                       dev_warn(&spi->dev, "oscillator-stop detected.\n");
-               rtc_time_to_tm(0, &tm); /* 1970/1/1 */
-               ret = rs5c348_rtc_set_time(&spi->dev, &tm);
-               if (ret < 0)
-                       goto kfree_exit;
-               buf[0] = RS5C348_CMD_W(RS5C348_REG_CTL2);
-               buf[1] = 0;
-               ret = spi_write_then_read(spi, buf, sizeof(buf), NULL, 0);
-               if (ret < 0)
-                       goto kfree_exit;
-       }
-
        ret = spi_w8r8(spi, RS5C348_CMD_R(RS5C348_REG_CTL1));
        if (ret < 0)
-               goto kfree_exit;
+               return ret;
        if (ret & RS5C348_BIT_24H)
                pdata->rtc_24h = 1;
 
-       rtc = devm_rtc_device_register(&spi->dev, rs5c348_driver.driver.name,
-                                 &rs5c348_rtc_ops, THIS_MODULE);
-
-       if (IS_ERR(rtc)) {
-               ret = PTR_ERR(rtc);
-               goto kfree_exit;
-       }
+       rtc = devm_rtc_allocate_device(&spi->dev);
+       if (IS_ERR(rtc))
+               return PTR_ERR(rtc);
 
        pdata->rtc = rtc;
 
-       return 0;
- kfree_exit:
-       return ret;
+       rtc->ops = &rs5c348_rtc_ops;
+
+       return rtc_register_device(rtc);
 }
 
 static struct spi_driver rs5c348_driver = {