xref: /openbmc/linux/drivers/rtc/rtc-ds1307.c (revision 96de0e252cedffad61b3cb5e05662c591898e69a)
1 /*
2  * rtc-ds1307.c - RTC driver for some mostly-compatible I2C chips.
3  *
4  *  Copyright (C) 2005 James Chapman (ds1337 core)
5  *  Copyright (C) 2006 David Brownell
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11 
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/slab.h>
15 #include <linux/i2c.h>
16 #include <linux/string.h>
17 #include <linux/rtc.h>
18 #include <linux/bcd.h>
19 
20 
21 
22 /* We can't determine type by probing, but if we expect pre-Linux code
23  * to have set the chip up as a clock (turning on the oscillator and
24  * setting the date and time), Linux can ignore the non-clock features.
25  * That's a natural job for a factory or repair bench.
26  *
27  * This is currently a simple no-alarms driver.  If your board has the
28  * alarm irq wired up on a ds1337 or ds1339, and you want to use that,
29  * then look at the rtc-rs5c372 driver for code to steal...
30  */
31 enum ds_type {
32 	ds_1307,
33 	ds_1337,
34 	ds_1338,
35 	ds_1339,
36 	ds_1340,
37 	m41t00,
38 	// rs5c372 too?  different address...
39 };
40 
41 
42 /* RTC registers don't differ much, except for the century flag */
43 #define DS1307_REG_SECS		0x00	/* 00-59 */
44 #	define DS1307_BIT_CH		0x80
45 #	define DS1340_BIT_nEOSC		0x80
46 #define DS1307_REG_MIN		0x01	/* 00-59 */
47 #define DS1307_REG_HOUR		0x02	/* 00-23, or 1-12{am,pm} */
48 #	define DS1307_BIT_12HR		0x40	/* in REG_HOUR */
49 #	define DS1307_BIT_PM		0x20	/* in REG_HOUR */
50 #	define DS1340_BIT_CENTURY_EN	0x80	/* in REG_HOUR */
51 #	define DS1340_BIT_CENTURY	0x40	/* in REG_HOUR */
52 #define DS1307_REG_WDAY		0x03	/* 01-07 */
53 #define DS1307_REG_MDAY		0x04	/* 01-31 */
54 #define DS1307_REG_MONTH	0x05	/* 01-12 */
55 #	define DS1337_BIT_CENTURY	0x80	/* in REG_MONTH */
56 #define DS1307_REG_YEAR		0x06	/* 00-99 */
57 
58 /* Other registers (control, status, alarms, trickle charge, NVRAM, etc)
59  * start at 7, and they differ a LOT. Only control and status matter for
60  * basic RTC date and time functionality; be careful using them.
61  */
62 #define DS1307_REG_CONTROL	0x07		/* or ds1338 */
63 #	define DS1307_BIT_OUT		0x80
64 #	define DS1338_BIT_OSF		0x20
65 #	define DS1307_BIT_SQWE		0x10
66 #	define DS1307_BIT_RS1		0x02
67 #	define DS1307_BIT_RS0		0x01
68 #define DS1337_REG_CONTROL	0x0e
69 #	define DS1337_BIT_nEOSC		0x80
70 #	define DS1337_BIT_RS2		0x10
71 #	define DS1337_BIT_RS1		0x08
72 #	define DS1337_BIT_INTCN		0x04
73 #	define DS1337_BIT_A2IE		0x02
74 #	define DS1337_BIT_A1IE		0x01
75 #define DS1340_REG_CONTROL	0x07
76 #	define DS1340_BIT_OUT		0x80
77 #	define DS1340_BIT_FT		0x40
78 #	define DS1340_BIT_CALIB_SIGN	0x20
79 #	define DS1340_M_CALIBRATION	0x1f
80 #define DS1340_REG_FLAG		0x09
81 #	define DS1340_BIT_OSF		0x80
82 #define DS1337_REG_STATUS	0x0f
83 #	define DS1337_BIT_OSF		0x80
84 #	define DS1337_BIT_A2I		0x02
85 #	define DS1337_BIT_A1I		0x01
86 #define DS1339_REG_TRICKLE	0x10
87 
88 
89 
90 struct ds1307 {
91 	u8			reg_addr;
92 	u8			regs[8];
93 	enum ds_type		type;
94 	struct i2c_msg		msg[2];
95 	struct i2c_client	*client;
96 	struct i2c_client	dev;
97 	struct rtc_device	*rtc;
98 };
99 
100 struct chip_desc {
101 	char			name[9];
102 	unsigned		nvram56:1;
103 	unsigned		alarm:1;
104 	enum ds_type		type;
105 };
106 
107 static const struct chip_desc chips[] = { {
108 	.name		= "ds1307",
109 	.type		= ds_1307,
110 	.nvram56	= 1,
111 }, {
112 	.name		= "ds1337",
113 	.type		= ds_1337,
114 	.alarm		= 1,
115 }, {
116 	.name		= "ds1338",
117 	.type		= ds_1338,
118 	.nvram56	= 1,
119 }, {
120 	.name		= "ds1339",
121 	.type		= ds_1339,
122 	.alarm		= 1,
123 }, {
124 	.name		= "ds1340",
125 	.type		= ds_1340,
126 }, {
127 	.name		= "m41t00",
128 	.type		= m41t00,
129 }, };
130 
131 static inline const struct chip_desc *find_chip(const char *s)
132 {
133 	unsigned i;
134 
135 	for (i = 0; i < ARRAY_SIZE(chips); i++)
136 		if (strnicmp(s, chips[i].name, sizeof chips[i].name) == 0)
137 			return &chips[i];
138 	return NULL;
139 }
140 
141 static int ds1307_get_time(struct device *dev, struct rtc_time *t)
142 {
143 	struct ds1307	*ds1307 = dev_get_drvdata(dev);
144 	int		tmp;
145 
146 	/* read the RTC date and time registers all at once */
147 	ds1307->msg[1].flags = I2C_M_RD;
148 	ds1307->msg[1].len = 7;
149 
150 	tmp = i2c_transfer(to_i2c_adapter(ds1307->client->dev.parent),
151 			ds1307->msg, 2);
152 	if (tmp != 2) {
153 		dev_err(dev, "%s error %d\n", "read", tmp);
154 		return -EIO;
155 	}
156 
157 	dev_dbg(dev, "%s: %02x %02x %02x %02x %02x %02x %02x\n",
158 			"read",
159 			ds1307->regs[0], ds1307->regs[1],
160 			ds1307->regs[2], ds1307->regs[3],
161 			ds1307->regs[4], ds1307->regs[5],
162 			ds1307->regs[6]);
163 
164 	t->tm_sec = BCD2BIN(ds1307->regs[DS1307_REG_SECS] & 0x7f);
165 	t->tm_min = BCD2BIN(ds1307->regs[DS1307_REG_MIN] & 0x7f);
166 	tmp = ds1307->regs[DS1307_REG_HOUR] & 0x3f;
167 	t->tm_hour = BCD2BIN(tmp);
168 	t->tm_wday = BCD2BIN(ds1307->regs[DS1307_REG_WDAY] & 0x07) - 1;
169 	t->tm_mday = BCD2BIN(ds1307->regs[DS1307_REG_MDAY] & 0x3f);
170 	tmp = ds1307->regs[DS1307_REG_MONTH] & 0x1f;
171 	t->tm_mon = BCD2BIN(tmp) - 1;
172 
173 	/* assume 20YY not 19YY, and ignore DS1337_BIT_CENTURY */
174 	t->tm_year = BCD2BIN(ds1307->regs[DS1307_REG_YEAR]) + 100;
175 
176 	dev_dbg(dev, "%s secs=%d, mins=%d, "
177 		"hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
178 		"read", t->tm_sec, t->tm_min,
179 		t->tm_hour, t->tm_mday,
180 		t->tm_mon, t->tm_year, t->tm_wday);
181 
182 	/* initial clock setting can be undefined */
183 	return rtc_valid_tm(t);
184 }
185 
186 static int ds1307_set_time(struct device *dev, struct rtc_time *t)
187 {
188 	struct ds1307	*ds1307 = dev_get_drvdata(dev);
189 	int		result;
190 	int		tmp;
191 	u8		*buf = ds1307->regs;
192 
193 	dev_dbg(dev, "%s secs=%d, mins=%d, "
194 		"hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
195 		"write", t->tm_sec, t->tm_min,
196 		t->tm_hour, t->tm_mday,
197 		t->tm_mon, t->tm_year, t->tm_wday);
198 
199 	*buf++ = 0;		/* first register addr */
200 	buf[DS1307_REG_SECS] = BIN2BCD(t->tm_sec);
201 	buf[DS1307_REG_MIN] = BIN2BCD(t->tm_min);
202 	buf[DS1307_REG_HOUR] = BIN2BCD(t->tm_hour);
203 	buf[DS1307_REG_WDAY] = BIN2BCD(t->tm_wday + 1);
204 	buf[DS1307_REG_MDAY] = BIN2BCD(t->tm_mday);
205 	buf[DS1307_REG_MONTH] = BIN2BCD(t->tm_mon + 1);
206 
207 	/* assume 20YY not 19YY */
208 	tmp = t->tm_year - 100;
209 	buf[DS1307_REG_YEAR] = BIN2BCD(tmp);
210 
211 	switch (ds1307->type) {
212 	case ds_1337:
213 	case ds_1339:
214 		buf[DS1307_REG_MONTH] |= DS1337_BIT_CENTURY;
215 		break;
216 	case ds_1340:
217 		buf[DS1307_REG_HOUR] |= DS1340_BIT_CENTURY_EN
218 				| DS1340_BIT_CENTURY;
219 		break;
220 	default:
221 		break;
222 	}
223 
224 	ds1307->msg[1].flags = 0;
225 	ds1307->msg[1].len = 8;
226 
227 	dev_dbg(dev, "%s: %02x %02x %02x %02x %02x %02x %02x\n",
228 		"write", buf[0], buf[1], buf[2], buf[3],
229 		buf[4], buf[5], buf[6]);
230 
231 	result = i2c_transfer(to_i2c_adapter(ds1307->client->dev.parent),
232 			&ds1307->msg[1], 1);
233 	if (result != 1) {
234 		dev_err(dev, "%s error %d\n", "write", tmp);
235 		return -EIO;
236 	}
237 	return 0;
238 }
239 
240 static const struct rtc_class_ops ds13xx_rtc_ops = {
241 	.read_time	= ds1307_get_time,
242 	.set_time	= ds1307_set_time,
243 };
244 
245 static struct i2c_driver ds1307_driver;
246 
247 static int __devinit ds1307_probe(struct i2c_client *client)
248 {
249 	struct ds1307		*ds1307;
250 	int			err = -ENODEV;
251 	int			tmp;
252 	const struct chip_desc	*chip;
253 	struct i2c_adapter	*adapter = to_i2c_adapter(client->dev.parent);
254 
255 	chip = find_chip(client->name);
256 	if (!chip) {
257 		dev_err(&client->dev, "unknown chip type '%s'\n",
258 				client->name);
259 		return -ENODEV;
260 	}
261 
262 	if (!i2c_check_functionality(adapter,
263 			I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
264 		return -EIO;
265 
266 	if (!(ds1307 = kzalloc(sizeof(struct ds1307), GFP_KERNEL)))
267 		return -ENOMEM;
268 
269 	ds1307->client = client;
270 	i2c_set_clientdata(client, ds1307);
271 
272 	ds1307->msg[0].addr = client->addr;
273 	ds1307->msg[0].flags = 0;
274 	ds1307->msg[0].len = 1;
275 	ds1307->msg[0].buf = &ds1307->reg_addr;
276 
277 	ds1307->msg[1].addr = client->addr;
278 	ds1307->msg[1].flags = I2C_M_RD;
279 	ds1307->msg[1].len = sizeof(ds1307->regs);
280 	ds1307->msg[1].buf = ds1307->regs;
281 
282 	ds1307->type = chip->type;
283 
284 	switch (ds1307->type) {
285 	case ds_1337:
286 	case ds_1339:
287 		ds1307->reg_addr = DS1337_REG_CONTROL;
288 		ds1307->msg[1].len = 2;
289 
290 		/* get registers that the "rtc" read below won't read... */
291 		tmp = i2c_transfer(adapter, ds1307->msg, 2);
292 		if (tmp != 2) {
293 			pr_debug("read error %d\n", tmp);
294 			err = -EIO;
295 			goto exit_free;
296 		}
297 
298 		ds1307->reg_addr = 0;
299 		ds1307->msg[1].len = sizeof(ds1307->regs);
300 
301 		/* oscillator off?  turn it on, so clock can tick. */
302 		if (ds1307->regs[0] & DS1337_BIT_nEOSC)
303 			i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL,
304 				ds1307->regs[0] & ~DS1337_BIT_nEOSC);
305 
306 		/* oscillator fault?  clear flag, and warn */
307 		if (ds1307->regs[1] & DS1337_BIT_OSF) {
308 			i2c_smbus_write_byte_data(client, DS1337_REG_STATUS,
309 				ds1307->regs[1] & ~DS1337_BIT_OSF);
310 			dev_warn(&client->dev, "SET TIME!\n");
311 		}
312 		break;
313 	default:
314 		break;
315 	}
316 
317 read_rtc:
318 	/* read RTC registers */
319 
320 	tmp = i2c_transfer(adapter, ds1307->msg, 2);
321 	if (tmp != 2) {
322 		pr_debug("read error %d\n", tmp);
323 		err = -EIO;
324 		goto exit_free;
325 	}
326 
327 	/* minimal sanity checking; some chips (like DS1340) don't
328 	 * specify the extra bits as must-be-zero, but there are
329 	 * still a few values that are clearly out-of-range.
330 	 */
331 	tmp = ds1307->regs[DS1307_REG_SECS];
332 	switch (ds1307->type) {
333 	case ds_1340:
334 		/* FIXME read register with DS1340_BIT_OSF, use that to
335 		 * trigger the "set time" warning (*after* restarting the
336 		 * oscillator!) instead of this weaker ds1307/m41t00 test.
337 		 */
338 	case ds_1307:
339 	case m41t00:
340 		/* clock halted?  turn it on, so clock can tick. */
341 		if (tmp & DS1307_BIT_CH) {
342 			i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
343 			dev_warn(&client->dev, "SET TIME!\n");
344 			goto read_rtc;
345 		}
346 		break;
347 	case ds_1338:
348 		/* clock halted?  turn it on, so clock can tick. */
349 		if (tmp & DS1307_BIT_CH)
350 			i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
351 
352 		/* oscillator fault?  clear flag, and warn */
353 		if (ds1307->regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
354 			i2c_smbus_write_byte_data(client, DS1307_REG_CONTROL,
355 					ds1307->regs[DS1307_REG_CONTROL]
356 					& ~DS1338_BIT_OSF);
357 			dev_warn(&client->dev, "SET TIME!\n");
358 			goto read_rtc;
359 		}
360 		break;
361 	case ds_1337:
362 	case ds_1339:
363 		break;
364 	}
365 
366 	tmp = ds1307->regs[DS1307_REG_SECS];
367 	tmp = BCD2BIN(tmp & 0x7f);
368 	if (tmp > 60)
369 		goto exit_bad;
370 	tmp = BCD2BIN(ds1307->regs[DS1307_REG_MIN] & 0x7f);
371 	if (tmp > 60)
372 		goto exit_bad;
373 
374 	tmp = BCD2BIN(ds1307->regs[DS1307_REG_MDAY] & 0x3f);
375 	if (tmp == 0 || tmp > 31)
376 		goto exit_bad;
377 
378 	tmp = BCD2BIN(ds1307->regs[DS1307_REG_MONTH] & 0x1f);
379 	if (tmp == 0 || tmp > 12)
380 		goto exit_bad;
381 
382 	tmp = ds1307->regs[DS1307_REG_HOUR];
383 	switch (ds1307->type) {
384 	case ds_1340:
385 	case m41t00:
386 		/* NOTE: ignores century bits; fix before deploying
387 		 * systems that will run through year 2100.
388 		 */
389 		break;
390 	default:
391 		if (!(tmp & DS1307_BIT_12HR))
392 			break;
393 
394 		/* Be sure we're in 24 hour mode.  Multi-master systems
395 		 * take note...
396 		 */
397 		tmp = BCD2BIN(tmp & 0x1f);
398 		if (tmp == 12)
399 			tmp = 0;
400 		if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
401 			tmp += 12;
402 		i2c_smbus_write_byte_data(client,
403 				DS1307_REG_HOUR,
404 				BIN2BCD(tmp));
405 	}
406 
407 	ds1307->rtc = rtc_device_register(client->name, &client->dev,
408 				&ds13xx_rtc_ops, THIS_MODULE);
409 	if (IS_ERR(ds1307->rtc)) {
410 		err = PTR_ERR(ds1307->rtc);
411 		dev_err(&client->dev,
412 			"unable to register the class device\n");
413 		goto exit_free;
414 	}
415 
416 	return 0;
417 
418 exit_bad:
419 	dev_dbg(&client->dev, "%s: %02x %02x %02x %02x %02x %02x %02x\n",
420 			"bogus register",
421 			ds1307->regs[0], ds1307->regs[1],
422 			ds1307->regs[2], ds1307->regs[3],
423 			ds1307->regs[4], ds1307->regs[5],
424 			ds1307->regs[6]);
425 
426 exit_free:
427 	kfree(ds1307);
428 	return err;
429 }
430 
431 static int __devexit ds1307_remove(struct i2c_client *client)
432 {
433 	struct ds1307	*ds1307 = i2c_get_clientdata(client);
434 
435 	rtc_device_unregister(ds1307->rtc);
436 	kfree(ds1307);
437 	return 0;
438 }
439 
440 static struct i2c_driver ds1307_driver = {
441 	.driver = {
442 		.name	= "rtc-ds1307",
443 		.owner	= THIS_MODULE,
444 	},
445 	.probe		= ds1307_probe,
446 	.remove		= __devexit_p(ds1307_remove),
447 };
448 
449 static int __init ds1307_init(void)
450 {
451 	return i2c_add_driver(&ds1307_driver);
452 }
453 module_init(ds1307_init);
454 
455 static void __exit ds1307_exit(void)
456 {
457 	i2c_del_driver(&ds1307_driver);
458 }
459 module_exit(ds1307_exit);
460 
461 MODULE_DESCRIPTION("RTC driver for DS1307 and similar chips");
462 MODULE_LICENSE("GPL");
463