2 * drivers/rtc/rtc-pcf8583.c
4 * Copyright (C) 2000 Russell King
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 * Driver for PCF8583 RTC & RAM chip
12 * Converted to the generic RTC susbsystem by G. Liakhovetski (2006)
14 #include <linux/module.h>
15 #include <linux/i2c.h>
16 #include <linux/slab.h>
17 #include <linux/string.h>
18 #include <linux/mc146818rtc.h>
19 #include <linux/init.h>
20 #include <linux/errno.h>
21 #include <linux/bcd.h>
30 struct i2c_client client
;
31 struct rtc_device
*rtc
;
35 #define CTRL_STOP 0x80
36 #define CTRL_HOLD 0x40
37 #define CTRL_32KHZ 0x00
38 #define CTRL_MASK 0x08
39 #define CTRL_ALARMEN 0x04
40 #define CTRL_ALARM 0x02
41 #define CTRL_TIMER 0x01
43 static const unsigned short normal_i2c
[] = { 0x50, I2C_CLIENT_END
};
45 /* Module parameters */
48 static struct i2c_driver pcf8583_driver
;
50 #define get_ctrl(x) ((struct pcf8583 *)i2c_get_clientdata(x))->ctrl
51 #define set_ctrl(x, v) get_ctrl(x) = v
53 #define CMOS_YEAR (64 + 128)
54 #define CMOS_CHECKSUM (63)
56 static int pcf8583_get_datetime(struct i2c_client
*client
, struct rtc_time
*dt
)
58 unsigned char buf
[8], addr
[1] = { 1 };
59 struct i2c_msg msgs
[2] = {
74 memset(buf
, 0, sizeof(buf
));
76 ret
= i2c_transfer(client
->adapter
, msgs
, 2);
78 dt
->tm_year
= buf
[4] >> 6;
79 dt
->tm_wday
= buf
[5] >> 5;
84 dt
->tm_sec
= BCD2BIN(buf
[1]);
85 dt
->tm_min
= BCD2BIN(buf
[2]);
86 dt
->tm_hour
= BCD2BIN(buf
[3]);
87 dt
->tm_mday
= BCD2BIN(buf
[4]);
88 dt
->tm_mon
= BCD2BIN(buf
[5]) - 1;
91 return ret
== 2 ? 0 : -EIO
;
94 static int pcf8583_set_datetime(struct i2c_client
*client
, struct rtc_time
*dt
, int datetoo
)
100 buf
[1] = get_ctrl(client
) | 0x80;
102 buf
[3] = BIN2BCD(dt
->tm_sec
);
103 buf
[4] = BIN2BCD(dt
->tm_min
);
104 buf
[5] = BIN2BCD(dt
->tm_hour
);
108 buf
[6] = BIN2BCD(dt
->tm_mday
) | (dt
->tm_year
<< 6);
109 buf
[7] = BIN2BCD(dt
->tm_mon
+ 1) | (dt
->tm_wday
<< 5);
112 ret
= i2c_master_send(client
, (char *)buf
, len
);
116 buf
[1] = get_ctrl(client
);
117 ret
= i2c_master_send(client
, (char *)buf
, 2);
119 return ret
== 2 ? 0 : -EIO
;
122 static int pcf8583_get_ctrl(struct i2c_client
*client
, unsigned char *ctrl
)
124 *ctrl
= get_ctrl(client
);
128 static int pcf8583_set_ctrl(struct i2c_client
*client
, unsigned char *ctrl
)
130 unsigned char buf
[2];
134 set_ctrl(client
, *ctrl
);
136 return i2c_master_send(client
, (char *)buf
, 2);
139 static int pcf8583_read_mem(struct i2c_client
*client
, struct rtc_mem
*mem
)
141 unsigned char addr
[1];
142 struct i2c_msg msgs
[2] = {
144 .addr
= client
->addr
,
149 .addr
= client
->addr
,
161 return i2c_transfer(client
->adapter
, msgs
, 2) == 2 ? 0 : -EIO
;
164 static int pcf8583_write_mem(struct i2c_client
*client
, struct rtc_mem
*mem
)
166 unsigned char buf
[9];
169 if (mem
->loc
< 8 || mem
->nr
> 8)
173 memcpy(buf
+ 1, mem
->data
, mem
->nr
);
175 ret
= i2c_master_send(client
, buf
, mem
->nr
+ 1);
176 return ret
== mem
->nr
+ 1 ? 0 : -EIO
;
179 static int pcf8583_rtc_read_time(struct device
*dev
, struct rtc_time
*tm
)
181 struct i2c_client
*client
= to_i2c_client(dev
);
182 unsigned char ctrl
, year
[2];
183 struct rtc_mem mem
= { CMOS_YEAR
, sizeof(year
), year
};
184 int real_year
, year_offset
, err
;
187 * Ensure that the RTC is running.
189 pcf8583_get_ctrl(client
, &ctrl
);
190 if (ctrl
& (CTRL_STOP
| CTRL_HOLD
)) {
191 unsigned char new_ctrl
= ctrl
& ~(CTRL_STOP
| CTRL_HOLD
);
193 printk(KERN_WARNING
"RTC: resetting control %02x -> %02x\n",
196 if ((err
= pcf8583_set_ctrl(client
, &new_ctrl
)) < 0)
200 if (pcf8583_get_datetime(client
, tm
) ||
201 pcf8583_read_mem(client
, &mem
))
207 * The RTC year holds the LSB two bits of the current
208 * year, which should reflect the LSB two bits of the
209 * CMOS copy of the year. Any difference indicates
210 * that we have to correct the CMOS version.
212 year_offset
= tm
->tm_year
- (real_year
& 3);
215 * RTC year wrapped. Adjust it appropriately.
219 tm
->tm_year
= (real_year
+ year_offset
+ year
[1] * 100) - 1900;
224 static int pcf8583_rtc_set_time(struct device
*dev
, struct rtc_time
*tm
)
226 struct i2c_client
*client
= to_i2c_client(dev
);
227 unsigned char year
[2], chk
;
228 struct rtc_mem cmos_year
= { CMOS_YEAR
, sizeof(year
), year
};
229 struct rtc_mem cmos_check
= { CMOS_CHECKSUM
, 1, &chk
};
230 unsigned int proper_year
= tm
->tm_year
+ 1900;
234 * The RTC's own 2-bit year must reflect the least
235 * significant two bits of the CMOS year.
238 ret
= pcf8583_set_datetime(client
, tm
, 1);
242 ret
= pcf8583_read_mem(client
, &cmos_check
);
246 ret
= pcf8583_read_mem(client
, &cmos_year
);
250 chk
-= year
[1] + year
[0];
252 year
[1] = proper_year
/ 100;
253 year
[0] = proper_year
% 100;
255 chk
+= year
[1] + year
[0];
257 ret
= pcf8583_write_mem(client
, &cmos_year
);
262 ret
= pcf8583_write_mem(client
, &cmos_check
);
267 static const struct rtc_class_ops pcf8583_rtc_ops
= {
268 .read_time
= pcf8583_rtc_read_time
,
269 .set_time
= pcf8583_rtc_set_time
,
272 static int pcf8583_probe(struct i2c_adapter
*adap
, int addr
, int kind
);
274 static int pcf8583_attach(struct i2c_adapter
*adap
)
276 return i2c_probe(adap
, &addr_data
, pcf8583_probe
);
279 static int pcf8583_detach(struct i2c_client
*client
)
282 struct pcf8583
*pcf
= i2c_get_clientdata(client
);
283 struct rtc_device
*rtc
= pcf
->rtc
;
286 rtc_device_unregister(rtc
);
288 if ((err
= i2c_detach_client(client
)))
295 static struct i2c_driver pcf8583_driver
= {
299 .id
= I2C_DRIVERID_PCF8583
,
300 .attach_adapter
= pcf8583_attach
,
301 .detach_client
= pcf8583_detach
,
304 static int pcf8583_probe(struct i2c_adapter
*adap
, int addr
, int kind
)
307 struct i2c_client
*client
;
308 struct rtc_device
*rtc
;
309 unsigned char buf
[1], ad
[1] = { 0 };
311 struct i2c_msg msgs
[2] = {
325 if (!i2c_check_functionality(adap
, I2C_FUNC_I2C
))
328 pcf
= kzalloc(sizeof(*pcf
), GFP_KERNEL
);
332 client
= &pcf
->client
;
335 client
->adapter
= adap
;
336 client
->driver
= &pcf8583_driver
;
338 strlcpy(client
->name
, pcf8583_driver
.driver
.name
, I2C_NAME_SIZE
);
340 if (i2c_transfer(client
->adapter
, msgs
, 2) != 2) {
345 err
= i2c_attach_client(client
);
350 rtc
= rtc_device_register(pcf8583_driver
.driver
.name
, &client
->dev
,
351 &pcf8583_rtc_ops
, THIS_MODULE
);
359 i2c_set_clientdata(client
, pcf
);
360 set_ctrl(client
, buf
[0]);
365 i2c_detach_client(client
);
373 static __init
int pcf8583_init(void)
375 return i2c_add_driver(&pcf8583_driver
);
378 static __exit
void pcf8583_exit(void)
380 i2c_del_driver(&pcf8583_driver
);
383 module_init(pcf8583_init
);
384 module_exit(pcf8583_exit
);
386 MODULE_AUTHOR("Russell King");
387 MODULE_DESCRIPTION("PCF8583 I2C RTC driver");
388 MODULE_LICENSE("GPL");