2 * RTC driver for the Micro Crystal RV8803
4 * Copyright (C) 2015 Micro Crystal SA
6 * Alexandre Belloni <alexandre.belloni@free-electrons.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
14 #include <linux/bcd.h>
15 #include <linux/bitops.h>
16 #include <linux/log2.h>
17 #include <linux/i2c.h>
18 #include <linux/interrupt.h>
19 #include <linux/kernel.h>
20 #include <linux/module.h>
21 #include <linux/of_device.h>
22 #include <linux/rtc.h>
24 #define RV8803_I2C_TRY_COUNT 4
26 #define RV8803_SEC 0x00
27 #define RV8803_MIN 0x01
28 #define RV8803_HOUR 0x02
29 #define RV8803_WEEK 0x03
30 #define RV8803_DAY 0x04
31 #define RV8803_MONTH 0x05
32 #define RV8803_YEAR 0x06
33 #define RV8803_RAM 0x07
34 #define RV8803_ALARM_MIN 0x08
35 #define RV8803_ALARM_HOUR 0x09
36 #define RV8803_ALARM_WEEK_OR_DAY 0x0A
37 #define RV8803_EXT 0x0D
38 #define RV8803_FLAG 0x0E
39 #define RV8803_CTRL 0x0F
41 #define RV8803_EXT_WADA BIT(6)
43 #define RV8803_FLAG_V1F BIT(0)
44 #define RV8803_FLAG_V2F BIT(1)
45 #define RV8803_FLAG_AF BIT(3)
46 #define RV8803_FLAG_TF BIT(4)
47 #define RV8803_FLAG_UF BIT(5)
49 #define RV8803_CTRL_RESET BIT(0)
51 #define RV8803_CTRL_EIE BIT(2)
52 #define RV8803_CTRL_AIE BIT(3)
53 #define RV8803_CTRL_TIE BIT(4)
54 #define RV8803_CTRL_UIE BIT(5)
56 #define RX8900_BACKUP_CTRL 0x18
57 #define RX8900_FLAG_SWOFF BIT(2)
58 #define RX8900_FLAG_VDETOFF BIT(3)
66 struct i2c_client
*client
;
67 struct rtc_device
*rtc
;
68 struct mutex flags_lock
;
70 enum rv8803_type type
;
73 static int rv8803_read_reg(const struct i2c_client
*client
, u8 reg
)
75 int try = RV8803_I2C_TRY_COUNT
;
79 * There is a 61µs window during which the RTC does not acknowledge I2C
80 * transfers. In that case, ensure that there are multiple attempts.
83 ret
= i2c_smbus_read_byte_data(client
, reg
);
84 while ((ret
== -ENXIO
|| ret
== -EIO
) && --try);
86 dev_err(&client
->dev
, "Unable to read register 0x%02x\n", reg
);
91 static int rv8803_read_regs(const struct i2c_client
*client
,
92 u8 reg
, u8 count
, u8
*values
)
94 int try = RV8803_I2C_TRY_COUNT
;
98 ret
= i2c_smbus_read_i2c_block_data(client
, reg
, count
, values
);
99 while ((ret
== -ENXIO
|| ret
== -EIO
) && --try);
101 dev_err(&client
->dev
,
102 "Unable to read registers 0x%02x..0x%02x\n",
103 reg
, reg
+ count
- 1);
104 return ret
< 0 ? ret
: -EIO
;
110 static int rv8803_write_reg(const struct i2c_client
*client
, u8 reg
, u8 value
)
112 int try = RV8803_I2C_TRY_COUNT
;
116 ret
= i2c_smbus_write_byte_data(client
, reg
, value
);
117 while ((ret
== -ENXIO
|| ret
== -EIO
) && --try);
119 dev_err(&client
->dev
, "Unable to write register 0x%02x\n", reg
);
124 static int rv8803_write_regs(const struct i2c_client
*client
,
125 u8 reg
, u8 count
, const u8
*values
)
127 int try = RV8803_I2C_TRY_COUNT
;
131 ret
= i2c_smbus_write_i2c_block_data(client
, reg
, count
,
133 while ((ret
== -ENXIO
|| ret
== -EIO
) && --try);
135 dev_err(&client
->dev
,
136 "Unable to write registers 0x%02x..0x%02x\n",
137 reg
, reg
+ count
- 1);
142 static irqreturn_t
rv8803_handle_irq(int irq
, void *dev_id
)
144 struct i2c_client
*client
= dev_id
;
145 struct rv8803_data
*rv8803
= i2c_get_clientdata(client
);
146 unsigned long events
= 0;
149 mutex_lock(&rv8803
->flags_lock
);
151 flags
= rv8803_read_reg(client
, RV8803_FLAG
);
153 mutex_unlock(&rv8803
->flags_lock
);
157 if (flags
& RV8803_FLAG_V1F
)
158 dev_warn(&client
->dev
, "Voltage low, temperature compensation stopped.\n");
160 if (flags
& RV8803_FLAG_V2F
)
161 dev_warn(&client
->dev
, "Voltage low, data loss detected.\n");
163 if (flags
& RV8803_FLAG_TF
) {
164 flags
&= ~RV8803_FLAG_TF
;
165 rv8803
->ctrl
&= ~RV8803_CTRL_TIE
;
169 if (flags
& RV8803_FLAG_AF
) {
170 flags
&= ~RV8803_FLAG_AF
;
171 rv8803
->ctrl
&= ~RV8803_CTRL_AIE
;
175 if (flags
& RV8803_FLAG_UF
) {
176 flags
&= ~RV8803_FLAG_UF
;
177 rv8803
->ctrl
&= ~RV8803_CTRL_UIE
;
182 rtc_update_irq(rv8803
->rtc
, 1, events
);
183 rv8803_write_reg(client
, RV8803_FLAG
, flags
);
184 rv8803_write_reg(rv8803
->client
, RV8803_CTRL
, rv8803
->ctrl
);
187 mutex_unlock(&rv8803
->flags_lock
);
192 static int rv8803_get_time(struct device
*dev
, struct rtc_time
*tm
)
194 struct rv8803_data
*rv8803
= dev_get_drvdata(dev
);
200 flags
= rv8803_read_reg(rv8803
->client
, RV8803_FLAG
);
204 if (flags
& RV8803_FLAG_V2F
) {
205 dev_warn(dev
, "Voltage low, data is invalid.\n");
209 ret
= rv8803_read_regs(rv8803
->client
, RV8803_SEC
, 7, date
);
213 if ((date1
[RV8803_SEC
] & 0x7f) == bin2bcd(59)) {
214 ret
= rv8803_read_regs(rv8803
->client
, RV8803_SEC
, 7, date2
);
218 if ((date2
[RV8803_SEC
] & 0x7f) != bin2bcd(59))
222 tm
->tm_sec
= bcd2bin(date
[RV8803_SEC
] & 0x7f);
223 tm
->tm_min
= bcd2bin(date
[RV8803_MIN
] & 0x7f);
224 tm
->tm_hour
= bcd2bin(date
[RV8803_HOUR
] & 0x3f);
225 tm
->tm_wday
= ilog2(date
[RV8803_WEEK
] & 0x7f);
226 tm
->tm_mday
= bcd2bin(date
[RV8803_DAY
] & 0x3f);
227 tm
->tm_mon
= bcd2bin(date
[RV8803_MONTH
] & 0x1f) - 1;
228 tm
->tm_year
= bcd2bin(date
[RV8803_YEAR
]) + 100;
233 static int rv8803_set_time(struct device
*dev
, struct rtc_time
*tm
)
235 struct rv8803_data
*rv8803
= dev_get_drvdata(dev
);
237 int ctrl
, flags
, ret
;
239 if ((tm
->tm_year
< 100) || (tm
->tm_year
> 199))
242 ctrl
= rv8803_read_reg(rv8803
->client
, RV8803_CTRL
);
247 ret
= rv8803_write_reg(rv8803
->client
, RV8803_CTRL
,
248 ctrl
| RV8803_CTRL_RESET
);
252 date
[RV8803_SEC
] = bin2bcd(tm
->tm_sec
);
253 date
[RV8803_MIN
] = bin2bcd(tm
->tm_min
);
254 date
[RV8803_HOUR
] = bin2bcd(tm
->tm_hour
);
255 date
[RV8803_WEEK
] = 1 << (tm
->tm_wday
);
256 date
[RV8803_DAY
] = bin2bcd(tm
->tm_mday
);
257 date
[RV8803_MONTH
] = bin2bcd(tm
->tm_mon
+ 1);
258 date
[RV8803_YEAR
] = bin2bcd(tm
->tm_year
- 100);
260 ret
= rv8803_write_regs(rv8803
->client
, RV8803_SEC
, 7, date
);
264 /* Restart the clock */
265 ret
= rv8803_write_reg(rv8803
->client
, RV8803_CTRL
,
266 ctrl
& ~RV8803_CTRL_RESET
);
270 mutex_lock(&rv8803
->flags_lock
);
272 flags
= rv8803_read_reg(rv8803
->client
, RV8803_FLAG
);
274 mutex_unlock(&rv8803
->flags_lock
);
278 ret
= rv8803_write_reg(rv8803
->client
, RV8803_FLAG
,
279 flags
& ~(RV8803_FLAG_V1F
| RV8803_FLAG_V2F
));
281 mutex_unlock(&rv8803
->flags_lock
);
286 static int rv8803_get_alarm(struct device
*dev
, struct rtc_wkalrm
*alrm
)
288 struct rv8803_data
*rv8803
= dev_get_drvdata(dev
);
289 struct i2c_client
*client
= rv8803
->client
;
293 ret
= rv8803_read_regs(client
, RV8803_ALARM_MIN
, 3, alarmvals
);
297 flags
= rv8803_read_reg(client
, RV8803_FLAG
);
301 alrm
->time
.tm_sec
= 0;
302 alrm
->time
.tm_min
= bcd2bin(alarmvals
[0] & 0x7f);
303 alrm
->time
.tm_hour
= bcd2bin(alarmvals
[1] & 0x3f);
304 alrm
->time
.tm_mday
= bcd2bin(alarmvals
[2] & 0x3f);
306 alrm
->enabled
= !!(rv8803
->ctrl
& RV8803_CTRL_AIE
);
307 alrm
->pending
= (flags
& RV8803_FLAG_AF
) && alrm
->enabled
;
312 static int rv8803_set_alarm(struct device
*dev
, struct rtc_wkalrm
*alrm
)
314 struct i2c_client
*client
= to_i2c_client(dev
);
315 struct rv8803_data
*rv8803
= dev_get_drvdata(dev
);
320 /* The alarm has no seconds, round up to nearest minute */
321 if (alrm
->time
.tm_sec
) {
322 time64_t alarm_time
= rtc_tm_to_time64(&alrm
->time
);
324 alarm_time
+= 60 - alrm
->time
.tm_sec
;
325 rtc_time64_to_tm(alarm_time
, &alrm
->time
);
328 mutex_lock(&rv8803
->flags_lock
);
330 ret
= rv8803_read_regs(client
, RV8803_FLAG
, 2, ctrl
);
332 mutex_unlock(&rv8803
->flags_lock
);
336 alarmvals
[0] = bin2bcd(alrm
->time
.tm_min
);
337 alarmvals
[1] = bin2bcd(alrm
->time
.tm_hour
);
338 alarmvals
[2] = bin2bcd(alrm
->time
.tm_mday
);
340 if (rv8803
->ctrl
& (RV8803_CTRL_AIE
| RV8803_CTRL_UIE
)) {
341 rv8803
->ctrl
&= ~(RV8803_CTRL_AIE
| RV8803_CTRL_UIE
);
342 err
= rv8803_write_reg(rv8803
->client
, RV8803_CTRL
,
345 mutex_unlock(&rv8803
->flags_lock
);
350 ctrl
[1] &= ~RV8803_FLAG_AF
;
351 err
= rv8803_write_reg(rv8803
->client
, RV8803_FLAG
, ctrl
[1]);
352 mutex_unlock(&rv8803
->flags_lock
);
356 err
= rv8803_write_regs(rv8803
->client
, RV8803_ALARM_MIN
, 3, alarmvals
);
361 if (rv8803
->rtc
->uie_rtctimer
.enabled
)
362 rv8803
->ctrl
|= RV8803_CTRL_UIE
;
363 if (rv8803
->rtc
->aie_timer
.enabled
)
364 rv8803
->ctrl
|= RV8803_CTRL_AIE
;
366 err
= rv8803_write_reg(rv8803
->client
, RV8803_CTRL
,
375 static int rv8803_alarm_irq_enable(struct device
*dev
, unsigned int enabled
)
377 struct i2c_client
*client
= to_i2c_client(dev
);
378 struct rv8803_data
*rv8803
= dev_get_drvdata(dev
);
379 int ctrl
, flags
, err
;
384 if (rv8803
->rtc
->uie_rtctimer
.enabled
)
385 ctrl
|= RV8803_CTRL_UIE
;
386 if (rv8803
->rtc
->aie_timer
.enabled
)
387 ctrl
|= RV8803_CTRL_AIE
;
389 if (!rv8803
->rtc
->uie_rtctimer
.enabled
)
390 ctrl
&= ~RV8803_CTRL_UIE
;
391 if (!rv8803
->rtc
->aie_timer
.enabled
)
392 ctrl
&= ~RV8803_CTRL_AIE
;
395 mutex_lock(&rv8803
->flags_lock
);
396 flags
= rv8803_read_reg(client
, RV8803_FLAG
);
398 mutex_unlock(&rv8803
->flags_lock
);
401 flags
&= ~(RV8803_FLAG_AF
| RV8803_FLAG_UF
);
402 err
= rv8803_write_reg(client
, RV8803_FLAG
, flags
);
403 mutex_unlock(&rv8803
->flags_lock
);
407 if (ctrl
!= rv8803
->ctrl
) {
409 err
= rv8803_write_reg(client
, RV8803_CTRL
, rv8803
->ctrl
);
417 static int rv8803_ioctl(struct device
*dev
, unsigned int cmd
, unsigned long arg
)
419 struct i2c_client
*client
= to_i2c_client(dev
);
420 struct rv8803_data
*rv8803
= dev_get_drvdata(dev
);
425 flags
= rv8803_read_reg(client
, RV8803_FLAG
);
429 if (flags
& RV8803_FLAG_V1F
)
430 dev_warn(&client
->dev
, "Voltage low, temperature compensation stopped.\n");
432 if (flags
& RV8803_FLAG_V2F
)
433 dev_warn(&client
->dev
, "Voltage low, data loss detected.\n");
435 flags
&= RV8803_FLAG_V1F
| RV8803_FLAG_V2F
;
437 if (copy_to_user((void __user
*)arg
, &flags
, sizeof(int)))
443 mutex_lock(&rv8803
->flags_lock
);
444 flags
= rv8803_read_reg(client
, RV8803_FLAG
);
446 mutex_unlock(&rv8803
->flags_lock
);
450 flags
&= ~(RV8803_FLAG_V1F
| RV8803_FLAG_V2F
);
451 ret
= rv8803_write_reg(client
, RV8803_FLAG
, flags
);
452 mutex_unlock(&rv8803
->flags_lock
);
463 static ssize_t
rv8803_nvram_write(struct file
*filp
, struct kobject
*kobj
,
464 struct bin_attribute
*attr
,
465 char *buf
, loff_t off
, size_t count
)
467 struct device
*dev
= kobj_to_dev(kobj
);
468 struct i2c_client
*client
= to_i2c_client(dev
);
471 ret
= rv8803_write_reg(client
, RV8803_RAM
, buf
[0]);
478 static ssize_t
rv8803_nvram_read(struct file
*filp
, struct kobject
*kobj
,
479 struct bin_attribute
*attr
,
480 char *buf
, loff_t off
, size_t count
)
482 struct device
*dev
= kobj_to_dev(kobj
);
483 struct i2c_client
*client
= to_i2c_client(dev
);
486 ret
= rv8803_read_reg(client
, RV8803_RAM
);
495 static struct bin_attribute rv8803_nvram_attr
= {
498 .mode
= S_IRUGO
| S_IWUSR
,
501 .read
= rv8803_nvram_read
,
502 .write
= rv8803_nvram_write
,
505 static struct rtc_class_ops rv8803_rtc_ops
= {
506 .read_time
= rv8803_get_time
,
507 .set_time
= rv8803_set_time
,
508 .ioctl
= rv8803_ioctl
,
511 static int rx8900_trickle_charger_init(struct rv8803_data
*rv8803
)
513 struct i2c_client
*client
= rv8803
->client
;
514 struct device_node
*node
= client
->dev
.of_node
;
521 if (rv8803
->type
!= rx_8900
)
524 err
= i2c_smbus_read_byte_data(rv8803
->client
, RX8900_BACKUP_CTRL
);
528 flags
= ~(RX8900_FLAG_VDETOFF
| RX8900_FLAG_SWOFF
) & (u8
)err
;
530 if (of_property_read_bool(node
, "epson,vdet-disable"))
531 flags
|= RX8900_FLAG_VDETOFF
;
533 if (of_property_read_bool(node
, "trickle-diode-disable"))
534 flags
|= RX8900_FLAG_SWOFF
;
536 return i2c_smbus_write_byte_data(rv8803
->client
, RX8900_BACKUP_CTRL
,
540 static int rv8803_probe(struct i2c_client
*client
,
541 const struct i2c_device_id
*id
)
543 struct i2c_adapter
*adapter
= to_i2c_adapter(client
->dev
.parent
);
544 struct rv8803_data
*rv8803
;
547 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
|
548 I2C_FUNC_SMBUS_I2C_BLOCK
)) {
549 dev_err(&adapter
->dev
, "doesn't support I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_I2C_BLOCK\n");
553 rv8803
= devm_kzalloc(&client
->dev
, sizeof(struct rv8803_data
),
558 mutex_init(&rv8803
->flags_lock
);
559 rv8803
->client
= client
;
560 if (client
->dev
.of_node
)
561 rv8803
->type
= (enum rv8803_type
)
562 of_device_get_match_data(&client
->dev
);
564 rv8803
->type
= id
->driver_data
;
565 i2c_set_clientdata(client
, rv8803
);
567 flags
= rv8803_read_reg(client
, RV8803_FLAG
);
571 if (flags
& RV8803_FLAG_V1F
)
572 dev_warn(&client
->dev
, "Voltage low, temperature compensation stopped.\n");
574 if (flags
& RV8803_FLAG_V2F
)
575 dev_warn(&client
->dev
, "Voltage low, data loss detected.\n");
577 if (flags
& RV8803_FLAG_AF
)
578 dev_warn(&client
->dev
, "An alarm maybe have been missed.\n");
580 if (client
->irq
> 0) {
581 err
= devm_request_threaded_irq(&client
->dev
, client
->irq
,
582 NULL
, rv8803_handle_irq
,
583 IRQF_TRIGGER_LOW
| IRQF_ONESHOT
,
586 dev_warn(&client
->dev
, "unable to request IRQ, alarms disabled\n");
589 rv8803_rtc_ops
.read_alarm
= rv8803_get_alarm
;
590 rv8803_rtc_ops
.set_alarm
= rv8803_set_alarm
;
591 rv8803_rtc_ops
.alarm_irq_enable
= rv8803_alarm_irq_enable
;
595 rv8803
->rtc
= devm_rtc_device_register(&client
->dev
, client
->name
,
596 &rv8803_rtc_ops
, THIS_MODULE
);
597 if (IS_ERR(rv8803
->rtc
)) {
598 dev_err(&client
->dev
, "unable to register the class device\n");
599 return PTR_ERR(rv8803
->rtc
);
602 err
= rv8803_write_reg(rv8803
->client
, RV8803_EXT
, RV8803_EXT_WADA
);
606 err
= rx8900_trickle_charger_init(rv8803
);
608 dev_err(&client
->dev
, "failed to init charger\n");
612 err
= device_create_bin_file(&client
->dev
, &rv8803_nvram_attr
);
616 rv8803
->rtc
->max_user_freq
= 1;
621 static int rv8803_remove(struct i2c_client
*client
)
623 device_remove_bin_file(&client
->dev
, &rv8803_nvram_attr
);
628 static const struct i2c_device_id rv8803_id
[] = {
629 { "rv8803", rv_8803
},
630 { "rx8900", rx_8900
},
633 MODULE_DEVICE_TABLE(i2c
, rv8803_id
);
635 static const struct of_device_id rv8803_of_match
[] = {
637 .compatible
= "microcrystal,rv8803",
638 .data
= (void *)rx_8900
641 .compatible
= "epson,rx8900",
642 .data
= (void *)rx_8900
646 MODULE_DEVICE_TABLE(of
, rv8803_of_match
);
648 static struct i2c_driver rv8803_driver
= {
650 .name
= "rtc-rv8803",
651 .of_match_table
= of_match_ptr(rv8803_of_match
),
653 .probe
= rv8803_probe
,
654 .remove
= rv8803_remove
,
655 .id_table
= rv8803_id
,
657 module_i2c_driver(rv8803_driver
);
659 MODULE_AUTHOR("Alexandre Belloni <alexandre.belloni@free-electrons.com>");
660 MODULE_DESCRIPTION("Micro Crystal RV8803 RTC driver");
661 MODULE_LICENSE("GPL v2");