2 * rtc-fm3130.c - RTC driver for Ramtron FM3130 I2C chip.
4 * Copyright (C) 2008 Sergey Lapin
5 * Based on ds1307 driver by James Chapman and David Brownell
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.
12 #include <linux/module.h>
13 #include <linux/i2c.h>
14 #include <linux/rtc.h>
15 #include <linux/bcd.h>
16 #include <linux/slab.h>
18 #define FM3130_RTC_CONTROL (0x0)
19 #define FM3130_CAL_CONTROL (0x1)
20 #define FM3130_RTC_SECONDS (0x2)
21 #define FM3130_RTC_MINUTES (0x3)
22 #define FM3130_RTC_HOURS (0x4)
23 #define FM3130_RTC_DAY (0x5)
24 #define FM3130_RTC_DATE (0x6)
25 #define FM3130_RTC_MONTHS (0x7)
26 #define FM3130_RTC_YEARS (0x8)
28 #define FM3130_ALARM_SECONDS (0x9)
29 #define FM3130_ALARM_MINUTES (0xa)
30 #define FM3130_ALARM_HOURS (0xb)
31 #define FM3130_ALARM_DATE (0xc)
32 #define FM3130_ALARM_MONTHS (0xd)
33 #define FM3130_ALARM_WP_CONTROL (0xe)
35 #define FM3130_CAL_CONTROL_BIT_nOSCEN (1 << 7) /* Osciallator enabled */
36 #define FM3130_RTC_CONTROL_BIT_LB (1 << 7) /* Low battery */
37 #define FM3130_RTC_CONTROL_BIT_AF (1 << 6) /* Alarm flag */
38 #define FM3130_RTC_CONTROL_BIT_CF (1 << 5) /* Century overflow */
39 #define FM3130_RTC_CONTROL_BIT_POR (1 << 4) /* Power on reset */
40 #define FM3130_RTC_CONTROL_BIT_AEN (1 << 3) /* Alarm enable */
41 #define FM3130_RTC_CONTROL_BIT_CAL (1 << 2) /* Calibration mode */
42 #define FM3130_RTC_CONTROL_BIT_WRITE (1 << 1) /* W=1 -> write mode W=0 normal */
43 #define FM3130_RTC_CONTROL_BIT_READ (1 << 0) /* R=1 -> read mode R=0 normal */
45 #define FM3130_CLOCK_REGS 7
46 #define FM3130_ALARM_REGS 5
52 struct i2c_msg msg[4];
53 struct i2c_client *client;
54 struct rtc_device *rtc;
58 static const struct i2c_device_id fm3130_id[] = {
62 MODULE_DEVICE_TABLE(i2c, fm3130_id);
64 #define FM3130_MODE_NORMAL 0
65 #define FM3130_MODE_WRITE 1
66 #define FM3130_MODE_READ 2
68 static void fm3130_rtc_mode(struct device *dev, int mode)
70 struct fm3130 *fm3130 = dev_get_drvdata(dev);
72 fm3130->regs[FM3130_RTC_CONTROL] =
73 i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL);
75 case FM3130_MODE_NORMAL:
76 fm3130->regs[FM3130_RTC_CONTROL] &=
77 ~(FM3130_RTC_CONTROL_BIT_WRITE |
78 FM3130_RTC_CONTROL_BIT_READ);
80 case FM3130_MODE_WRITE:
81 fm3130->regs[FM3130_RTC_CONTROL] |= FM3130_RTC_CONTROL_BIT_WRITE;
83 case FM3130_MODE_READ:
84 fm3130->regs[FM3130_RTC_CONTROL] |= FM3130_RTC_CONTROL_BIT_READ;
87 dev_dbg(dev, "invalid mode %d\n", mode);
91 i2c_smbus_write_byte_data(fm3130->client,
92 FM3130_RTC_CONTROL, fm3130->regs[FM3130_RTC_CONTROL]);
95 static int fm3130_get_time(struct device *dev, struct rtc_time *t)
97 struct fm3130 *fm3130 = dev_get_drvdata(dev);
100 if (!fm3130->data_valid) {
101 /* We have invalid data in RTC, probably due
102 to battery faults or other problems. Return EIO
103 for now, it will allow us to set data later instead
104 of error during probing which disables device */
107 fm3130_rtc_mode(dev, FM3130_MODE_READ);
109 /* read the RTC date and time registers all at once */
110 tmp = i2c_transfer(fm3130->client->adapter, fm3130->msg, 2);
112 dev_err(dev, "%s error %d\n", "read", tmp);
116 fm3130_rtc_mode(dev, FM3130_MODE_NORMAL);
118 dev_dbg(dev, "%s: %15ph\n", "read", fm3130->regs);
120 t->tm_sec = bcd2bin(fm3130->regs[FM3130_RTC_SECONDS] & 0x7f);
121 t->tm_min = bcd2bin(fm3130->regs[FM3130_RTC_MINUTES] & 0x7f);
122 tmp = fm3130->regs[FM3130_RTC_HOURS] & 0x3f;
123 t->tm_hour = bcd2bin(tmp);
124 t->tm_wday = bcd2bin(fm3130->regs[FM3130_RTC_DAY] & 0x07) - 1;
125 t->tm_mday = bcd2bin(fm3130->regs[FM3130_RTC_DATE] & 0x3f);
126 tmp = fm3130->regs[FM3130_RTC_MONTHS] & 0x1f;
127 t->tm_mon = bcd2bin(tmp) - 1;
129 /* assume 20YY not 19YY, and ignore CF bit */
130 t->tm_year = bcd2bin(fm3130->regs[FM3130_RTC_YEARS]) + 100;
132 dev_dbg(dev, "%s secs=%d, mins=%d, "
133 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
134 "read", t->tm_sec, t->tm_min,
135 t->tm_hour, t->tm_mday,
136 t->tm_mon, t->tm_year, t->tm_wday);
142 static int fm3130_set_time(struct device *dev, struct rtc_time *t)
144 struct fm3130 *fm3130 = dev_get_drvdata(dev);
146 u8 *buf = fm3130->regs;
148 dev_dbg(dev, "%s secs=%d, mins=%d, "
149 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
150 "write", t->tm_sec, t->tm_min,
151 t->tm_hour, t->tm_mday,
152 t->tm_mon, t->tm_year, t->tm_wday);
154 /* first register addr */
155 buf[FM3130_RTC_SECONDS] = bin2bcd(t->tm_sec);
156 buf[FM3130_RTC_MINUTES] = bin2bcd(t->tm_min);
157 buf[FM3130_RTC_HOURS] = bin2bcd(t->tm_hour);
158 buf[FM3130_RTC_DAY] = bin2bcd(t->tm_wday + 1);
159 buf[FM3130_RTC_DATE] = bin2bcd(t->tm_mday);
160 buf[FM3130_RTC_MONTHS] = bin2bcd(t->tm_mon + 1);
162 /* assume 20YY not 19YY */
163 tmp = t->tm_year - 100;
164 buf[FM3130_RTC_YEARS] = bin2bcd(tmp);
166 dev_dbg(dev, "%s: %15ph\n", "write", buf);
168 fm3130_rtc_mode(dev, FM3130_MODE_WRITE);
170 /* Writing time registers, we don't support multibyte transfers */
171 for (i = 0; i < FM3130_CLOCK_REGS; i++) {
172 i2c_smbus_write_byte_data(fm3130->client,
173 FM3130_RTC_SECONDS + i,
174 fm3130->regs[FM3130_RTC_SECONDS + i]);
177 fm3130_rtc_mode(dev, FM3130_MODE_NORMAL);
179 /* We assume here that data are valid once written */
180 if (!fm3130->data_valid)
181 fm3130->data_valid = 1;
185 static int fm3130_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
187 struct fm3130 *fm3130 = dev_get_drvdata(dev);
189 struct rtc_time *tm = &alrm->time;
191 if (!fm3130->alarm_valid) {
193 * We have invalid alarm in RTC, probably due to battery faults
194 * or other problems. Return EIO for now, it will allow us to
195 * set alarm value later instead of error during probing which
201 /* read the RTC alarm registers all at once */
202 tmp = i2c_transfer(fm3130->client->adapter, &fm3130->msg[2], 2);
204 dev_err(dev, "%s error %d\n", "read", tmp);
207 dev_dbg(dev, "alarm read %02x %02x %02x %02x %02x\n",
208 fm3130->regs[FM3130_ALARM_SECONDS],
209 fm3130->regs[FM3130_ALARM_MINUTES],
210 fm3130->regs[FM3130_ALARM_HOURS],
211 fm3130->regs[FM3130_ALARM_DATE],
212 fm3130->regs[FM3130_ALARM_MONTHS]);
214 tm->tm_sec = bcd2bin(fm3130->regs[FM3130_ALARM_SECONDS] & 0x7F);
215 tm->tm_min = bcd2bin(fm3130->regs[FM3130_ALARM_MINUTES] & 0x7F);
216 tm->tm_hour = bcd2bin(fm3130->regs[FM3130_ALARM_HOURS] & 0x3F);
217 tm->tm_mday = bcd2bin(fm3130->regs[FM3130_ALARM_DATE] & 0x3F);
218 tm->tm_mon = bcd2bin(fm3130->regs[FM3130_ALARM_MONTHS] & 0x1F);
221 tm->tm_mon -= 1; /* RTC is 1-12, tm_mon is 0-11 */
223 dev_dbg(dev, "%s secs=%d, mins=%d, "
224 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
225 "read alarm", tm->tm_sec, tm->tm_min,
226 tm->tm_hour, tm->tm_mday,
227 tm->tm_mon, tm->tm_year, tm->tm_wday);
229 /* check if alarm enabled */
230 fm3130->regs[FM3130_RTC_CONTROL] =
231 i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL);
233 if ((fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_AEN) &&
234 (~fm3130->regs[FM3130_RTC_CONTROL] &
235 FM3130_RTC_CONTROL_BIT_CAL)) {
242 static int fm3130_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
244 struct fm3130 *fm3130 = dev_get_drvdata(dev);
245 struct rtc_time *tm = &alrm->time;
248 dev_dbg(dev, "%s secs=%d, mins=%d, "
249 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
250 "write alarm", tm->tm_sec, tm->tm_min,
251 tm->tm_hour, tm->tm_mday,
252 tm->tm_mon, tm->tm_year, tm->tm_wday);
254 fm3130->regs[FM3130_ALARM_SECONDS] =
255 (tm->tm_sec != -1) ? bin2bcd(tm->tm_sec) : 0x80;
257 fm3130->regs[FM3130_ALARM_MINUTES] =
258 (tm->tm_min != -1) ? bin2bcd(tm->tm_min) : 0x80;
260 fm3130->regs[FM3130_ALARM_HOURS] =
261 (tm->tm_hour != -1) ? bin2bcd(tm->tm_hour) : 0x80;
263 fm3130->regs[FM3130_ALARM_DATE] =
264 (tm->tm_mday != -1) ? bin2bcd(tm->tm_mday) : 0x80;
266 fm3130->regs[FM3130_ALARM_MONTHS] =
267 (tm->tm_mon != -1) ? bin2bcd(tm->tm_mon + 1) : 0x80;
269 dev_dbg(dev, "alarm write %02x %02x %02x %02x %02x\n",
270 fm3130->regs[FM3130_ALARM_SECONDS],
271 fm3130->regs[FM3130_ALARM_MINUTES],
272 fm3130->regs[FM3130_ALARM_HOURS],
273 fm3130->regs[FM3130_ALARM_DATE],
274 fm3130->regs[FM3130_ALARM_MONTHS]);
275 /* Writing time registers, we don't support multibyte transfers */
276 for (i = 0; i < FM3130_ALARM_REGS; i++) {
277 i2c_smbus_write_byte_data(fm3130->client,
278 FM3130_ALARM_SECONDS + i,
279 fm3130->regs[FM3130_ALARM_SECONDS + i]);
281 fm3130->regs[FM3130_RTC_CONTROL] =
282 i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL);
284 /* enable or disable alarm */
286 i2c_smbus_write_byte_data(fm3130->client, FM3130_RTC_CONTROL,
287 (fm3130->regs[FM3130_RTC_CONTROL] &
288 ~(FM3130_RTC_CONTROL_BIT_CAL)) |
289 FM3130_RTC_CONTROL_BIT_AEN);
291 i2c_smbus_write_byte_data(fm3130->client, FM3130_RTC_CONTROL,
292 fm3130->regs[FM3130_RTC_CONTROL] &
293 ~(FM3130_RTC_CONTROL_BIT_CAL) &
294 ~(FM3130_RTC_CONTROL_BIT_AEN));
297 /* We assume here that data is valid once written */
298 if (!fm3130->alarm_valid)
299 fm3130->alarm_valid = 1;
304 static int fm3130_alarm_irq_enable(struct device *dev, unsigned int enabled)
306 struct fm3130 *fm3130 = dev_get_drvdata(dev);
309 fm3130->regs[FM3130_RTC_CONTROL] =
310 i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL);
312 dev_dbg(dev, "alarm_irq_enable: enable=%d, FM3130_RTC_CONTROL=%02x\n",
313 enabled, fm3130->regs[FM3130_RTC_CONTROL]);
316 case 0: /* alarm off */
317 ret = i2c_smbus_write_byte_data(fm3130->client,
318 FM3130_RTC_CONTROL, fm3130->regs[FM3130_RTC_CONTROL] &
319 ~(FM3130_RTC_CONTROL_BIT_CAL) &
320 ~(FM3130_RTC_CONTROL_BIT_AEN));
322 case 1: /* alarm on */
323 ret = i2c_smbus_write_byte_data(fm3130->client,
324 FM3130_RTC_CONTROL, (fm3130->regs[FM3130_RTC_CONTROL] &
325 ~(FM3130_RTC_CONTROL_BIT_CAL)) |
326 FM3130_RTC_CONTROL_BIT_AEN);
336 static const struct rtc_class_ops fm3130_rtc_ops = {
337 .read_time = fm3130_get_time,
338 .set_time = fm3130_set_time,
339 .read_alarm = fm3130_read_alarm,
340 .set_alarm = fm3130_set_alarm,
341 .alarm_irq_enable = fm3130_alarm_irq_enable,
344 static struct i2c_driver fm3130_driver;
346 static int fm3130_probe(struct i2c_client *client,
347 const struct i2c_device_id *id)
349 struct fm3130 *fm3130;
352 struct i2c_adapter *adapter = client->adapter;
354 if (!i2c_check_functionality(adapter,
355 I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
358 fm3130 = devm_kzalloc(&client->dev, sizeof(struct fm3130), GFP_KERNEL);
363 fm3130->client = client;
364 i2c_set_clientdata(client, fm3130);
365 fm3130->reg_addr_time = FM3130_RTC_SECONDS;
366 fm3130->reg_addr_alarm = FM3130_ALARM_SECONDS;
368 /* Messages to read time */
369 fm3130->msg[0].addr = client->addr;
370 fm3130->msg[0].flags = 0;
371 fm3130->msg[0].len = 1;
372 fm3130->msg[0].buf = &fm3130->reg_addr_time;
374 fm3130->msg[1].addr = client->addr;
375 fm3130->msg[1].flags = I2C_M_RD;
376 fm3130->msg[1].len = FM3130_CLOCK_REGS;
377 fm3130->msg[1].buf = &fm3130->regs[FM3130_RTC_SECONDS];
379 /* Messages to read alarm */
380 fm3130->msg[2].addr = client->addr;
381 fm3130->msg[2].flags = 0;
382 fm3130->msg[2].len = 1;
383 fm3130->msg[2].buf = &fm3130->reg_addr_alarm;
385 fm3130->msg[3].addr = client->addr;
386 fm3130->msg[3].flags = I2C_M_RD;
387 fm3130->msg[3].len = FM3130_ALARM_REGS;
388 fm3130->msg[3].buf = &fm3130->regs[FM3130_ALARM_SECONDS];
390 fm3130->alarm_valid = 0;
391 fm3130->data_valid = 0;
393 tmp = i2c_transfer(adapter, fm3130->msg, 4);
395 dev_dbg(&client->dev, "read error %d\n", tmp);
400 fm3130->regs[FM3130_RTC_CONTROL] =
401 i2c_smbus_read_byte_data(client, FM3130_RTC_CONTROL);
402 fm3130->regs[FM3130_CAL_CONTROL] =
403 i2c_smbus_read_byte_data(client, FM3130_CAL_CONTROL);
405 /* Disabling calibration mode */
406 if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL) {
407 i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
408 fm3130->regs[FM3130_RTC_CONTROL] &
409 ~(FM3130_RTC_CONTROL_BIT_CAL));
410 dev_warn(&client->dev, "Disabling calibration mode!\n");
413 /* Disabling read and write modes */
414 if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_WRITE ||
415 fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ) {
416 i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
417 fm3130->regs[FM3130_RTC_CONTROL] &
418 ~(FM3130_RTC_CONTROL_BIT_READ |
419 FM3130_RTC_CONTROL_BIT_WRITE));
420 dev_warn(&client->dev, "Disabling READ or WRITE mode!\n");
423 /* oscillator off? turn it on, so clock can tick. */
424 if (fm3130->regs[FM3130_CAL_CONTROL] & FM3130_CAL_CONTROL_BIT_nOSCEN)
425 i2c_smbus_write_byte_data(client, FM3130_CAL_CONTROL,
426 fm3130->regs[FM3130_CAL_CONTROL] &
427 ~(FM3130_CAL_CONTROL_BIT_nOSCEN));
429 /* low battery? clear flag, and warn */
430 if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_LB) {
431 i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
432 fm3130->regs[FM3130_RTC_CONTROL] &
433 ~(FM3130_RTC_CONTROL_BIT_LB));
434 dev_warn(&client->dev, "Low battery!\n");
437 /* check if Power On Reset bit is set */
438 if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_POR) {
439 i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
440 fm3130->regs[FM3130_RTC_CONTROL] &
441 ~FM3130_RTC_CONTROL_BIT_POR);
442 dev_dbg(&client->dev, "POR bit is set\n");
444 /* ACS is controlled by alarm */
445 i2c_smbus_write_byte_data(client, FM3130_ALARM_WP_CONTROL, 0x80);
447 /* alarm registers sanity check */
448 tmp = bcd2bin(fm3130->regs[FM3130_RTC_SECONDS] & 0x7f);
452 tmp = bcd2bin(fm3130->regs[FM3130_RTC_MINUTES] & 0x7f);
456 tmp = bcd2bin(fm3130->regs[FM3130_RTC_HOURS] & 0x3f);
460 tmp = bcd2bin(fm3130->regs[FM3130_RTC_DATE] & 0x3f);
461 if (tmp == 0 || tmp > 31)
464 tmp = bcd2bin(fm3130->regs[FM3130_RTC_MONTHS] & 0x1f);
465 if (tmp == 0 || tmp > 12)
468 fm3130->alarm_valid = 1;
472 /* clock registers sanity chek */
473 tmp = bcd2bin(fm3130->regs[FM3130_RTC_SECONDS] & 0x7f);
477 tmp = bcd2bin(fm3130->regs[FM3130_RTC_MINUTES] & 0x7f);
481 tmp = bcd2bin(fm3130->regs[FM3130_RTC_HOURS] & 0x3f);
485 tmp = bcd2bin(fm3130->regs[FM3130_RTC_DAY] & 0x7);
486 if (tmp == 0 || tmp > 7)
489 tmp = bcd2bin(fm3130->regs[FM3130_RTC_DATE] & 0x3f);
490 if (tmp == 0 || tmp > 31)
493 tmp = bcd2bin(fm3130->regs[FM3130_RTC_MONTHS] & 0x1f);
494 if (tmp == 0 || tmp > 12)
497 fm3130->data_valid = 1;
501 if (!fm3130->data_valid || !fm3130->alarm_valid)
502 dev_dbg(&client->dev, "%s: %15ph\n", "bogus registers",
505 /* We won't bail out here because we just got invalid data.
506 Time setting from u-boot doesn't work anyway */
507 fm3130->rtc = devm_rtc_device_register(&client->dev, client->name,
508 &fm3130_rtc_ops, THIS_MODULE);
509 if (IS_ERR(fm3130->rtc)) {
510 err = PTR_ERR(fm3130->rtc);
511 dev_err(&client->dev,
512 "unable to register the class device\n");
520 static struct i2c_driver fm3130_driver = {
522 .name = "rtc-fm3130",
524 .probe = fm3130_probe,
525 .id_table = fm3130_id,
528 module_i2c_driver(fm3130_driver);
530 MODULE_DESCRIPTION("RTC driver for FM3130");
531 MODULE_AUTHOR("Sergey Lapin <slapin@ossfans.org>");
532 MODULE_LICENSE("GPL");