2 * An I2C driver for the PCF85063 RTC
3 * Copyright 2014 Rose Technology
5 * Author: Søren Andersen <san@rosetechnology.dk>
6 * Maintainers: http://www.nslu2-linux.org/
8 * based on the other drivers in this same directory.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
14 #include <linux/i2c.h>
15 #include <linux/bcd.h>
16 #include <linux/rtc.h>
17 #include <linux/module.h>
19 #define DRV_VERSION "0.0.1"
21 #define PCF85063_REG_CTRL1 0x00 /* status */
22 #define PCF85063_REG_CTRL2 0x01
24 #define PCF85063_REG_SC 0x04 /* datetime */
25 #define PCF85063_REG_MN 0x05
26 #define PCF85063_REG_HR 0x06
27 #define PCF85063_REG_DM 0x07
28 #define PCF85063_REG_DW 0x08
29 #define PCF85063_REG_MO 0x09
30 #define PCF85063_REG_YR 0x0A
32 #define PCF85063_MO_C 0x80 /* century */
34 static struct i2c_driver pcf85063_driver
;
37 struct rtc_device
*rtc
;
38 int c_polarity
; /* 0: MO_C=1 means 19xx, otherwise MO_C=1 means 20xx */
39 int voltage_low
; /* indicates if a low_voltage was detected */
43 * In the routines that deal directly with the pcf85063 hardware, we use
44 * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.
46 static int pcf85063_get_datetime(struct i2c_client
*client
, struct rtc_time
*tm
)
48 struct pcf85063
*pcf85063
= i2c_get_clientdata(client
);
49 unsigned char buf
[13] = { PCF85063_REG_CTRL1
};
50 struct i2c_msg msgs
[] = {
56 {/* read status + date */
65 if ((i2c_transfer(client
->adapter
, msgs
, 2)) != 2) {
66 dev_err(&client
->dev
, "%s: read error\n", __func__
);
70 tm
->tm_sec
= bcd2bin(buf
[PCF85063_REG_SC
] & 0x7F);
71 tm
->tm_min
= bcd2bin(buf
[PCF85063_REG_MN
] & 0x7F);
72 tm
->tm_hour
= bcd2bin(buf
[PCF85063_REG_HR
] & 0x3F); /* rtc hr 0-23 */
73 tm
->tm_mday
= bcd2bin(buf
[PCF85063_REG_DM
] & 0x3F);
74 tm
->tm_wday
= buf
[PCF85063_REG_DW
] & 0x07;
75 tm
->tm_mon
= bcd2bin(buf
[PCF85063_REG_MO
] & 0x1F) - 1; /* rtc mn 1-12 */
76 tm
->tm_year
= bcd2bin(buf
[PCF85063_REG_YR
]);
78 tm
->tm_year
+= 100; /* assume we are in 1970...2069 */
79 /* detect the polarity heuristically. see note above. */
80 pcf85063
->c_polarity
= (buf
[PCF85063_REG_MO
] & PCF85063_MO_C
) ?
81 (tm
->tm_year
>= 100) : (tm
->tm_year
< 100);
83 /* the clock can give out invalid datetime, but we cannot return
84 * -EINVAL otherwise hwclock will refuse to set the time on bootup.
86 if (rtc_valid_tm(tm
) < 0)
87 dev_err(&client
->dev
, "retrieved date/time is not valid.\n");
92 static int pcf85063_set_datetime(struct i2c_client
*client
, struct rtc_time
*tm
)
95 unsigned char buf
[11];
97 /* Control & status */
98 buf
[PCF85063_REG_CTRL1
] = 0;
99 buf
[PCF85063_REG_CTRL2
] = 5;
101 /* hours, minutes and seconds */
102 buf
[PCF85063_REG_SC
] = bin2bcd(tm
->tm_sec
) & 0x7F;
104 buf
[PCF85063_REG_MN
] = bin2bcd(tm
->tm_min
);
105 buf
[PCF85063_REG_HR
] = bin2bcd(tm
->tm_hour
);
107 /* Day of month, 1 - 31 */
108 buf
[PCF85063_REG_DM
] = bin2bcd(tm
->tm_mday
);
111 buf
[PCF85063_REG_DW
] = tm
->tm_wday
& 0x07;
114 buf
[PCF85063_REG_MO
] = bin2bcd(tm
->tm_mon
+ 1);
116 /* year and century */
117 buf
[PCF85063_REG_YR
] = bin2bcd(tm
->tm_year
% 100);
119 /* write register's data */
120 for (i
= 0; i
< sizeof(buf
); i
++) {
121 unsigned char data
[2] = { i
, buf
[i
] };
123 err
= i2c_master_send(client
, data
, sizeof(data
));
124 if (err
!= sizeof(data
)) {
125 dev_err(&client
->dev
, "%s: err=%d addr=%02x, data=%02x\n",
126 __func__
, err
, data
[0], data
[1]);
134 static int pcf85063_rtc_read_time(struct device
*dev
, struct rtc_time
*tm
)
136 return pcf85063_get_datetime(to_i2c_client(dev
), tm
);
139 static int pcf85063_rtc_set_time(struct device
*dev
, struct rtc_time
*tm
)
141 return pcf85063_set_datetime(to_i2c_client(dev
), tm
);
144 static const struct rtc_class_ops pcf85063_rtc_ops
= {
145 .read_time
= pcf85063_rtc_read_time
,
146 .set_time
= pcf85063_rtc_set_time
149 static int pcf85063_probe(struct i2c_client
*client
,
150 const struct i2c_device_id
*id
)
152 struct pcf85063
*pcf85063
;
154 dev_dbg(&client
->dev
, "%s\n", __func__
);
156 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
))
159 pcf85063
= devm_kzalloc(&client
->dev
, sizeof(struct pcf85063
),
164 dev_info(&client
->dev
, "chip found, driver version " DRV_VERSION
"\n");
166 i2c_set_clientdata(client
, pcf85063
);
168 pcf85063
->rtc
= devm_rtc_device_register(&client
->dev
,
169 pcf85063_driver
.driver
.name
,
170 &pcf85063_rtc_ops
, THIS_MODULE
);
172 return PTR_ERR_OR_ZERO(pcf85063
->rtc
);
175 static const struct i2c_device_id pcf85063_id
[] = {
179 MODULE_DEVICE_TABLE(i2c
, pcf85063_id
);
182 static const struct of_device_id pcf85063_of_match
[] = {
183 { .compatible
= "nxp,pcf85063" },
186 MODULE_DEVICE_TABLE(of
, pcf85063_of_match
);
189 static struct i2c_driver pcf85063_driver
= {
191 .name
= "rtc-pcf85063",
192 .owner
= THIS_MODULE
,
193 .of_match_table
= of_match_ptr(pcf85063_of_match
),
195 .probe
= pcf85063_probe
,
196 .id_table
= pcf85063_id
,
199 module_i2c_driver(pcf85063_driver
);
201 MODULE_AUTHOR("Søren Andersen <san@rosetechnology.dk>");
202 MODULE_DESCRIPTION("PCF85063 RTC driver");
203 MODULE_LICENSE("GPL");
204 MODULE_VERSION(DRV_VERSION
);