rtc: pt7c4338: Add driver model support
[oweals/u-boot.git] / drivers / rtc / pcf2127.c
index bc59c6cda35a19e31a8998e35cc6e5d72b980bf6..b34ed63bf051f9d4f4fbbd36a16ae1549b495b7c 100644 (file)
 #include <i2c.h>
 #include <rtc.h>
 
-#define PCF2127_REG_CTRL1      (0x00)
-#define PCF2127_REG_CTRL2      (0x01)
-#define PCF2127_REG_CTRL3      (0x02)
-#define PCF2127_REG_SC         (0x03)  /* datetime */
-#define PCF2127_REG_MN         (0x04)
-#define PCF2127_REG_HR         (0x05)
-#define PCF2127_REG_DM         (0x06)
-#define PCF2127_REG_DW         (0x07)
-#define PCF2127_REG_MO         (0x08)
-#define PCF2127_REG_YR         (0x09)
+#define PCF2127_REG_CTRL1      0x00
+#define PCF2127_REG_CTRL2      0x01
+#define PCF2127_REG_CTRL3      0x02
+#define PCF2127_REG_SC         0x03
+#define PCF2127_REG_MN         0x04
+#define PCF2127_REG_HR         0x05
+#define PCF2127_REG_DM         0x06
+#define PCF2127_REG_DW         0x07
+#define PCF2127_REG_MO         0x08
+#define PCF2127_REG_YR         0x09
+
+static int pcf2127_read_reg(struct udevice *dev, uint offset,
+                           u8 *buffer, int len)
+{
+       struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
+       struct i2c_msg msg;
+       int ret;
+
+       /* Set the address of the start register to be read */
+       ret = dm_i2c_write(dev, offset, NULL, 0);
+       if (ret < 0)
+               return ret;
+
+       /* Read register's data */
+       msg.addr = chip->chip_addr;
+       msg.flags |= I2C_M_RD;
+       msg.len = len;
+       msg.buf = buffer;
+
+       return dm_i2c_xfer(dev, &msg, 1);
+}
 
 static int pcf2127_rtc_set(struct udevice *dev, const struct rtc_time *tm)
 {
-       uchar buf[8];
-       int i = 0;
-
-       /* start register address */
-       buf[i++] = PCF2127_REG_SC;
+       uchar buf[7] = {0};
+       int i = 0, ret;
 
        /* hours, minutes and seconds */
        buf[i++] = bin2bcd(tm->tm_sec);
@@ -38,27 +56,25 @@ static int pcf2127_rtc_set(struct udevice *dev, const struct rtc_time *tm)
        buf[i++] = tm->tm_wday & 0x07;
 
        /* month, 1 - 12 */
-       buf[i++] = bin2bcd(tm->tm_mon + 1);
+       buf[i++] = bin2bcd(tm->tm_mon);
 
        /* year */
        buf[i++] = bin2bcd(tm->tm_year % 100);
 
        /* write register's data */
-       if (dm_i2c_write(dev, PCF2127_REG_CTRL1, buf, sizeof(buf)) < 0)
-               return -1;
+       ret = dm_i2c_write(dev, PCF2127_REG_SC, buf, i);
 
-       return 0;
+       return ret;
 }
 
 static int pcf2127_rtc_get(struct udevice *dev, struct rtc_time *tm)
 {
-       int rel = 0;
+       int ret = 0;
        uchar buf[10] = { PCF2127_REG_CTRL1 };
 
-       if (dm_i2c_write(dev, PCF2127_REG_CTRL1, buf, 1) < 0)
-               return -1;
-       if (dm_i2c_read(dev, PCF2127_REG_CTRL1, buf, sizeof(buf)) < 0)
-               return -1;
+       ret = pcf2127_read_reg(dev, PCF2127_REG_CTRL1, buf, sizeof(buf));
+       if (ret < 0)
+               return ret;
 
        if (buf[PCF2127_REG_CTRL3] & 0x04)
                puts("### Warning: RTC Low Voltage - date/time not reliable\n");
@@ -67,7 +83,7 @@ static int pcf2127_rtc_get(struct udevice *dev, struct rtc_time *tm)
        tm->tm_min  = bcd2bin(buf[PCF2127_REG_MN] & 0x7F);
        tm->tm_hour = bcd2bin(buf[PCF2127_REG_HR] & 0x3F);
        tm->tm_mday = bcd2bin(buf[PCF2127_REG_DM] & 0x3F);
-       tm->tm_mon  = bcd2bin(buf[PCF2127_REG_MO] & 0x1F) - 1;
+       tm->tm_mon  = bcd2bin(buf[PCF2127_REG_MO] & 0x1F);
        tm->tm_year = bcd2bin(buf[PCF2127_REG_YR]) + 1900;
        if (tm->tm_year < 1970)
                tm->tm_year += 100;     /* assume we are in 1970...2069 */
@@ -79,12 +95,13 @@ static int pcf2127_rtc_get(struct udevice *dev, struct rtc_time *tm)
              tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,
              tm->tm_hour, tm->tm_min, tm->tm_sec);
 
-       return rel;
+       return ret;
 }
 
 static int pcf2127_rtc_reset(struct udevice *dev)
 {
        /*Doing nothing here*/
+
        return 0;
 }