2 * Copyright (C) 2016 by NXP Semiconductors Inc.
3 * Date & Time support for PCF2127 RTC
14 #define PCF2127_REG_CTRL1 0x00
15 #define PCF2127_REG_CTRL2 0x01
16 #define PCF2127_REG_CTRL3 0x02
17 #define PCF2127_REG_SC 0x03
18 #define PCF2127_REG_MN 0x04
19 #define PCF2127_REG_HR 0x05
20 #define PCF2127_REG_DM 0x06
21 #define PCF2127_REG_DW 0x07
22 #define PCF2127_REG_MO 0x08
23 #define PCF2127_REG_YR 0x09
25 static int pcf2127_rtc_set(struct udevice
*dev
, const struct rtc_time
*tm
)
30 /* start register address */
31 buf
[i
++] = PCF2127_REG_SC
;
33 /* hours, minutes and seconds */
34 buf
[i
++] = bin2bcd(tm
->tm_sec
);
35 buf
[i
++] = bin2bcd(tm
->tm_min
);
36 buf
[i
++] = bin2bcd(tm
->tm_hour
);
37 buf
[i
++] = bin2bcd(tm
->tm_mday
);
38 buf
[i
++] = tm
->tm_wday
& 0x07;
41 buf
[i
++] = bin2bcd(tm
->tm_mon
+ 1);
44 buf
[i
++] = bin2bcd(tm
->tm_year
% 100);
46 /* write register's data */
47 ret
= dm_i2c_write(dev
, PCF2127_REG_CTRL1
, buf
, sizeof(buf
));
52 static int pcf2127_rtc_get(struct udevice
*dev
, struct rtc_time
*tm
)
55 uchar buf
[10] = { PCF2127_REG_CTRL1
};
57 ret
= dm_i2c_write(dev
, PCF2127_REG_CTRL1
, buf
, 1);
60 ret
= dm_i2c_read(dev
, PCF2127_REG_CTRL1
, buf
, sizeof(buf
));
64 if (buf
[PCF2127_REG_CTRL3
] & 0x04)
65 puts("### Warning: RTC Low Voltage - date/time not reliable\n");
67 tm
->tm_sec
= bcd2bin(buf
[PCF2127_REG_SC
] & 0x7F);
68 tm
->tm_min
= bcd2bin(buf
[PCF2127_REG_MN
] & 0x7F);
69 tm
->tm_hour
= bcd2bin(buf
[PCF2127_REG_HR
] & 0x3F);
70 tm
->tm_mday
= bcd2bin(buf
[PCF2127_REG_DM
] & 0x3F);
71 tm
->tm_mon
= bcd2bin(buf
[PCF2127_REG_MO
] & 0x1F) - 1;
72 tm
->tm_year
= bcd2bin(buf
[PCF2127_REG_YR
]) + 1900;
73 if (tm
->tm_year
< 1970)
74 tm
->tm_year
+= 100; /* assume we are in 1970...2069 */
75 tm
->tm_wday
= buf
[PCF2127_REG_DW
] & 0x07;
79 debug("Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
80 tm
->tm_year
, tm
->tm_mon
, tm
->tm_mday
, tm
->tm_wday
,
81 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
86 static int pcf2127_rtc_reset(struct udevice
*dev
)
88 /*Doing nothing here*/
93 static const struct rtc_ops pcf2127_rtc_ops
= {
94 .get
= pcf2127_rtc_get
,
95 .set
= pcf2127_rtc_set
,
96 .reset
= pcf2127_rtc_reset
,
99 static const struct udevice_id pcf2127_rtc_ids
[] = {
100 { .compatible
= "pcf2127-rtc" },
104 U_BOOT_DRIVER(rtc_pcf2127
) = {
105 .name
= "rtc-pcf2127",
107 .of_match
= pcf2127_rtc_ids
,
108 .ops
= &pcf2127_rtc_ops
,