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 * recommened in .../Documentation/i2c/writing-clients 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_WDALM 0x20 /* 1=Watchdog, 0=Alarm */
50 #define DS1374_REG_CR_WACE 0x40 /* WD/Alarm counter enable */
51 #define DS1374_REG_SR 0x08 /* Status */
52 #define DS1374_REG_SR_OSF 0x80 /* Oscillator Stop Flag */
53 #define DS1374_REG_SR_AF 0x01 /* Alarm Flag */
54 #define DS1374_REG_TCR 0x09 /* Trickle Charge */
56 static const struct i2c_device_id ds1374_id
[] = {
60 MODULE_DEVICE_TABLE(i2c
, ds1374_id
);
63 static const struct of_device_id ds1374_of_match
[] = {
64 { .compatible
= "dallas,ds1374" },
67 MODULE_DEVICE_TABLE(of
, ds1374_of_match
);
71 struct i2c_client
*client
;
72 struct rtc_device
*rtc
;
73 struct work_struct work
;
75 /* The mutex protects alarm operations, and prevents a race
76 * between the enable_irq() in the workqueue and the free_irq()
77 * in the remove function.
83 static struct i2c_driver ds1374_driver
;
85 static int ds1374_read_rtc(struct i2c_client
*client
, u32
*time
,
92 if (WARN_ON(nbytes
> 4))
95 ret
= i2c_smbus_read_i2c_block_data(client
, reg
, nbytes
, buf
);
102 for (i
= nbytes
- 1, *time
= 0; i
>= 0; i
--)
103 *time
= (*time
<< 8) | buf
[i
];
108 static int ds1374_write_rtc(struct i2c_client
*client
, u32 time
,
119 for (i
= 0; i
< nbytes
; i
++) {
120 buf
[i
] = time
& 0xff;
124 return i2c_smbus_write_i2c_block_data(client
, reg
, nbytes
, buf
);
127 static int ds1374_check_rtc_status(struct i2c_client
*client
)
132 stat
= i2c_smbus_read_byte_data(client
, DS1374_REG_SR
);
136 if (stat
& DS1374_REG_SR_OSF
)
137 dev_warn(&client
->dev
,
138 "oscillator discontinuity flagged, time unreliable\n");
140 stat
&= ~(DS1374_REG_SR_OSF
| DS1374_REG_SR_AF
);
142 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_SR
, stat
);
146 /* If the alarm is pending, clear it before requesting
147 * the interrupt, so an interrupt event isn't reported
148 * before everything is initialized.
151 control
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
155 control
&= ~(DS1374_REG_CR_WACE
| DS1374_REG_CR_AIE
);
156 return i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, control
);
159 static int ds1374_read_time(struct device
*dev
, struct rtc_time
*time
)
161 struct i2c_client
*client
= to_i2c_client(dev
);
165 ret
= ds1374_read_rtc(client
, &itime
, DS1374_REG_TOD0
, 4);
167 rtc_time_to_tm(itime
, time
);
172 static int ds1374_set_time(struct device
*dev
, struct rtc_time
*time
)
174 struct i2c_client
*client
= to_i2c_client(dev
);
177 rtc_tm_to_time(time
, &itime
);
178 return ds1374_write_rtc(client
, itime
, DS1374_REG_TOD0
, 4);
181 #ifndef CONFIG_RTC_DRV_DS1374_WDT
182 /* The ds1374 has a decrementer for an alarm, rather than a comparator.
183 * If the time of day is changed, then the alarm will need to be
186 static int ds1374_read_alarm(struct device
*dev
, struct rtc_wkalrm
*alarm
)
188 struct i2c_client
*client
= to_i2c_client(dev
);
189 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
194 if (client
->irq
<= 0)
197 mutex_lock(&ds1374
->mutex
);
199 cr
= ret
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
203 sr
= ret
= i2c_smbus_read_byte_data(client
, DS1374_REG_SR
);
207 ret
= ds1374_read_rtc(client
, &now
, DS1374_REG_TOD0
, 4);
211 ret
= ds1374_read_rtc(client
, &cur_alarm
, DS1374_REG_WDALM0
, 3);
215 rtc_time_to_tm(now
+ cur_alarm
, &alarm
->time
);
216 alarm
->enabled
= !!(cr
& DS1374_REG_CR_WACE
);
217 alarm
->pending
= !!(sr
& DS1374_REG_SR_AF
);
220 mutex_unlock(&ds1374
->mutex
);
224 static int ds1374_set_alarm(struct device
*dev
, struct rtc_wkalrm
*alarm
)
226 struct i2c_client
*client
= to_i2c_client(dev
);
227 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
229 unsigned long new_alarm
, itime
;
233 if (client
->irq
<= 0)
236 ret
= ds1374_read_time(dev
, &now
);
240 rtc_tm_to_time(&alarm
->time
, &new_alarm
);
241 rtc_tm_to_time(&now
, &itime
);
243 /* This can happen due to races, in addition to dates that are
244 * truly in the past. To avoid requiring the caller to check for
245 * races, dates in the past are assumed to be in the recent past
246 * (i.e. not something that we'd rather the caller know about via
247 * an error), and the alarm is set to go off as soon as possible.
249 if (time_before_eq(new_alarm
, itime
))
254 mutex_lock(&ds1374
->mutex
);
256 ret
= cr
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
260 /* Disable any existing alarm before setting the new one
261 * (or lack thereof). */
262 cr
&= ~DS1374_REG_CR_WACE
;
264 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, cr
);
268 ret
= ds1374_write_rtc(client
, new_alarm
, DS1374_REG_WDALM0
, 3);
272 if (alarm
->enabled
) {
273 cr
|= DS1374_REG_CR_WACE
| DS1374_REG_CR_AIE
;
274 cr
&= ~DS1374_REG_CR_WDALM
;
276 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, cr
);
280 mutex_unlock(&ds1374
->mutex
);
285 static irqreturn_t
ds1374_irq(int irq
, void *dev_id
)
287 struct i2c_client
*client
= dev_id
;
288 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
290 disable_irq_nosync(irq
);
291 schedule_work(&ds1374
->work
);
295 static void ds1374_work(struct work_struct
*work
)
297 struct ds1374
*ds1374
= container_of(work
, struct ds1374
, work
);
298 struct i2c_client
*client
= ds1374
->client
;
301 mutex_lock(&ds1374
->mutex
);
303 stat
= i2c_smbus_read_byte_data(client
, DS1374_REG_SR
);
307 if (stat
& DS1374_REG_SR_AF
) {
308 stat
&= ~DS1374_REG_SR_AF
;
309 i2c_smbus_write_byte_data(client
, DS1374_REG_SR
, stat
);
311 control
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
315 control
&= ~(DS1374_REG_CR_WACE
| DS1374_REG_CR_AIE
);
316 i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, control
);
318 rtc_update_irq(ds1374
->rtc
, 1, RTC_AF
| RTC_IRQF
);
322 if (!ds1374
->exiting
)
323 enable_irq(client
->irq
);
325 mutex_unlock(&ds1374
->mutex
);
328 #ifndef CONFIG_RTC_DRV_DS1374_WDT
329 static int ds1374_alarm_irq_enable(struct device
*dev
, unsigned int enabled
)
331 struct i2c_client
*client
= to_i2c_client(dev
);
332 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
335 mutex_lock(&ds1374
->mutex
);
337 ret
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
342 ret
|= DS1374_REG_CR_WACE
| DS1374_REG_CR_AIE
;
343 ret
&= ~DS1374_REG_CR_WDALM
;
345 ret
&= ~DS1374_REG_CR_WACE
;
347 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, ret
);
350 mutex_unlock(&ds1374
->mutex
);
355 static const struct rtc_class_ops ds1374_rtc_ops
= {
356 .read_time
= ds1374_read_time
,
357 .set_time
= ds1374_set_time
,
358 #ifndef CONFIG_RTC_DRV_DS1374_WDT
359 .read_alarm
= ds1374_read_alarm
,
360 .set_alarm
= ds1374_set_alarm
,
361 .alarm_irq_enable
= ds1374_alarm_irq_enable
,
365 #ifdef CONFIG_RTC_DRV_DS1374_WDT
367 *****************************************************************************
371 *****************************************************************************
373 static struct i2c_client
*save_client
;
375 #define WD_TIMO 131762
377 #define DRV_NAME "DS1374 Watchdog"
379 static int wdt_margin
= WD_TIMO
;
380 static unsigned long wdt_is_open
;
381 module_param(wdt_margin
, int, 0);
382 MODULE_PARM_DESC(wdt_margin
, "Watchdog timeout in seconds (default 32s)");
384 static const struct watchdog_info ds1374_wdt_info
= {
385 .identity
= "DS1374 WTD",
386 .options
= WDIOF_SETTIMEOUT
| WDIOF_KEEPALIVEPING
|
390 static int ds1374_wdt_settimeout(unsigned int timeout
)
392 int ret
= -ENOIOCTLCMD
;
395 ret
= cr
= i2c_smbus_read_byte_data(save_client
, DS1374_REG_CR
);
399 /* Disable any existing watchdog/alarm before setting the new one */
400 cr
&= ~DS1374_REG_CR_WACE
;
402 ret
= i2c_smbus_write_byte_data(save_client
, DS1374_REG_CR
, cr
);
406 /* Set new watchdog time */
407 ret
= ds1374_write_rtc(save_client
, timeout
, DS1374_REG_WDALM0
, 3);
409 pr_info("couldn't set new watchdog time\n");
413 /* Enable watchdog timer */
414 cr
|= DS1374_REG_CR_WACE
| DS1374_REG_CR_WDALM
;
415 cr
&= ~DS1374_REG_CR_AIE
;
417 ret
= i2c_smbus_write_byte_data(save_client
, DS1374_REG_CR
, cr
);
428 * Reload the watchdog timer. (ie, pat the watchdog)
430 static void ds1374_wdt_ping(void)
435 ret
= ds1374_read_rtc(save_client
, &val
, DS1374_REG_WDALM0
, 3);
437 pr_info("WD TICK FAIL!!!!!!!!!! %i\n", ret
);
440 static void ds1374_wdt_disable(void)
442 int ret
= -ENOIOCTLCMD
;
445 cr
= i2c_smbus_read_byte_data(save_client
, DS1374_REG_CR
);
446 /* Disable watchdog timer */
447 cr
&= ~DS1374_REG_CR_WACE
;
449 ret
= i2c_smbus_write_byte_data(save_client
, DS1374_REG_CR
, cr
);
453 * Watchdog device is opened, and watchdog starts running.
455 static int ds1374_wdt_open(struct inode
*inode
, struct file
*file
)
457 struct ds1374
*ds1374
= i2c_get_clientdata(save_client
);
459 if (MINOR(inode
->i_rdev
) == WATCHDOG_MINOR
) {
460 mutex_lock(&ds1374
->mutex
);
461 if (test_and_set_bit(0, &wdt_is_open
)) {
462 mutex_unlock(&ds1374
->mutex
);
469 mutex_unlock(&ds1374
->mutex
);
470 return nonseekable_open(inode
, file
);
476 * Close the watchdog device.
478 static int ds1374_wdt_release(struct inode
*inode
, struct file
*file
)
480 if (MINOR(inode
->i_rdev
) == WATCHDOG_MINOR
)
481 clear_bit(0, &wdt_is_open
);
487 * Pat the watchdog whenever device is written to.
489 static ssize_t
ds1374_wdt_write(struct file
*file
, const char __user
*data
,
490 size_t len
, loff_t
*ppos
)
499 static ssize_t
ds1374_wdt_read(struct file
*file
, char __user
*data
,
500 size_t len
, loff_t
*ppos
)
506 * Handle commands from user-space.
508 static long ds1374_wdt_ioctl(struct file
*file
, unsigned int cmd
,
511 int new_margin
, options
;
514 case WDIOC_GETSUPPORT
:
515 return copy_to_user((struct watchdog_info __user
*)arg
,
516 &ds1374_wdt_info
, sizeof(ds1374_wdt_info
)) ? -EFAULT
: 0;
518 case WDIOC_GETSTATUS
:
519 case WDIOC_GETBOOTSTATUS
:
520 return put_user(0, (int __user
*)arg
);
521 case WDIOC_KEEPALIVE
:
524 case WDIOC_SETTIMEOUT
:
525 if (get_user(new_margin
, (int __user
*)arg
))
528 if (new_margin
< 1 || new_margin
> 16777216)
531 wdt_margin
= new_margin
;
532 ds1374_wdt_settimeout(new_margin
);
535 case WDIOC_GETTIMEOUT
:
536 return put_user(wdt_margin
, (int __user
*)arg
);
537 case WDIOC_SETOPTIONS
:
538 if (copy_from_user(&options
, (int __user
*)arg
, sizeof(int)))
541 if (options
& WDIOS_DISABLECARD
) {
542 pr_info("disable watchdog\n");
543 ds1374_wdt_disable();
546 if (options
& WDIOS_ENABLECARD
) {
547 pr_info("enable watchdog\n");
548 ds1374_wdt_settimeout(wdt_margin
);
557 static long ds1374_wdt_unlocked_ioctl(struct file
*file
, unsigned int cmd
,
561 struct ds1374
*ds1374
= i2c_get_clientdata(save_client
);
563 mutex_lock(&ds1374
->mutex
);
564 ret
= ds1374_wdt_ioctl(file
, cmd
, arg
);
565 mutex_unlock(&ds1374
->mutex
);
570 static int ds1374_wdt_notify_sys(struct notifier_block
*this,
571 unsigned long code
, void *unused
)
573 if (code
== SYS_DOWN
|| code
== SYS_HALT
)
574 /* Disable Watchdog */
575 ds1374_wdt_disable();
579 static const struct file_operations ds1374_wdt_fops
= {
580 .owner
= THIS_MODULE
,
581 .read
= ds1374_wdt_read
,
582 .unlocked_ioctl
= ds1374_wdt_unlocked_ioctl
,
583 .write
= ds1374_wdt_write
,
584 .open
= ds1374_wdt_open
,
585 .release
= ds1374_wdt_release
,
589 static struct miscdevice ds1374_miscdev
= {
590 .minor
= WATCHDOG_MINOR
,
592 .fops
= &ds1374_wdt_fops
,
595 static struct notifier_block ds1374_wdt_notifier
= {
596 .notifier_call
= ds1374_wdt_notify_sys
,
599 #endif /*CONFIG_RTC_DRV_DS1374_WDT*/
601 *****************************************************************************
605 *****************************************************************************
607 static int ds1374_probe(struct i2c_client
*client
,
608 const struct i2c_device_id
*id
)
610 struct ds1374
*ds1374
;
613 ds1374
= devm_kzalloc(&client
->dev
, sizeof(struct ds1374
), GFP_KERNEL
);
617 ds1374
->client
= client
;
618 i2c_set_clientdata(client
, ds1374
);
620 INIT_WORK(&ds1374
->work
, ds1374_work
);
621 mutex_init(&ds1374
->mutex
);
623 ret
= ds1374_check_rtc_status(client
);
627 if (client
->irq
> 0) {
628 ret
= devm_request_irq(&client
->dev
, client
->irq
, ds1374_irq
, 0,
631 dev_err(&client
->dev
, "unable to request IRQ\n");
635 device_set_wakeup_capable(&client
->dev
, 1);
638 ds1374
->rtc
= devm_rtc_device_register(&client
->dev
, client
->name
,
639 &ds1374_rtc_ops
, THIS_MODULE
);
640 if (IS_ERR(ds1374
->rtc
)) {
641 dev_err(&client
->dev
, "unable to register the class device\n");
642 return PTR_ERR(ds1374
->rtc
);
645 #ifdef CONFIG_RTC_DRV_DS1374_WDT
646 save_client
= client
;
647 ret
= misc_register(&ds1374_miscdev
);
650 ret
= register_reboot_notifier(&ds1374_wdt_notifier
);
652 misc_deregister(&ds1374_miscdev
);
655 ds1374_wdt_settimeout(131072);
661 static int ds1374_remove(struct i2c_client
*client
)
663 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
664 #ifdef CONFIG_RTC_DRV_DS1374_WDT
665 misc_deregister(&ds1374_miscdev
);
666 ds1374_miscdev
.parent
= NULL
;
667 unregister_reboot_notifier(&ds1374_wdt_notifier
);
670 if (client
->irq
> 0) {
671 mutex_lock(&ds1374
->mutex
);
673 mutex_unlock(&ds1374
->mutex
);
675 devm_free_irq(&client
->dev
, client
->irq
, client
);
676 cancel_work_sync(&ds1374
->work
);
682 #ifdef CONFIG_PM_SLEEP
683 static int ds1374_suspend(struct device
*dev
)
685 struct i2c_client
*client
= to_i2c_client(dev
);
687 if (client
->irq
> 0 && device_may_wakeup(&client
->dev
))
688 enable_irq_wake(client
->irq
);
692 static int ds1374_resume(struct device
*dev
)
694 struct i2c_client
*client
= to_i2c_client(dev
);
696 if (client
->irq
> 0 && device_may_wakeup(&client
->dev
))
697 disable_irq_wake(client
->irq
);
702 static SIMPLE_DEV_PM_OPS(ds1374_pm
, ds1374_suspend
, ds1374_resume
);
704 static struct i2c_driver ds1374_driver
= {
706 .name
= "rtc-ds1374",
709 .probe
= ds1374_probe
,
710 .remove
= ds1374_remove
,
711 .id_table
= ds1374_id
,
714 module_i2c_driver(ds1374_driver
);
716 MODULE_AUTHOR("Scott Wood <scottwood@freescale.com>");
717 MODULE_DESCRIPTION("Maxim/Dallas DS1374 RTC Driver");
718 MODULE_LICENSE("GPL");