2 * RTC client/driver for the Maxim/Dallas DS1374 Real-Time Clock over I2C
4 * Based on code by Randy Vinson <rvinson@mvista.com>,
5 * which was based on the m41t00.c by Mark Greer <mgreer@mvista.com>.
7 * Copyright (C) 2014 Rose Technology
8 * Copyright (C) 2006-2007 Freescale Semiconductor
10 * 2005 (c) MontaVista Software, Inc. This file is licensed under
11 * the terms of the GNU General Public License version 2. This program
12 * is licensed "as is" without any warranty of any kind, whether express
16 * It would be more efficient to use i2c msgs/i2c_transfer directly but, as
17 * recommended in .../Documentation/i2c/writing-clients.rst section
18 * "Sending and receiving", using SMBus level communication is preferred.
21 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
23 #include <linux/kernel.h>
24 #include <linux/module.h>
25 #include <linux/interrupt.h>
26 #include <linux/i2c.h>
27 #include <linux/rtc.h>
28 #include <linux/bcd.h>
29 #include <linux/workqueue.h>
30 #include <linux/slab.h>
32 #ifdef CONFIG_RTC_DRV_DS1374_WDT
34 #include <linux/ioctl.h>
35 #include <linux/miscdevice.h>
36 #include <linux/reboot.h>
37 #include <linux/watchdog.h>
40 #define DS1374_REG_TOD0 0x00 /* Time of Day */
41 #define DS1374_REG_TOD1 0x01
42 #define DS1374_REG_TOD2 0x02
43 #define DS1374_REG_TOD3 0x03
44 #define DS1374_REG_WDALM0 0x04 /* Watchdog/Alarm */
45 #define DS1374_REG_WDALM1 0x05
46 #define DS1374_REG_WDALM2 0x06
47 #define DS1374_REG_CR 0x07 /* Control */
48 #define DS1374_REG_CR_AIE 0x01 /* Alarm Int. Enable */
49 #define DS1374_REG_CR_WDSTR 0x08 /* 1=INT, 0=RST */
50 #define DS1374_REG_CR_WDALM 0x20 /* 1=Watchdog, 0=Alarm */
51 #define DS1374_REG_CR_WACE 0x40 /* WD/Alarm counter enable */
52 #define DS1374_REG_SR 0x08 /* Status */
53 #define DS1374_REG_SR_OSF 0x80 /* Oscillator Stop Flag */
54 #define DS1374_REG_SR_AF 0x01 /* Alarm Flag */
55 #define DS1374_REG_TCR 0x09 /* Trickle Charge */
57 static const struct i2c_device_id ds1374_id
[] = {
61 MODULE_DEVICE_TABLE(i2c
, ds1374_id
);
64 static const struct of_device_id ds1374_of_match
[] = {
65 { .compatible
= "dallas,ds1374" },
68 MODULE_DEVICE_TABLE(of
, ds1374_of_match
);
72 struct i2c_client
*client
;
73 struct rtc_device
*rtc
;
74 struct work_struct work
;
75 #ifdef CONFIG_RTC_DRV_DS1374_WDT
76 struct watchdog_device wdt
;
78 /* The mutex protects alarm operations, and prevents a race
79 * between the enable_irq() in the workqueue and the free_irq()
80 * in the remove function.
86 static struct i2c_driver ds1374_driver
;
88 static int ds1374_read_rtc(struct i2c_client
*client
, u32
*time
,
95 if (WARN_ON(nbytes
> 4))
98 ret
= i2c_smbus_read_i2c_block_data(client
, reg
, nbytes
, buf
);
105 for (i
= nbytes
- 1, *time
= 0; i
>= 0; i
--)
106 *time
= (*time
<< 8) | buf
[i
];
111 static int ds1374_write_rtc(struct i2c_client
*client
, u32 time
,
122 for (i
= 0; i
< nbytes
; i
++) {
123 buf
[i
] = time
& 0xff;
127 return i2c_smbus_write_i2c_block_data(client
, reg
, nbytes
, buf
);
130 static int ds1374_check_rtc_status(struct i2c_client
*client
)
135 stat
= i2c_smbus_read_byte_data(client
, DS1374_REG_SR
);
139 if (stat
& DS1374_REG_SR_OSF
)
140 dev_warn(&client
->dev
,
141 "oscillator discontinuity flagged, time unreliable\n");
143 stat
&= ~(DS1374_REG_SR_OSF
| DS1374_REG_SR_AF
);
145 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_SR
, stat
);
149 /* If the alarm is pending, clear it before requesting
150 * the interrupt, so an interrupt event isn't reported
151 * before everything is initialized.
154 control
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
158 control
&= ~(DS1374_REG_CR_WACE
| DS1374_REG_CR_AIE
);
159 return i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, control
);
162 static int ds1374_read_time(struct device
*dev
, struct rtc_time
*time
)
164 struct i2c_client
*client
= to_i2c_client(dev
);
168 ret
= ds1374_read_rtc(client
, &itime
, DS1374_REG_TOD0
, 4);
170 rtc_time64_to_tm(itime
, time
);
175 static int ds1374_set_time(struct device
*dev
, struct rtc_time
*time
)
177 struct i2c_client
*client
= to_i2c_client(dev
);
178 unsigned long itime
= rtc_tm_to_time64(time
);
180 return ds1374_write_rtc(client
, itime
, DS1374_REG_TOD0
, 4);
183 #ifndef CONFIG_RTC_DRV_DS1374_WDT
184 /* The ds1374 has a decrementer for an alarm, rather than a comparator.
185 * If the time of day is changed, then the alarm will need to be
188 static int ds1374_read_alarm(struct device
*dev
, struct rtc_wkalrm
*alarm
)
190 struct i2c_client
*client
= to_i2c_client(dev
);
191 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
196 if (client
->irq
<= 0)
199 mutex_lock(&ds1374
->mutex
);
201 cr
= ret
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
205 sr
= ret
= i2c_smbus_read_byte_data(client
, DS1374_REG_SR
);
209 ret
= ds1374_read_rtc(client
, &now
, DS1374_REG_TOD0
, 4);
213 ret
= ds1374_read_rtc(client
, &cur_alarm
, DS1374_REG_WDALM0
, 3);
217 rtc_time64_to_tm(now
+ cur_alarm
, &alarm
->time
);
218 alarm
->enabled
= !!(cr
& DS1374_REG_CR_WACE
);
219 alarm
->pending
= !!(sr
& DS1374_REG_SR_AF
);
222 mutex_unlock(&ds1374
->mutex
);
226 static int ds1374_set_alarm(struct device
*dev
, struct rtc_wkalrm
*alarm
)
228 struct i2c_client
*client
= to_i2c_client(dev
);
229 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
231 unsigned long new_alarm
, itime
;
235 if (client
->irq
<= 0)
238 ret
= ds1374_read_time(dev
, &now
);
242 new_alarm
= rtc_tm_to_time64(&alarm
->time
);
243 itime
= rtc_tm_to_time64(&now
);
245 /* This can happen due to races, in addition to dates that are
246 * truly in the past. To avoid requiring the caller to check for
247 * races, dates in the past are assumed to be in the recent past
248 * (i.e. not something that we'd rather the caller know about via
249 * an error), and the alarm is set to go off as soon as possible.
251 if (time_before_eq(new_alarm
, itime
))
256 mutex_lock(&ds1374
->mutex
);
258 ret
= cr
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
262 /* Disable any existing alarm before setting the new one
263 * (or lack thereof). */
264 cr
&= ~DS1374_REG_CR_WACE
;
266 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, cr
);
270 ret
= ds1374_write_rtc(client
, new_alarm
, DS1374_REG_WDALM0
, 3);
274 if (alarm
->enabled
) {
275 cr
|= DS1374_REG_CR_WACE
| DS1374_REG_CR_AIE
;
276 cr
&= ~DS1374_REG_CR_WDALM
;
278 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, cr
);
282 mutex_unlock(&ds1374
->mutex
);
287 static irqreturn_t
ds1374_irq(int irq
, void *dev_id
)
289 struct i2c_client
*client
= dev_id
;
290 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
292 disable_irq_nosync(irq
);
293 schedule_work(&ds1374
->work
);
297 static void ds1374_work(struct work_struct
*work
)
299 struct ds1374
*ds1374
= container_of(work
, struct ds1374
, work
);
300 struct i2c_client
*client
= ds1374
->client
;
303 mutex_lock(&ds1374
->mutex
);
305 stat
= i2c_smbus_read_byte_data(client
, DS1374_REG_SR
);
309 if (stat
& DS1374_REG_SR_AF
) {
310 stat
&= ~DS1374_REG_SR_AF
;
311 i2c_smbus_write_byte_data(client
, DS1374_REG_SR
, stat
);
313 control
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
317 control
&= ~(DS1374_REG_CR_WACE
| DS1374_REG_CR_AIE
);
318 i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, control
);
320 rtc_update_irq(ds1374
->rtc
, 1, RTC_AF
| RTC_IRQF
);
324 if (!ds1374
->exiting
)
325 enable_irq(client
->irq
);
327 mutex_unlock(&ds1374
->mutex
);
330 #ifndef CONFIG_RTC_DRV_DS1374_WDT
331 static int ds1374_alarm_irq_enable(struct device
*dev
, unsigned int enabled
)
333 struct i2c_client
*client
= to_i2c_client(dev
);
334 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
337 mutex_lock(&ds1374
->mutex
);
339 ret
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
344 ret
|= DS1374_REG_CR_WACE
| DS1374_REG_CR_AIE
;
345 ret
&= ~DS1374_REG_CR_WDALM
;
347 ret
&= ~DS1374_REG_CR_WACE
;
349 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, ret
);
352 mutex_unlock(&ds1374
->mutex
);
357 static const struct rtc_class_ops ds1374_rtc_ops
= {
358 .read_time
= ds1374_read_time
,
359 .set_time
= ds1374_set_time
,
360 #ifndef CONFIG_RTC_DRV_DS1374_WDT
361 .read_alarm
= ds1374_read_alarm
,
362 .set_alarm
= ds1374_set_alarm
,
363 .alarm_irq_enable
= ds1374_alarm_irq_enable
,
367 #ifdef CONFIG_RTC_DRV_DS1374_WDT
369 *****************************************************************************
373 *****************************************************************************
376 #define TIMER_MARGIN_DEFAULT 32
377 #define TIMER_MARGIN_MIN 1
378 #define TIMER_MARGIN_MAX 4095 /* 24-bit value */
380 static int wdt_margin
;
381 module_param(wdt_margin
, int, 0);
382 MODULE_PARM_DESC(wdt_margin
, "Watchdog timeout in seconds (default 32s)");
384 static bool nowayout
= WATCHDOG_NOWAYOUT
;
385 module_param(nowayout
, bool, 0);
386 MODULE_PARM_DESC(nowayout
, "Watchdog cannot be stopped once started (default ="
387 __MODULE_STRING(WATCHDOG_NOWAYOUT
)")");
389 static const struct watchdog_info ds1374_wdt_info
= {
390 .identity
= "DS1374 Watchdog",
391 .options
= WDIOF_SETTIMEOUT
| WDIOF_KEEPALIVEPING
|
395 static int ds1374_wdt_settimeout(struct watchdog_device
*wdt
, unsigned int timeout
)
397 struct ds1374
*ds1374
= watchdog_get_drvdata(wdt
);
398 struct i2c_client
*client
= ds1374
->client
;
401 wdt
->timeout
= timeout
;
403 cr
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
407 /* Disable any existing watchdog/alarm before setting the new one */
408 cr
&= ~DS1374_REG_CR_WACE
;
410 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, cr
);
414 /* Set new watchdog time */
415 timeout
= timeout
* 4096;
416 ret
= ds1374_write_rtc(client
, timeout
, DS1374_REG_WDALM0
, 3);
420 /* Enable watchdog timer */
421 cr
|= DS1374_REG_CR_WACE
| DS1374_REG_CR_WDALM
;
422 cr
&= ~DS1374_REG_CR_WDSTR
;/* for RST PIN */
423 cr
&= ~DS1374_REG_CR_AIE
;
425 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, cr
);
433 * Reload the watchdog timer. (ie, pat the watchdog)
435 static int ds1374_wdt_start(struct watchdog_device
*wdt
)
437 struct ds1374
*ds1374
= watchdog_get_drvdata(wdt
);
440 return ds1374_read_rtc(ds1374
->client
, &val
, DS1374_REG_WDALM0
, 3);
443 static int ds1374_wdt_stop(struct watchdog_device
*wdt
)
445 struct ds1374
*ds1374
= watchdog_get_drvdata(wdt
);
446 struct i2c_client
*client
= ds1374
->client
;
449 cr
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
453 /* Disable watchdog timer */
454 cr
&= ~DS1374_REG_CR_WACE
;
456 return i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, cr
);
459 static const struct watchdog_ops ds1374_wdt_ops
= {
460 .owner
= THIS_MODULE
,
461 .start
= ds1374_wdt_start
,
462 .stop
= ds1374_wdt_stop
,
463 .set_timeout
= ds1374_wdt_settimeout
,
465 #endif /*CONFIG_RTC_DRV_DS1374_WDT*/
467 *****************************************************************************
471 *****************************************************************************
473 static int ds1374_probe(struct i2c_client
*client
,
474 const struct i2c_device_id
*id
)
476 struct ds1374
*ds1374
;
479 ds1374
= devm_kzalloc(&client
->dev
, sizeof(struct ds1374
), GFP_KERNEL
);
483 ds1374
->rtc
= devm_rtc_allocate_device(&client
->dev
);
484 if (IS_ERR(ds1374
->rtc
))
485 return PTR_ERR(ds1374
->rtc
);
487 ds1374
->client
= client
;
488 i2c_set_clientdata(client
, ds1374
);
490 INIT_WORK(&ds1374
->work
, ds1374_work
);
491 mutex_init(&ds1374
->mutex
);
493 ret
= ds1374_check_rtc_status(client
);
497 if (client
->irq
> 0) {
498 ret
= devm_request_irq(&client
->dev
, client
->irq
, ds1374_irq
, 0,
501 dev_err(&client
->dev
, "unable to request IRQ\n");
505 device_set_wakeup_capable(&client
->dev
, 1);
508 ds1374
->rtc
->ops
= &ds1374_rtc_ops
;
509 ds1374
->rtc
->range_max
= U32_MAX
;
511 ret
= rtc_register_device(ds1374
->rtc
);
515 #ifdef CONFIG_RTC_DRV_DS1374_WDT
516 ds1374
->wdt
.info
= &ds1374_wdt_info
;
517 ds1374
->wdt
.ops
= &ds1374_wdt_ops
;
518 ds1374
->wdt
.timeout
= TIMER_MARGIN_DEFAULT
;
519 ds1374
->wdt
.min_timeout
= TIMER_MARGIN_MIN
;
520 ds1374
->wdt
.max_timeout
= TIMER_MARGIN_MAX
;
522 watchdog_init_timeout(&ds1374
->wdt
, wdt_margin
, &client
->dev
);
523 watchdog_set_nowayout(&ds1374
->wdt
, nowayout
);
524 watchdog_stop_on_reboot(&ds1374
->wdt
);
525 watchdog_stop_on_unregister(&ds1374
->wdt
);
526 watchdog_set_drvdata(&ds1374
->wdt
, ds1374
);
527 ds1374_wdt_settimeout(&ds1374
->wdt
, ds1374
->wdt
.timeout
);
529 ret
= devm_watchdog_register_device(&client
->dev
, &ds1374
->wdt
);
537 static int ds1374_remove(struct i2c_client
*client
)
539 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
541 if (client
->irq
> 0) {
542 mutex_lock(&ds1374
->mutex
);
544 mutex_unlock(&ds1374
->mutex
);
546 devm_free_irq(&client
->dev
, client
->irq
, client
);
547 cancel_work_sync(&ds1374
->work
);
553 #ifdef CONFIG_PM_SLEEP
554 static int ds1374_suspend(struct device
*dev
)
556 struct i2c_client
*client
= to_i2c_client(dev
);
558 if (client
->irq
> 0 && device_may_wakeup(&client
->dev
))
559 enable_irq_wake(client
->irq
);
563 static int ds1374_resume(struct device
*dev
)
565 struct i2c_client
*client
= to_i2c_client(dev
);
567 if (client
->irq
> 0 && device_may_wakeup(&client
->dev
))
568 disable_irq_wake(client
->irq
);
573 static SIMPLE_DEV_PM_OPS(ds1374_pm
, ds1374_suspend
, ds1374_resume
);
575 static struct i2c_driver ds1374_driver
= {
577 .name
= "rtc-ds1374",
578 .of_match_table
= of_match_ptr(ds1374_of_match
),
581 .probe
= ds1374_probe
,
582 .remove
= ds1374_remove
,
583 .id_table
= ds1374_id
,
586 module_i2c_driver(ds1374_driver
);
588 MODULE_AUTHOR("Scott Wood <scottwood@freescale.com>");
589 MODULE_DESCRIPTION("Maxim/Dallas DS1374 RTC Driver");
590 MODULE_LICENSE("GPL");