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 return rtc_valid_tm(tm
);
86 static int pcf85063_set_datetime(struct i2c_client
*client
, struct rtc_time
*tm
)
89 unsigned char buf
[11];
91 /* Control & status */
92 buf
[PCF85063_REG_CTRL1
] = 0;
93 buf
[PCF85063_REG_CTRL2
] = 5;
95 /* hours, minutes and seconds */
96 buf
[PCF85063_REG_SC
] = bin2bcd(tm
->tm_sec
) & 0x7F;
98 buf
[PCF85063_REG_MN
] = bin2bcd(tm
->tm_min
);
99 buf
[PCF85063_REG_HR
] = bin2bcd(tm
->tm_hour
);
101 /* Day of month, 1 - 31 */
102 buf
[PCF85063_REG_DM
] = bin2bcd(tm
->tm_mday
);
105 buf
[PCF85063_REG_DW
] = tm
->tm_wday
& 0x07;
108 buf
[PCF85063_REG_MO
] = bin2bcd(tm
->tm_mon
+ 1);
110 /* year and century */
111 buf
[PCF85063_REG_YR
] = bin2bcd(tm
->tm_year
% 100);
113 /* write register's data */
114 for (i
= 0; i
< sizeof(buf
); i
++) {
115 unsigned char data
[2] = { i
, buf
[i
] };
117 err
= i2c_master_send(client
, data
, sizeof(data
));
118 if (err
!= sizeof(data
)) {
119 dev_err(&client
->dev
, "%s: err=%d addr=%02x, data=%02x\n",
120 __func__
, err
, data
[0], data
[1]);
128 static int pcf85063_rtc_read_time(struct device
*dev
, struct rtc_time
*tm
)
130 return pcf85063_get_datetime(to_i2c_client(dev
), tm
);
133 static int pcf85063_rtc_set_time(struct device
*dev
, struct rtc_time
*tm
)
135 return pcf85063_set_datetime(to_i2c_client(dev
), tm
);
138 static const struct rtc_class_ops pcf85063_rtc_ops
= {
139 .read_time
= pcf85063_rtc_read_time
,
140 .set_time
= pcf85063_rtc_set_time
143 static int pcf85063_probe(struct i2c_client
*client
,
144 const struct i2c_device_id
*id
)
146 struct pcf85063
*pcf85063
;
148 dev_dbg(&client
->dev
, "%s\n", __func__
);
150 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
))
153 pcf85063
= devm_kzalloc(&client
->dev
, sizeof(struct pcf85063
),
158 dev_info(&client
->dev
, "chip found, driver version " DRV_VERSION
"\n");
160 i2c_set_clientdata(client
, pcf85063
);
162 pcf85063
->rtc
= devm_rtc_device_register(&client
->dev
,
163 pcf85063_driver
.driver
.name
,
164 &pcf85063_rtc_ops
, THIS_MODULE
);
166 return PTR_ERR_OR_ZERO(pcf85063
->rtc
);
169 static const struct i2c_device_id pcf85063_id
[] = {
173 MODULE_DEVICE_TABLE(i2c
, pcf85063_id
);
176 static const struct of_device_id pcf85063_of_match
[] = {
177 { .compatible
= "nxp,pcf85063" },
180 MODULE_DEVICE_TABLE(of
, pcf85063_of_match
);
183 static struct i2c_driver pcf85063_driver
= {
185 .name
= "rtc-pcf85063",
186 .of_match_table
= of_match_ptr(pcf85063_of_match
),
188 .probe
= pcf85063_probe
,
189 .id_table
= pcf85063_id
,
192 module_i2c_driver(pcf85063_driver
);
194 MODULE_AUTHOR("Søren Andersen <san@rosetechnology.dk>");
195 MODULE_DESCRIPTION("PCF85063 RTC driver");
196 MODULE_LICENSE("GPL");
197 MODULE_VERSION(DRV_VERSION
);