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
,
97 ret
= i2c_smbus_read_i2c_block_data(client
, reg
, nbytes
, buf
);
104 for (i
= nbytes
- 1, *time
= 0; i
>= 0; i
--)
105 *time
= (*time
<< 8) | buf
[i
];
110 static int ds1374_write_rtc(struct i2c_client
*client
, u32 time
,
121 for (i
= 0; i
< nbytes
; i
++) {
122 buf
[i
] = time
& 0xff;
126 return i2c_smbus_write_i2c_block_data(client
, reg
, nbytes
, buf
);
129 static int ds1374_check_rtc_status(struct i2c_client
*client
)
134 stat
= i2c_smbus_read_byte_data(client
, DS1374_REG_SR
);
138 if (stat
& DS1374_REG_SR_OSF
)
139 dev_warn(&client
->dev
,
140 "oscillator discontinuity flagged, time unreliable\n");
142 stat
&= ~(DS1374_REG_SR_OSF
| DS1374_REG_SR_AF
);
144 ret
= i2c_smbus_write_byte_data(client
, DS1374_REG_SR
, stat
);
148 /* If the alarm is pending, clear it before requesting
149 * the interrupt, so an interrupt event isn't reported
150 * before everything is initialized.
153 control
= i2c_smbus_read_byte_data(client
, DS1374_REG_CR
);
157 control
&= ~(DS1374_REG_CR_WACE
| DS1374_REG_CR_AIE
);
158 return i2c_smbus_write_byte_data(client
, DS1374_REG_CR
, control
);
161 static int ds1374_read_time(struct device
*dev
, struct rtc_time
*time
)
163 struct i2c_client
*client
= to_i2c_client(dev
);
167 ret
= ds1374_read_rtc(client
, &itime
, DS1374_REG_TOD0
, 4);
169 rtc_time_to_tm(itime
, time
);
174 static int ds1374_set_time(struct device
*dev
, struct rtc_time
*time
)
176 struct i2c_client
*client
= to_i2c_client(dev
);
179 rtc_tm_to_time(time
, &itime
);
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_time_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 rtc_tm_to_time(&alarm
->time
, &new_alarm
);
243 rtc_tm_to_time(&now
, &itime
);
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 *****************************************************************************
375 static struct i2c_client
*save_client
;
377 #define WD_TIMO 131762
379 #define DRV_NAME "DS1374 Watchdog"
381 static int wdt_margin
= WD_TIMO
;
382 static unsigned long wdt_is_open
;
383 module_param(wdt_margin
, int, 0);
384 MODULE_PARM_DESC(wdt_margin
, "Watchdog timeout in seconds (default 32s)");
386 static const struct watchdog_info ds1374_wdt_info
= {
387 .identity
= "DS1374 WTD",
388 .options
= WDIOF_SETTIMEOUT
| WDIOF_KEEPALIVEPING
|
392 static int ds1374_wdt_settimeout(unsigned int timeout
)
394 int ret
= -ENOIOCTLCMD
;
397 ret
= cr
= i2c_smbus_read_byte_data(save_client
, DS1374_REG_CR
);
401 /* Disable any existing watchdog/alarm before setting the new one */
402 cr
&= ~DS1374_REG_CR_WACE
;
404 ret
= i2c_smbus_write_byte_data(save_client
, DS1374_REG_CR
, cr
);
408 /* Set new watchdog time */
409 ret
= ds1374_write_rtc(save_client
, timeout
, DS1374_REG_WDALM0
, 3);
411 pr_info("couldn't set new watchdog time\n");
415 /* Enable watchdog timer */
416 cr
|= DS1374_REG_CR_WACE
| DS1374_REG_CR_WDALM
;
417 cr
&= ~DS1374_REG_CR_AIE
;
419 ret
= i2c_smbus_write_byte_data(save_client
, DS1374_REG_CR
, cr
);
430 * Reload the watchdog timer. (ie, pat the watchdog)
432 static void ds1374_wdt_ping(void)
437 ret
= ds1374_read_rtc(save_client
, &val
, DS1374_REG_WDALM0
, 3);
439 pr_info("WD TICK FAIL!!!!!!!!!! %i\n", ret
);
442 static void ds1374_wdt_disable(void)
444 int ret
= -ENOIOCTLCMD
;
447 cr
= i2c_smbus_read_byte_data(save_client
, DS1374_REG_CR
);
448 /* Disable watchdog timer */
449 cr
&= ~DS1374_REG_CR_WACE
;
451 ret
= i2c_smbus_write_byte_data(save_client
, DS1374_REG_CR
, cr
);
455 * Watchdog device is opened, and watchdog starts running.
457 static int ds1374_wdt_open(struct inode
*inode
, struct file
*file
)
459 struct ds1374
*ds1374
= i2c_get_clientdata(save_client
);
461 if (MINOR(inode
->i_rdev
) == WATCHDOG_MINOR
) {
462 mutex_lock(&ds1374
->mutex
);
463 if (test_and_set_bit(0, &wdt_is_open
)) {
464 mutex_unlock(&ds1374
->mutex
);
471 mutex_unlock(&ds1374
->mutex
);
472 return nonseekable_open(inode
, file
);
478 * Close the watchdog device.
480 static int ds1374_wdt_release(struct inode
*inode
, struct file
*file
)
482 if (MINOR(inode
->i_rdev
) == WATCHDOG_MINOR
)
483 clear_bit(0, &wdt_is_open
);
489 * Pat the watchdog whenever device is written to.
491 static ssize_t
ds1374_wdt_write(struct file
*file
, const char __user
*data
,
492 size_t len
, loff_t
*ppos
)
501 static ssize_t
ds1374_wdt_read(struct file
*file
, char __user
*data
,
502 size_t len
, loff_t
*ppos
)
508 * Handle commands from user-space.
510 static long ds1374_wdt_ioctl(struct file
*file
, unsigned int cmd
,
513 int new_margin
, options
;
516 case WDIOC_GETSUPPORT
:
517 return copy_to_user((struct watchdog_info __user
*)arg
,
518 &ds1374_wdt_info
, sizeof(ds1374_wdt_info
)) ? -EFAULT
: 0;
520 case WDIOC_GETSTATUS
:
521 case WDIOC_GETBOOTSTATUS
:
522 return put_user(0, (int __user
*)arg
);
523 case WDIOC_KEEPALIVE
:
526 case WDIOC_SETTIMEOUT
:
527 if (get_user(new_margin
, (int __user
*)arg
))
530 if (new_margin
< 1 || new_margin
> 16777216)
533 wdt_margin
= new_margin
;
534 ds1374_wdt_settimeout(new_margin
);
537 case WDIOC_GETTIMEOUT
:
538 return put_user(wdt_margin
, (int __user
*)arg
);
539 case WDIOC_SETOPTIONS
:
540 if (copy_from_user(&options
, (int __user
*)arg
, sizeof(int)))
543 if (options
& WDIOS_DISABLECARD
) {
544 pr_info("disable watchdog\n");
545 ds1374_wdt_disable();
548 if (options
& WDIOS_ENABLECARD
) {
549 pr_info("enable watchdog\n");
550 ds1374_wdt_settimeout(wdt_margin
);
559 static long ds1374_wdt_unlocked_ioctl(struct file
*file
, unsigned int cmd
,
563 struct ds1374
*ds1374
= i2c_get_clientdata(save_client
);
565 mutex_lock(&ds1374
->mutex
);
566 ret
= ds1374_wdt_ioctl(file
, cmd
, arg
);
567 mutex_unlock(&ds1374
->mutex
);
572 static int ds1374_wdt_notify_sys(struct notifier_block
*this,
573 unsigned long code
, void *unused
)
575 if (code
== SYS_DOWN
|| code
== SYS_HALT
)
576 /* Disable Watchdog */
577 ds1374_wdt_disable();
581 static const struct file_operations ds1374_wdt_fops
= {
582 .owner
= THIS_MODULE
,
583 .read
= ds1374_wdt_read
,
584 .unlocked_ioctl
= ds1374_wdt_unlocked_ioctl
,
585 .write
= ds1374_wdt_write
,
586 .open
= ds1374_wdt_open
,
587 .release
= ds1374_wdt_release
,
591 static struct miscdevice ds1374_miscdev
= {
592 .minor
= WATCHDOG_MINOR
,
594 .fops
= &ds1374_wdt_fops
,
597 static struct notifier_block ds1374_wdt_notifier
= {
598 .notifier_call
= ds1374_wdt_notify_sys
,
601 #endif /*CONFIG_RTC_DRV_DS1374_WDT*/
603 *****************************************************************************
607 *****************************************************************************
609 static int ds1374_probe(struct i2c_client
*client
,
610 const struct i2c_device_id
*id
)
612 struct ds1374
*ds1374
;
615 ds1374
= devm_kzalloc(&client
->dev
, sizeof(struct ds1374
), GFP_KERNEL
);
619 ds1374
->client
= client
;
620 i2c_set_clientdata(client
, ds1374
);
622 INIT_WORK(&ds1374
->work
, ds1374_work
);
623 mutex_init(&ds1374
->mutex
);
625 ret
= ds1374_check_rtc_status(client
);
629 if (client
->irq
> 0) {
630 ret
= devm_request_irq(&client
->dev
, client
->irq
, ds1374_irq
, 0,
633 dev_err(&client
->dev
, "unable to request IRQ\n");
637 device_set_wakeup_capable(&client
->dev
, 1);
640 ds1374
->rtc
= devm_rtc_device_register(&client
->dev
, client
->name
,
641 &ds1374_rtc_ops
, THIS_MODULE
);
642 if (IS_ERR(ds1374
->rtc
)) {
643 dev_err(&client
->dev
, "unable to register the class device\n");
644 return PTR_ERR(ds1374
->rtc
);
647 #ifdef CONFIG_RTC_DRV_DS1374_WDT
648 save_client
= client
;
649 ret
= misc_register(&ds1374_miscdev
);
652 ret
= register_reboot_notifier(&ds1374_wdt_notifier
);
654 misc_deregister(&ds1374_miscdev
);
657 ds1374_wdt_settimeout(131072);
663 static int ds1374_remove(struct i2c_client
*client
)
665 struct ds1374
*ds1374
= i2c_get_clientdata(client
);
666 #ifdef CONFIG_RTC_DRV_DS1374_WDT
667 misc_deregister(&ds1374_miscdev
);
668 ds1374_miscdev
.parent
= NULL
;
669 unregister_reboot_notifier(&ds1374_wdt_notifier
);
672 if (client
->irq
> 0) {
673 mutex_lock(&ds1374
->mutex
);
675 mutex_unlock(&ds1374
->mutex
);
677 devm_free_irq(&client
->dev
, client
->irq
, client
);
678 cancel_work_sync(&ds1374
->work
);
684 #ifdef CONFIG_PM_SLEEP
685 static int ds1374_suspend(struct device
*dev
)
687 struct i2c_client
*client
= to_i2c_client(dev
);
689 if (client
->irq
> 0 && device_may_wakeup(&client
->dev
))
690 enable_irq_wake(client
->irq
);
694 static int ds1374_resume(struct device
*dev
)
696 struct i2c_client
*client
= to_i2c_client(dev
);
698 if (client
->irq
> 0 && device_may_wakeup(&client
->dev
))
699 disable_irq_wake(client
->irq
);
704 static SIMPLE_DEV_PM_OPS(ds1374_pm
, ds1374_suspend
, ds1374_resume
);
706 static struct i2c_driver ds1374_driver
= {
708 .name
= "rtc-ds1374",
711 .probe
= ds1374_probe
,
712 .remove
= ds1374_remove
,
713 .id_table
= ds1374_id
,
716 module_i2c_driver(ds1374_driver
);
718 MODULE_AUTHOR("Scott Wood <scottwood@freescale.com>");
719 MODULE_DESCRIPTION("Maxim/Dallas DS1374 RTC Driver");
720 MODULE_LICENSE("GPL");