]> 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 cdb088c9b153d2f24787a3da6f05cc3a4575fe99..049210991014ee9dfdf59bfce09fd5a0d0036a2b 100644 (file)
  * based on ds1337.c
  */
 
-#include <common.h>
+#include <config.h>
 #include <command.h>
 #include <dm.h>
+#include <log.h>
 #include <rtc.h>
 #include <i2c.h>
 
 enum ds_type {
        ds_1307,
        ds_1337,
+       ds_1339,
        ds_1340,
+       m41t11,
        mcp794xx,
 };
 
@@ -38,21 +41,35 @@ 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 */
 #define RTC_CTL_BIT_RS0                0x01    /* Rate select 0                */
 #define RTC_CTL_BIT_RS1                0x02    /* Rate select 1                */
 #define RTC_CTL_BIT_SQWE       0x10    /* Square Wave Enable           */
 #define RTC_CTL_BIT_OUT                0x80    /* Output Control               */
 
+/* DS1337-specific bits */
+#define DS1337_CTL_BIT_RS1     0x08    /* Rate select 1                */
+#define DS1337_CTL_BIT_RS2     0x10    /* Rate select 2                */
+#define DS1337_CTL_BIT_EOSC    0x80    /* Enable Oscillator            */
+
+/* DS1340-specific bits */
+#define DS1340_SEC_BIT_EOSC    0x80    /* Enable Oscillator            */
+#define DS1340_CTL_BIT_OUT     0x80    /* Output Control               */
+
 /* MCP7941X-specific bits */
 #define MCP7941X_BIT_ST                0x80
 #define MCP7941X_BIT_VBATEN    0x08
 
 #ifndef CONFIG_DM_RTC
 
-#if defined(CONFIG_CMD_DATE)
-
 /*---------------------------------------------------------------------*/
 #undef DEBUG_RTC
 
@@ -63,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)
@@ -122,7 +139,6 @@ read_rtc:
        }
 #endif
 
-
        tmp->tm_sec  = bcd2bin (sec & 0x7F);
        tmp->tm_min  = bcd2bin (min & 0x7F);
        tmp->tm_hour = bcd2bin (hour & 0x3F);
@@ -140,7 +156,6 @@ read_rtc:
        return rel;
 }
 
-
 /*
  * Set the RTC
  */
@@ -173,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
@@ -187,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
  */
@@ -195,17 +208,14 @@ 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_CMD_DATE*/
-
 #endif /* !CONFIG_DM_RTC */
 
 #ifdef CONFIG_DM_RTC
@@ -239,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;
 }
 
@@ -248,36 +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;
-               }
-       }
+       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);
 
-       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);
-               }
-
-               /* 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);
                }
        }
 
@@ -303,18 +301,37 @@ read_rtc:
 static int ds1307_rtc_reset(struct udevice *dev)
 {
        int ret;
+       enum ds_type type = dev_get_driver_data(dev);
 
-       /* clear Clock Halt */
+       /*
+        * reset clock/oscillator in the seconds register:
+        * on DS1307 bit 7 enables Clock Halt (CH),
+        * on DS1340 bit 7 disables the oscillator (not EOSC)
+        * on MCP794xx bit 7 enables Start Oscillator (ST)
+        */
        ret = dm_i2c_reg_write(dev, RTC_SEC_REG_ADDR, 0x00);
        if (ret < 0)
                return ret;
-       ret = dm_i2c_reg_write(dev, RTC_CTL_REG_ADDR,
-                              RTC_CTL_BIT_SQWE | RTC_CTL_BIT_RS1 |
-                              RTC_CTL_BIT_RS0);
-       if (ret < 0)
-               return ret;
 
-       return 0;
+       if (type == ds_1307) {
+               /* Write control register in order to enable square-wave
+                * output (SQWE) and set a default rate of 32.768kHz (RS1|RS0).
+                */
+               ret = dm_i2c_reg_write(dev, RTC_CTL_REG_ADDR,
+                                      RTC_CTL_BIT_SQWE | RTC_CTL_BIT_RS1 |
+                                      RTC_CTL_BIT_RS0);
+       } else if (type == ds_1337) {
+               /* 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, 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. */
+               ret = dm_i2c_reg_write(dev, RTC_CTL_REG_ADDR, 0x00);
+       }
+
+       return ret;
 }
 
 static int ds1307_probe(struct udevice *dev)
@@ -334,8 +351,11 @@ static const struct rtc_ops ds1307_rtc_ops = {
 static const struct udevice_id ds1307_rtc_ids[] = {
        { .compatible = "dallas,ds1307", .data = ds_1307 },
        { .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.03128 seconds and 4 git commands to generate.