]> Git Repo - J-u-boot.git/blobdiff - drivers/rtc/ds1307.c
Merge patch series "mtd: spi-nor: Add support for S25FS-S family"
[J-u-boot.git] / drivers / rtc / ds1307.c
index 3be97c9d933fcc67308ccda07cb4d3923942103d..049210991014ee9dfdf59bfce09fd5a0d0036a2b 100644 (file)
@@ -13,7 +13,7 @@
  * based on ds1337.c
  */
 
-#include <common.h>
+#include <config.h>
 #include <command.h>
 #include <dm.h>
 #include <log.h>
@@ -41,6 +41,12 @@ enum ds_type {
 #define RTC_YR_REG_ADDR                0x06
 #define RTC_CTL_REG_ADDR       0x07
 
+#define DS1337_CTL_REG_ADDR    0x0e
+#define DS1337_STAT_REG_ADDR   0x0f
+#define DS1340_STAT_REG_ADDR   0x09
+
+#define RTC_STAT_BIT_OSF       0x80
+
 #define RTC_SEC_BIT_CH         0x80    /* Clock Halt (in Register 0)   */
 
 /* DS1307-specific bits */
@@ -74,8 +80,8 @@ enum ds_type {
 #endif
 /*---------------------------------------------------------------------*/
 
-#ifndef CONFIG_SYS_I2C_RTC_ADDR
-# define CONFIG_SYS_I2C_RTC_ADDR       0x68
+#ifndef CFG_SYS_I2C_RTC_ADDR
+# define CFG_SYS_I2C_RTC_ADDR  0x68
 #endif
 
 #if defined(CONFIG_RTC_DS1307) && (CONFIG_SYS_I2C_SPEED > 100000)
@@ -133,7 +139,6 @@ read_rtc:
        }
 #endif
 
-
        tmp->tm_sec  = bcd2bin (sec & 0x7F);
        tmp->tm_min  = bcd2bin (min & 0x7F);
        tmp->tm_hour = bcd2bin (hour & 0x3F);
@@ -151,7 +156,6 @@ read_rtc:
        return rel;
 }
 
-
 /*
  * Set the RTC
  */
@@ -184,7 +188,6 @@ int rtc_set (struct rtc_time *tmp)
        return 0;
 }
 
-
 /*
  * Reset the RTC. We setting the date back to 1970-01-01.
  * We also enable the oscillator output on the SQW/OUT pin and program
@@ -198,7 +201,6 @@ void rtc_reset (void)
        rtc_write (RTC_CTL_REG_ADDR, RTC_CTL_BIT_SQWE | RTC_CTL_BIT_RS1 | RTC_CTL_BIT_RS0);
 }
 
-
 /*
  * Helper functions
  */
@@ -206,13 +208,12 @@ void rtc_reset (void)
 static
 uchar rtc_read (uchar reg)
 {
-       return (i2c_reg_read (CONFIG_SYS_I2C_RTC_ADDR, reg));
+       return (i2c_reg_read (CFG_SYS_I2C_RTC_ADDR, reg));
 }
 
-
 static void rtc_write (uchar reg, uchar val)
 {
-       i2c_reg_write (CONFIG_SYS_I2C_RTC_ADDR, reg, val);
+       i2c_reg_write (CFG_SYS_I2C_RTC_ADDR, reg, val);
 }
 
 #endif /* !CONFIG_DM_RTC */
@@ -248,6 +249,11 @@ static int ds1307_rtc_set(struct udevice *dev, const struct rtc_time *tm)
        if (ret < 0)
                return ret;
 
+       if (type == ds_1337) {
+               /* Ensure oscillator is enabled */
+               dm_i2c_reg_write(dev, DS1337_CTL_REG_ADDR, 0);
+       }
+
        return 0;
 }
 
@@ -257,62 +263,19 @@ static int ds1307_rtc_get(struct udevice *dev, struct rtc_time *tm)
        uchar buf[7];
        enum ds_type type = dev_get_driver_data(dev);
 
-read_rtc:
        ret = dm_i2c_read(dev, 0, buf, sizeof(buf));
        if (ret < 0)
                return ret;
 
-       if (type == ds_1307) {
-               if (buf[RTC_SEC_REG_ADDR] & RTC_SEC_BIT_CH) {
-                       printf("### Warning: RTC oscillator has stopped\n");
-                       /* clear the CH flag */
-                       buf[RTC_SEC_REG_ADDR] &= ~RTC_SEC_BIT_CH;
-                       dm_i2c_reg_write(dev, RTC_SEC_REG_ADDR,
-                                        buf[RTC_SEC_REG_ADDR]);
-                       return -1;
-               }
-       } else if (type == ds_1337) {
-               if (buf[RTC_CTL_REG_ADDR] & DS1337_CTL_BIT_EOSC) {
-                       printf("### Warning: RTC oscillator has stopped\n");
-                       /* clear the not oscillator enable (~EOSC) flag */
-                       buf[RTC_CTL_REG_ADDR] &= ~DS1337_CTL_BIT_EOSC;
-                       dm_i2c_reg_write(dev, RTC_CTL_REG_ADDR,
-                                        buf[RTC_CTL_REG_ADDR]);
-                       return -1;
-               }
-       } else if (type == ds_1340) {
-               if (buf[RTC_SEC_REG_ADDR] & DS1340_SEC_BIT_EOSC) {
-                       printf("### Warning: RTC oscillator has stopped\n");
-                       /* clear the not oscillator enable (~EOSC) flag */
-                       buf[RTC_SEC_REG_ADDR] &= ~DS1340_SEC_BIT_EOSC;
-                       dm_i2c_reg_write(dev, RTC_SEC_REG_ADDR,
-                                        buf[RTC_SEC_REG_ADDR]);
-                       return -1;
-               }
-       } else if (type == m41t11) {
-               /* clock halted?  turn it on, so clock can tick. */
-               if (buf[RTC_SEC_REG_ADDR] & RTC_SEC_BIT_CH) {
-                       buf[RTC_SEC_REG_ADDR] &= ~RTC_SEC_BIT_CH;
-                       dm_i2c_reg_write(dev, RTC_SEC_REG_ADDR,
-                                        MCP7941X_BIT_ST);
-                       dm_i2c_reg_write(dev, RTC_SEC_REG_ADDR,
-                                        buf[RTC_SEC_REG_ADDR]);
-                       goto read_rtc;
-               }
-       } else if (type == mcp794xx) {
-               /* make sure that the backup battery is enabled */
-               if (!(buf[RTC_DAY_REG_ADDR] & MCP7941X_BIT_VBATEN)) {
-                       dm_i2c_reg_write(dev, RTC_DAY_REG_ADDR,
-                                        buf[RTC_DAY_REG_ADDR] |
-                                        MCP7941X_BIT_VBATEN);
-               }
+       if (type == ds_1337 || type == ds_1340) {
+               uint reg = (type == ds_1337) ? DS1337_STAT_REG_ADDR :
+                                              DS1340_STAT_REG_ADDR;
+               int status = dm_i2c_reg_read(dev, reg);
 
-               /* clock halted?  turn it on, so clock can tick. */
-               if (!(buf[RTC_SEC_REG_ADDR] & MCP7941X_BIT_ST)) {
-                       dm_i2c_reg_write(dev, RTC_SEC_REG_ADDR,
-                                        MCP7941X_BIT_ST);
-                       printf("Started RTC\n");
-                       goto read_rtc;
+               if (status >= 0 && (status & RTC_STAT_BIT_OSF)) {
+                       printf("### Warning: RTC oscillator has stopped\n");
+                       /* clear the OSF flag */
+                       dm_i2c_reg_write(dev, reg, status & ~RTC_STAT_BIT_OSF);
                }
        }
 
@@ -361,7 +324,7 @@ static int ds1307_rtc_reset(struct udevice *dev)
                /* Write control register in order to enable oscillator output
                 * (not EOSC) and set a default rate of 32.768kHz (RS2|RS1).
                 */
-               ret = dm_i2c_reg_write(dev, RTC_CTL_REG_ADDR,
+               ret = dm_i2c_reg_write(dev, DS1337_CTL_REG_ADDR,
                                       DS1337_CTL_BIT_RS2 | DS1337_CTL_BIT_RS1);
        } else if (type == ds_1340 || type == mcp794xx || type == m41t11) {
                /* Reset clock calibration, frequency test and output level. */
@@ -390,6 +353,7 @@ static const struct udevice_id ds1307_rtc_ids[] = {
        { .compatible = "dallas,ds1337", .data = ds_1337 },
        { .compatible = "dallas,ds1339", .data = ds_1339 },
        { .compatible = "dallas,ds1340", .data = ds_1340 },
+       { .compatible = "microchip,mcp7940x", .data = mcp794xx },
        { .compatible = "microchip,mcp7941x", .data = mcp794xx },
        { .compatible = "st,m41t11", .data = m41t11 },
        { }
This page took 0.030733 seconds and 4 git commands to generate.