1 // SPDX-License-Identifier: GPL-2.0
3 * RTC driver for the Micro Crystal RV3028
5 * Copyright (C) 2019 Micro Crystal SA
7 * Alexandre Belloni <alexandre.belloni@bootlin.com>
11 #include <linux/clk-provider.h>
12 #include <linux/bcd.h>
13 #include <linux/bitops.h>
14 #include <linux/i2c.h>
15 #include <linux/interrupt.h>
16 #include <linux/kernel.h>
17 #include <linux/log2.h>
18 #include <linux/module.h>
19 #include <linux/of_device.h>
20 #include <linux/regmap.h>
21 #include <linux/rtc.h>
23 #define RV3028_SEC 0x00
24 #define RV3028_MIN 0x01
25 #define RV3028_HOUR 0x02
26 #define RV3028_WDAY 0x03
27 #define RV3028_DAY 0x04
28 #define RV3028_MONTH 0x05
29 #define RV3028_YEAR 0x06
30 #define RV3028_ALARM_MIN 0x07
31 #define RV3028_ALARM_HOUR 0x08
32 #define RV3028_ALARM_DAY 0x09
33 #define RV3028_STATUS 0x0E
34 #define RV3028_CTRL1 0x0F
35 #define RV3028_CTRL2 0x10
36 #define RV3028_EVT_CTRL 0x13
37 #define RV3028_TS_COUNT 0x14
38 #define RV3028_TS_SEC 0x15
39 #define RV3028_RAM1 0x1F
40 #define RV3028_EEPROM_ADDR 0x25
41 #define RV3028_EEPROM_DATA 0x26
42 #define RV3028_EEPROM_CMD 0x27
43 #define RV3028_CLKOUT 0x35
44 #define RV3028_OFFSET 0x36
45 #define RV3028_BACKUP 0x37
47 #define RV3028_STATUS_PORF BIT(0)
48 #define RV3028_STATUS_EVF BIT(1)
49 #define RV3028_STATUS_AF BIT(2)
50 #define RV3028_STATUS_TF BIT(3)
51 #define RV3028_STATUS_UF BIT(4)
52 #define RV3028_STATUS_BSF BIT(5)
53 #define RV3028_STATUS_CLKF BIT(6)
54 #define RV3028_STATUS_EEBUSY BIT(7)
56 #define RV3028_CLKOUT_FD_MASK GENMASK(2, 0)
57 #define RV3028_CLKOUT_PORIE BIT(3)
58 #define RV3028_CLKOUT_CLKSY BIT(6)
59 #define RV3028_CLKOUT_CLKOE BIT(7)
61 #define RV3028_CTRL1_EERD BIT(3)
62 #define RV3028_CTRL1_WADA BIT(5)
64 #define RV3028_CTRL2_RESET BIT(0)
65 #define RV3028_CTRL2_12_24 BIT(1)
66 #define RV3028_CTRL2_EIE BIT(2)
67 #define RV3028_CTRL2_AIE BIT(3)
68 #define RV3028_CTRL2_TIE BIT(4)
69 #define RV3028_CTRL2_UIE BIT(5)
70 #define RV3028_CTRL2_TSE BIT(7)
72 #define RV3028_EVT_CTRL_TSR BIT(2)
74 #define RV3028_EEPROM_CMD_UPDATE 0x11
75 #define RV3028_EEPROM_CMD_WRITE 0x21
76 #define RV3028_EEPROM_CMD_READ 0x22
78 #define RV3028_EEBUSY_POLL 10000
79 #define RV3028_EEBUSY_TIMEOUT 100000
81 #define RV3028_BACKUP_TCE BIT(5)
82 #define RV3028_BACKUP_TCR_MASK GENMASK(1,0)
84 #define OFFSET_STEP_PPT 953674
91 struct regmap
*regmap
;
92 struct rtc_device
*rtc
;
93 enum rv3028_type type
;
94 #ifdef CONFIG_COMMON_CLK
95 struct clk_hw clkout_hw
;
99 static u16 rv3028_trickle_resistors
[] = {3000, 5000, 9000, 15000};
101 static ssize_t
timestamp0_store(struct device
*dev
,
102 struct device_attribute
*attr
,
103 const char *buf
, size_t count
)
105 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
->parent
);
107 regmap_update_bits(rv3028
->regmap
, RV3028_EVT_CTRL
, RV3028_EVT_CTRL_TSR
,
108 RV3028_EVT_CTRL_TSR
);
113 static ssize_t
timestamp0_show(struct device
*dev
,
114 struct device_attribute
*attr
, char *buf
)
116 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
->parent
);
121 ret
= regmap_read(rv3028
->regmap
, RV3028_TS_COUNT
, &count
);
128 ret
= regmap_bulk_read(rv3028
->regmap
, RV3028_TS_SEC
, date
,
133 tm
.tm_sec
= bcd2bin(date
[0]);
134 tm
.tm_min
= bcd2bin(date
[1]);
135 tm
.tm_hour
= bcd2bin(date
[2]);
136 tm
.tm_mday
= bcd2bin(date
[3]);
137 tm
.tm_mon
= bcd2bin(date
[4]) - 1;
138 tm
.tm_year
= bcd2bin(date
[5]) + 100;
140 ret
= rtc_valid_tm(&tm
);
144 return sprintf(buf
, "%llu\n",
145 (unsigned long long)rtc_tm_to_time64(&tm
));
148 static DEVICE_ATTR_RW(timestamp0
);
150 static ssize_t
timestamp0_count_show(struct device
*dev
,
151 struct device_attribute
*attr
, char *buf
)
153 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
->parent
);
156 ret
= regmap_read(rv3028
->regmap
, RV3028_TS_COUNT
, &count
);
160 return sprintf(buf
, "%u\n", count
);
163 static DEVICE_ATTR_RO(timestamp0_count
);
165 static struct attribute
*rv3028_attrs
[] = {
166 &dev_attr_timestamp0
.attr
,
167 &dev_attr_timestamp0_count
.attr
,
171 static const struct attribute_group rv3028_attr_group
= {
172 .attrs
= rv3028_attrs
,
175 static int rv3028_exit_eerd(struct rv3028_data
*rv3028
, u32 eerd
)
180 return regmap_update_bits(rv3028
->regmap
, RV3028_CTRL1
, RV3028_CTRL1_EERD
, 0);
183 static int rv3028_enter_eerd(struct rv3028_data
*rv3028
, u32
*eerd
)
188 ret
= regmap_read(rv3028
->regmap
, RV3028_CTRL1
, &ctrl1
);
192 *eerd
= ctrl1
& RV3028_CTRL1_EERD
;
196 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_CTRL1
,
197 RV3028_CTRL1_EERD
, RV3028_CTRL1_EERD
);
201 ret
= regmap_read_poll_timeout(rv3028
->regmap
, RV3028_STATUS
, status
,
202 !(status
& RV3028_STATUS_EEBUSY
),
203 RV3028_EEBUSY_POLL
, RV3028_EEBUSY_TIMEOUT
);
205 rv3028_exit_eerd(rv3028
, *eerd
);
213 static int rv3028_update_eeprom(struct rv3028_data
*rv3028
, u32 eerd
)
218 ret
= regmap_write(rv3028
->regmap
, RV3028_EEPROM_CMD
, 0x0);
222 ret
= regmap_write(rv3028
->regmap
, RV3028_EEPROM_CMD
, RV3028_EEPROM_CMD_UPDATE
);
226 usleep_range(63000, RV3028_EEBUSY_TIMEOUT
);
228 ret
= regmap_read_poll_timeout(rv3028
->regmap
, RV3028_STATUS
, status
,
229 !(status
& RV3028_STATUS_EEBUSY
),
230 RV3028_EEBUSY_POLL
, RV3028_EEBUSY_TIMEOUT
);
233 rv3028_exit_eerd(rv3028
, eerd
);
238 static int rv3028_update_cfg(struct rv3028_data
*rv3028
, unsigned int reg
,
239 unsigned int mask
, unsigned int val
)
244 ret
= rv3028_enter_eerd(rv3028
, &eerd
);
248 ret
= regmap_update_bits(rv3028
->regmap
, reg
, mask
, val
);
250 rv3028_exit_eerd(rv3028
, eerd
);
254 return rv3028_update_eeprom(rv3028
, eerd
);
257 static irqreturn_t
rv3028_handle_irq(int irq
, void *dev_id
)
259 struct rv3028_data
*rv3028
= dev_id
;
260 unsigned long events
= 0;
261 u32 status
= 0, ctrl
= 0;
263 if (regmap_read(rv3028
->regmap
, RV3028_STATUS
, &status
) < 0 ||
268 if (status
& RV3028_STATUS_PORF
)
269 dev_warn(&rv3028
->rtc
->dev
, "Voltage low, data loss detected.\n");
271 if (status
& RV3028_STATUS_TF
) {
272 status
|= RV3028_STATUS_TF
;
273 ctrl
|= RV3028_CTRL2_TIE
;
277 if (status
& RV3028_STATUS_AF
) {
278 status
|= RV3028_STATUS_AF
;
279 ctrl
|= RV3028_CTRL2_AIE
;
283 if (status
& RV3028_STATUS_UF
) {
284 status
|= RV3028_STATUS_UF
;
285 ctrl
|= RV3028_CTRL2_UIE
;
290 rtc_update_irq(rv3028
->rtc
, 1, events
);
291 regmap_update_bits(rv3028
->regmap
, RV3028_STATUS
, status
, 0);
292 regmap_update_bits(rv3028
->regmap
, RV3028_CTRL2
, ctrl
, 0);
295 if (status
& RV3028_STATUS_EVF
) {
296 sysfs_notify(&rv3028
->rtc
->dev
.kobj
, NULL
,
297 dev_attr_timestamp0
.attr
.name
);
298 dev_warn(&rv3028
->rtc
->dev
, "event detected");
304 static int rv3028_get_time(struct device
*dev
, struct rtc_time
*tm
)
306 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
);
310 ret
= regmap_read(rv3028
->regmap
, RV3028_STATUS
, &status
);
314 if (status
& RV3028_STATUS_PORF
) {
315 dev_warn(dev
, "Voltage low, data is invalid.\n");
319 ret
= regmap_bulk_read(rv3028
->regmap
, RV3028_SEC
, date
, sizeof(date
));
323 tm
->tm_sec
= bcd2bin(date
[RV3028_SEC
] & 0x7f);
324 tm
->tm_min
= bcd2bin(date
[RV3028_MIN
] & 0x7f);
325 tm
->tm_hour
= bcd2bin(date
[RV3028_HOUR
] & 0x3f);
326 tm
->tm_wday
= ilog2(date
[RV3028_WDAY
] & 0x7f);
327 tm
->tm_mday
= bcd2bin(date
[RV3028_DAY
] & 0x3f);
328 tm
->tm_mon
= bcd2bin(date
[RV3028_MONTH
] & 0x1f) - 1;
329 tm
->tm_year
= bcd2bin(date
[RV3028_YEAR
]) + 100;
334 static int rv3028_set_time(struct device
*dev
, struct rtc_time
*tm
)
336 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
);
340 date
[RV3028_SEC
] = bin2bcd(tm
->tm_sec
);
341 date
[RV3028_MIN
] = bin2bcd(tm
->tm_min
);
342 date
[RV3028_HOUR
] = bin2bcd(tm
->tm_hour
);
343 date
[RV3028_WDAY
] = 1 << (tm
->tm_wday
);
344 date
[RV3028_DAY
] = bin2bcd(tm
->tm_mday
);
345 date
[RV3028_MONTH
] = bin2bcd(tm
->tm_mon
+ 1);
346 date
[RV3028_YEAR
] = bin2bcd(tm
->tm_year
- 100);
349 * Writing to the Seconds register has the same effect as setting RESET
352 ret
= regmap_bulk_write(rv3028
->regmap
, RV3028_SEC
, date
,
357 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_STATUS
,
358 RV3028_STATUS_PORF
, 0);
363 static int rv3028_get_alarm(struct device
*dev
, struct rtc_wkalrm
*alrm
)
365 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
);
367 int status
, ctrl
, ret
;
369 ret
= regmap_bulk_read(rv3028
->regmap
, RV3028_ALARM_MIN
, alarmvals
,
374 ret
= regmap_read(rv3028
->regmap
, RV3028_STATUS
, &status
);
378 ret
= regmap_read(rv3028
->regmap
, RV3028_CTRL2
, &ctrl
);
382 alrm
->time
.tm_sec
= 0;
383 alrm
->time
.tm_min
= bcd2bin(alarmvals
[0] & 0x7f);
384 alrm
->time
.tm_hour
= bcd2bin(alarmvals
[1] & 0x3f);
385 alrm
->time
.tm_mday
= bcd2bin(alarmvals
[2] & 0x3f);
387 alrm
->enabled
= !!(ctrl
& RV3028_CTRL2_AIE
);
388 alrm
->pending
= (status
& RV3028_STATUS_AF
) && alrm
->enabled
;
393 static int rv3028_set_alarm(struct device
*dev
, struct rtc_wkalrm
*alrm
)
395 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
);
400 /* The alarm has no seconds, round up to nearest minute */
401 if (alrm
->time
.tm_sec
) {
402 time64_t alarm_time
= rtc_tm_to_time64(&alrm
->time
);
404 alarm_time
+= 60 - alrm
->time
.tm_sec
;
405 rtc_time64_to_tm(alarm_time
, &alrm
->time
);
408 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_CTRL2
,
409 RV3028_CTRL2_AIE
| RV3028_CTRL2_UIE
, 0);
413 alarmvals
[0] = bin2bcd(alrm
->time
.tm_min
);
414 alarmvals
[1] = bin2bcd(alrm
->time
.tm_hour
);
415 alarmvals
[2] = bin2bcd(alrm
->time
.tm_mday
);
417 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_STATUS
,
418 RV3028_STATUS_AF
, 0);
422 ret
= regmap_bulk_write(rv3028
->regmap
, RV3028_ALARM_MIN
, alarmvals
,
428 if (rv3028
->rtc
->uie_rtctimer
.enabled
)
429 ctrl
|= RV3028_CTRL2_UIE
;
430 if (rv3028
->rtc
->aie_timer
.enabled
)
431 ctrl
|= RV3028_CTRL2_AIE
;
434 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_CTRL2
,
435 RV3028_CTRL2_UIE
| RV3028_CTRL2_AIE
, ctrl
);
440 static int rv3028_alarm_irq_enable(struct device
*dev
, unsigned int enabled
)
442 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
);
446 if (rv3028
->rtc
->uie_rtctimer
.enabled
)
447 ctrl
|= RV3028_CTRL2_UIE
;
448 if (rv3028
->rtc
->aie_timer
.enabled
)
449 ctrl
|= RV3028_CTRL2_AIE
;
452 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_STATUS
,
453 RV3028_STATUS_AF
| RV3028_STATUS_UF
, 0);
457 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_CTRL2
,
458 RV3028_CTRL2_UIE
| RV3028_CTRL2_AIE
, ctrl
);
465 static int rv3028_read_offset(struct device
*dev
, long *offset
)
467 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
);
468 int ret
, value
, steps
;
470 ret
= regmap_read(rv3028
->regmap
, RV3028_OFFSET
, &value
);
474 steps
= sign_extend32(value
<< 1, 8);
476 ret
= regmap_read(rv3028
->regmap
, RV3028_BACKUP
, &value
);
482 *offset
= DIV_ROUND_CLOSEST(steps
* OFFSET_STEP_PPT
, 1000);
487 static int rv3028_set_offset(struct device
*dev
, long offset
)
489 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
);
493 offset
= clamp(offset
, -244141L, 243187L) * 1000;
494 offset
= DIV_ROUND_CLOSEST(offset
, OFFSET_STEP_PPT
);
496 ret
= rv3028_enter_eerd(rv3028
, &eerd
);
500 ret
= regmap_write(rv3028
->regmap
, RV3028_OFFSET
, offset
>> 1);
504 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_BACKUP
, BIT(7),
509 return rv3028_update_eeprom(rv3028
, eerd
);
512 rv3028_exit_eerd(rv3028
, eerd
);
518 static int rv3028_ioctl(struct device
*dev
, unsigned int cmd
, unsigned long arg
)
520 struct rv3028_data
*rv3028
= dev_get_drvdata(dev
);
525 ret
= regmap_read(rv3028
->regmap
, RV3028_STATUS
, &status
);
529 status
= status
& RV3028_STATUS_PORF
? RTC_VL_DATA_INVALID
: 0;
530 return put_user(status
, (unsigned int __user
*)arg
);
537 static int rv3028_nvram_write(void *priv
, unsigned int offset
, void *val
,
540 return regmap_bulk_write(priv
, RV3028_RAM1
+ offset
, val
, bytes
);
543 static int rv3028_nvram_read(void *priv
, unsigned int offset
, void *val
,
546 return regmap_bulk_read(priv
, RV3028_RAM1
+ offset
, val
, bytes
);
549 static int rv3028_eeprom_write(void *priv
, unsigned int offset
, void *val
,
552 struct rv3028_data
*rv3028
= priv
;
557 ret
= rv3028_enter_eerd(rv3028
, &eerd
);
561 for (i
= 0; i
< bytes
; i
++) {
562 ret
= regmap_write(rv3028
->regmap
, RV3028_EEPROM_ADDR
, offset
+ i
);
566 ret
= regmap_write(rv3028
->regmap
, RV3028_EEPROM_DATA
, buf
[i
]);
570 ret
= regmap_write(rv3028
->regmap
, RV3028_EEPROM_CMD
, 0x0);
574 ret
= regmap_write(rv3028
->regmap
, RV3028_EEPROM_CMD
,
575 RV3028_EEPROM_CMD_WRITE
);
579 usleep_range(RV3028_EEBUSY_POLL
, RV3028_EEBUSY_TIMEOUT
);
581 ret
= regmap_read_poll_timeout(rv3028
->regmap
, RV3028_STATUS
, status
,
582 !(status
& RV3028_STATUS_EEBUSY
),
584 RV3028_EEBUSY_TIMEOUT
);
590 rv3028_exit_eerd(rv3028
, eerd
);
595 static int rv3028_eeprom_read(void *priv
, unsigned int offset
, void *val
,
598 struct rv3028_data
*rv3028
= priv
;
599 u32 status
, eerd
, data
;
603 ret
= rv3028_enter_eerd(rv3028
, &eerd
);
607 for (i
= 0; i
< bytes
; i
++) {
608 ret
= regmap_write(rv3028
->regmap
, RV3028_EEPROM_ADDR
, offset
+ i
);
612 ret
= regmap_write(rv3028
->regmap
, RV3028_EEPROM_CMD
, 0x0);
616 ret
= regmap_write(rv3028
->regmap
, RV3028_EEPROM_CMD
,
617 RV3028_EEPROM_CMD_READ
);
621 ret
= regmap_read_poll_timeout(rv3028
->regmap
, RV3028_STATUS
, status
,
622 !(status
& RV3028_STATUS_EEBUSY
),
624 RV3028_EEBUSY_TIMEOUT
);
628 ret
= regmap_read(rv3028
->regmap
, RV3028_EEPROM_DATA
, &data
);
635 rv3028_exit_eerd(rv3028
, eerd
);
640 #ifdef CONFIG_COMMON_CLK
641 #define clkout_hw_to_rv3028(hw) container_of(hw, struct rv3028_data, clkout_hw)
643 static int clkout_rates
[] = {
652 static unsigned long rv3028_clkout_recalc_rate(struct clk_hw
*hw
,
653 unsigned long parent_rate
)
656 struct rv3028_data
*rv3028
= clkout_hw_to_rv3028(hw
);
658 ret
= regmap_read(rv3028
->regmap
, RV3028_CLKOUT
, &clkout
);
662 clkout
&= RV3028_CLKOUT_FD_MASK
;
663 return clkout_rates
[clkout
];
666 static long rv3028_clkout_round_rate(struct clk_hw
*hw
, unsigned long rate
,
667 unsigned long *prate
)
671 for (i
= 0; i
< ARRAY_SIZE(clkout_rates
); i
++)
672 if (clkout_rates
[i
] <= rate
)
673 return clkout_rates
[i
];
678 static int rv3028_clkout_set_rate(struct clk_hw
*hw
, unsigned long rate
,
679 unsigned long parent_rate
)
683 struct rv3028_data
*rv3028
= clkout_hw_to_rv3028(hw
);
685 ret
= regmap_read(rv3028
->regmap
, RV3028_CLKOUT
, &enabled
);
689 ret
= regmap_write(rv3028
->regmap
, RV3028_CLKOUT
, 0x0);
693 enabled
&= RV3028_CLKOUT_CLKOE
;
695 for (i
= 0; i
< ARRAY_SIZE(clkout_rates
); i
++)
696 if (clkout_rates
[i
] == rate
)
697 return rv3028_update_cfg(rv3028
, RV3028_CLKOUT
, 0xff,
698 RV3028_CLKOUT_CLKSY
| enabled
| i
);
703 static int rv3028_clkout_prepare(struct clk_hw
*hw
)
705 struct rv3028_data
*rv3028
= clkout_hw_to_rv3028(hw
);
707 return regmap_write(rv3028
->regmap
, RV3028_CLKOUT
,
708 RV3028_CLKOUT_CLKSY
| RV3028_CLKOUT_CLKOE
);
711 static void rv3028_clkout_unprepare(struct clk_hw
*hw
)
713 struct rv3028_data
*rv3028
= clkout_hw_to_rv3028(hw
);
715 regmap_write(rv3028
->regmap
, RV3028_CLKOUT
, 0x0);
716 regmap_update_bits(rv3028
->regmap
, RV3028_STATUS
,
717 RV3028_STATUS_CLKF
, 0);
720 static int rv3028_clkout_is_prepared(struct clk_hw
*hw
)
723 struct rv3028_data
*rv3028
= clkout_hw_to_rv3028(hw
);
725 ret
= regmap_read(rv3028
->regmap
, RV3028_CLKOUT
, &clkout
);
729 return !!(clkout
& RV3028_CLKOUT_CLKOE
);
732 static const struct clk_ops rv3028_clkout_ops
= {
733 .prepare
= rv3028_clkout_prepare
,
734 .unprepare
= rv3028_clkout_unprepare
,
735 .is_prepared
= rv3028_clkout_is_prepared
,
736 .recalc_rate
= rv3028_clkout_recalc_rate
,
737 .round_rate
= rv3028_clkout_round_rate
,
738 .set_rate
= rv3028_clkout_set_rate
,
741 static int rv3028_clkout_register_clk(struct rv3028_data
*rv3028
,
742 struct i2c_client
*client
)
746 struct clk_init_data init
;
747 struct device_node
*node
= client
->dev
.of_node
;
749 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_STATUS
,
750 RV3028_STATUS_CLKF
, 0);
754 init
.name
= "rv3028-clkout";
755 init
.ops
= &rv3028_clkout_ops
;
757 init
.parent_names
= NULL
;
758 init
.num_parents
= 0;
759 rv3028
->clkout_hw
.init
= &init
;
761 /* optional override of the clockname */
762 of_property_read_string(node
, "clock-output-names", &init
.name
);
764 /* register the clock */
765 clk
= devm_clk_register(&client
->dev
, &rv3028
->clkout_hw
);
767 of_clk_add_provider(node
, of_clk_src_simple_get
, clk
);
773 static struct rtc_class_ops rv3028_rtc_ops
= {
774 .read_time
= rv3028_get_time
,
775 .set_time
= rv3028_set_time
,
776 .read_offset
= rv3028_read_offset
,
777 .set_offset
= rv3028_set_offset
,
778 .ioctl
= rv3028_ioctl
,
781 static const struct regmap_config regmap_config
= {
784 .max_register
= 0x37,
787 static int rv3028_probe(struct i2c_client
*client
)
789 struct rv3028_data
*rv3028
;
792 struct nvmem_config nvmem_cfg
= {
793 .name
= "rv3028_nvram",
797 .type
= NVMEM_TYPE_BATTERY_BACKED
,
798 .reg_read
= rv3028_nvram_read
,
799 .reg_write
= rv3028_nvram_write
,
801 struct nvmem_config eeprom_cfg
= {
802 .name
= "rv3028_eeprom",
806 .type
= NVMEM_TYPE_EEPROM
,
807 .reg_read
= rv3028_eeprom_read
,
808 .reg_write
= rv3028_eeprom_write
,
811 rv3028
= devm_kzalloc(&client
->dev
, sizeof(struct rv3028_data
),
816 rv3028
->regmap
= devm_regmap_init_i2c(client
, ®map_config
);
817 if (IS_ERR(rv3028
->regmap
))
818 return PTR_ERR(rv3028
->regmap
);
820 i2c_set_clientdata(client
, rv3028
);
822 ret
= regmap_read(rv3028
->regmap
, RV3028_STATUS
, &status
);
826 if (status
& RV3028_STATUS_PORF
)
827 dev_warn(&client
->dev
, "Voltage low, data loss detected.\n");
829 if (status
& RV3028_STATUS_AF
)
830 dev_warn(&client
->dev
, "An alarm may have been missed.\n");
832 rv3028
->rtc
= devm_rtc_allocate_device(&client
->dev
);
833 if (IS_ERR(rv3028
->rtc
))
834 return PTR_ERR(rv3028
->rtc
);
836 if (client
->irq
> 0) {
837 ret
= devm_request_threaded_irq(&client
->dev
, client
->irq
,
838 NULL
, rv3028_handle_irq
,
839 IRQF_TRIGGER_LOW
| IRQF_ONESHOT
,
842 dev_warn(&client
->dev
, "unable to request IRQ, alarms disabled\n");
845 rv3028_rtc_ops
.read_alarm
= rv3028_get_alarm
;
846 rv3028_rtc_ops
.set_alarm
= rv3028_set_alarm
;
847 rv3028_rtc_ops
.alarm_irq_enable
= rv3028_alarm_irq_enable
;
851 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_CTRL1
,
852 RV3028_CTRL1_WADA
, RV3028_CTRL1_WADA
);
856 /* setup timestamping */
857 ret
= regmap_update_bits(rv3028
->regmap
, RV3028_CTRL2
,
858 RV3028_CTRL2_EIE
| RV3028_CTRL2_TSE
,
859 RV3028_CTRL2_EIE
| RV3028_CTRL2_TSE
);
863 /* setup trickle charger */
864 if (!device_property_read_u32(&client
->dev
, "trickle-resistor-ohms",
868 for (i
= 0; i
< ARRAY_SIZE(rv3028_trickle_resistors
); i
++)
869 if (ohms
== rv3028_trickle_resistors
[i
])
872 if (i
< ARRAY_SIZE(rv3028_trickle_resistors
)) {
873 ret
= rv3028_update_cfg(rv3028
, RV3028_BACKUP
, RV3028_BACKUP_TCE
|
874 RV3028_BACKUP_TCR_MASK
, RV3028_BACKUP_TCE
| i
);
878 dev_warn(&client
->dev
, "invalid trickle resistor value\n");
882 ret
= rtc_add_group(rv3028
->rtc
, &rv3028_attr_group
);
886 rv3028
->rtc
->range_min
= RTC_TIMESTAMP_BEGIN_2000
;
887 rv3028
->rtc
->range_max
= RTC_TIMESTAMP_END_2099
;
888 rv3028
->rtc
->ops
= &rv3028_rtc_ops
;
889 ret
= devm_rtc_register_device(rv3028
->rtc
);
893 nvmem_cfg
.priv
= rv3028
->regmap
;
894 devm_rtc_nvmem_register(rv3028
->rtc
, &nvmem_cfg
);
895 eeprom_cfg
.priv
= rv3028
;
896 devm_rtc_nvmem_register(rv3028
->rtc
, &eeprom_cfg
);
898 rv3028
->rtc
->max_user_freq
= 1;
900 #ifdef CONFIG_COMMON_CLK
901 rv3028_clkout_register_clk(rv3028
, client
);
906 static const struct of_device_id rv3028_of_match
[] = {
907 { .compatible
= "microcrystal,rv3028", },
910 MODULE_DEVICE_TABLE(of
, rv3028_of_match
);
912 static struct i2c_driver rv3028_driver
= {
914 .name
= "rtc-rv3028",
915 .of_match_table
= of_match_ptr(rv3028_of_match
),
917 .probe_new
= rv3028_probe
,
919 module_i2c_driver(rv3028_driver
);
921 MODULE_AUTHOR("Alexandre Belloni <alexandre.belloni@bootlin.com>");
922 MODULE_DESCRIPTION("Micro Crystal RV3028 RTC driver");
923 MODULE_LICENSE("GPL v2");