aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc
diff options
context:
space:
mode:
authorAlexandre Belloni <alexandre.belloni@bootlin.com>2019-02-12 18:21:36 -0500
committerAlexandre Belloni <alexandre.belloni@bootlin.com>2019-02-17 15:29:10 -0500
commite6e7376cfd7b3f9b63de3a22792f64d9bfb2ab53 (patch)
treef385ee7e4677e2b4ce44febb73d1422f771d2d22 /drivers/rtc
parent10e7122107bd426a6ac33bcb17392978a72ca13b (diff)
rtc: rv3028: add new driver
Add a driver for the MicroCrystal RV-3028. It is a SMT Real-Time Clock Module that incorporates an integrated CMOS circuit together with an XTAL. It has an i2c interface. The driver handles date/time, alarms, trickle charging, timestamping, frequency offset correction, EEPROM and NVRAM. Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Diffstat (limited to 'drivers/rtc')
-rw-r--r--drivers/rtc/Kconfig9
-rw-r--r--drivers/rtc/Makefile1
-rw-r--r--drivers/rtc/rtc-rv3028.c732
3 files changed, 742 insertions, 0 deletions
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 7d61bb382cf3..a08785ac8903 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -626,6 +626,15 @@ config RTC_DRV_EM3027
626 This driver can also be built as a module. If so, the module 626 This driver can also be built as a module. If so, the module
627 will be called rtc-em3027. 627 will be called rtc-em3027.
628 628
629config RTC_DRV_RV3028
630 tristate "Micro Crystal RV3028"
631 help
632 If you say yes here you get support for the Micro Crystal
633 RV3028.
634
635 This driver can also be built as a module. If so, the module
636 will be called rtc-rv3028.
637
629config RTC_DRV_RV8803 638config RTC_DRV_RV8803
630 tristate "Micro Crystal RV8803, Epson RX8900" 639 tristate "Micro Crystal RV8803, Epson RX8900"
631 help 640 help
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index b994323942bd..6dc1e561f533 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -139,6 +139,7 @@ obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o
139obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o 139obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o
140obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o 140obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o
141obj-$(CONFIG_RTC_DRV_RTD119X) += rtc-rtd119x.o 141obj-$(CONFIG_RTC_DRV_RTD119X) += rtc-rtd119x.o
142obj-$(CONFIG_RTC_DRV_RV3028) += rtc-rv3028.o
142obj-$(CONFIG_RTC_DRV_RV3029C2) += rtc-rv3029c2.o 143obj-$(CONFIG_RTC_DRV_RV3029C2) += rtc-rv3029c2.o
143obj-$(CONFIG_RTC_DRV_RV8803) += rtc-rv8803.o 144obj-$(CONFIG_RTC_DRV_RV8803) += rtc-rv8803.o
144obj-$(CONFIG_RTC_DRV_RX4581) += rtc-rx4581.o 145obj-$(CONFIG_RTC_DRV_RX4581) += rtc-rx4581.o
diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c
new file mode 100644
index 000000000000..06884ebb7a61
--- /dev/null
+++ b/drivers/rtc/rtc-rv3028.c
@@ -0,0 +1,732 @@
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * RTC driver for the Micro Crystal RV3028
4 *
5 * Copyright (C) 2019 Micro Crystal SA
6 *
7 * Alexandre Belloni <alexandre.belloni@bootlin.com>
8 *
9 */
10
11#include <linux/bcd.h>
12#include <linux/bitops.h>
13#include <linux/i2c.h>
14#include <linux/interrupt.h>
15#include <linux/kernel.h>
16#include <linux/log2.h>
17#include <linux/module.h>
18#include <linux/of_device.h>
19#include <linux/regmap.h>
20#include <linux/rtc.h>
21
22#define RV3028_SEC 0x00
23#define RV3028_MIN 0x01
24#define RV3028_HOUR 0x02
25#define RV3028_WDAY 0x03
26#define RV3028_DAY 0x04
27#define RV3028_MONTH 0x05
28#define RV3028_YEAR 0x06
29#define RV3028_ALARM_MIN 0x07
30#define RV3028_ALARM_HOUR 0x08
31#define RV3028_ALARM_DAY 0x09
32#define RV3028_STATUS 0x0E
33#define RV3028_CTRL1 0x0F
34#define RV3028_CTRL2 0x10
35#define RV3028_EVT_CTRL 0x13
36#define RV3028_TS_COUNT 0x14
37#define RV3028_TS_SEC 0x15
38#define RV3028_RAM1 0x1F
39#define RV3028_EEPROM_ADDR 0x25
40#define RV3028_EEPROM_DATA 0x26
41#define RV3028_EEPROM_CMD 0x27
42#define RV3028_CLKOUT 0x35
43#define RV3028_OFFSET 0x36
44#define RV3028_BACKUP 0x37
45
46#define RV3028_STATUS_PORF BIT(0)
47#define RV3028_STATUS_EVF BIT(1)
48#define RV3028_STATUS_AF BIT(2)
49#define RV3028_STATUS_TF BIT(3)
50#define RV3028_STATUS_UF BIT(4)
51#define RV3028_STATUS_BSF BIT(5)
52#define RV3028_STATUS_CLKF BIT(6)
53#define RV3028_STATUS_EEBUSY BIT(7)
54
55#define RV3028_CTRL1_EERD BIT(3)
56#define RV3028_CTRL1_WADA BIT(5)
57
58#define RV3028_CTRL2_RESET BIT(0)
59#define RV3028_CTRL2_12_24 BIT(1)
60#define RV3028_CTRL2_EIE BIT(2)
61#define RV3028_CTRL2_AIE BIT(3)
62#define RV3028_CTRL2_TIE BIT(4)
63#define RV3028_CTRL2_UIE BIT(5)
64#define RV3028_CTRL2_TSE BIT(7)
65
66#define RV3028_EVT_CTRL_TSR BIT(2)
67
68#define RV3028_EEPROM_CMD_WRITE 0x21
69#define RV3028_EEPROM_CMD_READ 0x22
70
71#define RV3028_EEBUSY_POLL 10000
72#define RV3028_EEBUSY_TIMEOUT 100000
73
74#define RV3028_BACKUP_TCE BIT(5)
75#define RV3028_BACKUP_TCR_MASK GENMASK(1,0)
76
77#define OFFSET_STEP_PPT 953674
78
79enum rv3028_type {
80 rv_3028,
81};
82
83struct rv3028_data {
84 struct regmap *regmap;
85 struct rtc_device *rtc;
86 enum rv3028_type type;
87};
88
89static u16 rv3028_trickle_resistors[] = {1000, 3000, 6000, 11000};
90
91static ssize_t timestamp0_store(struct device *dev,
92 struct device_attribute *attr,
93 const char *buf, size_t count)
94{
95 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent);
96
97 regmap_update_bits(rv3028->regmap, RV3028_EVT_CTRL, RV3028_EVT_CTRL_TSR,
98 RV3028_EVT_CTRL_TSR);
99
100 return count;
101};
102
103static ssize_t timestamp0_show(struct device *dev,
104 struct device_attribute *attr, char *buf)
105{
106 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent);
107 struct rtc_time tm;
108 int ret, count;
109 u8 date[6];
110
111 ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count);
112 if (ret)
113 return ret;
114
115 if (!count)
116 return 0;
117
118 ret = regmap_bulk_read(rv3028->regmap, RV3028_TS_SEC, date,
119 sizeof(date));
120 if (ret)
121 return ret;
122
123 tm.tm_sec = bcd2bin(date[0]);
124 tm.tm_min = bcd2bin(date[1]);
125 tm.tm_hour = bcd2bin(date[2]);
126 tm.tm_mday = bcd2bin(date[3]);
127 tm.tm_mon = bcd2bin(date[4]) - 1;
128 tm.tm_year = bcd2bin(date[5]) + 100;
129
130 ret = rtc_valid_tm(&tm);
131 if (ret)
132 return ret;
133
134 return sprintf(buf, "%llu\n",
135 (unsigned long long)rtc_tm_to_time64(&tm));
136};
137
138static DEVICE_ATTR_RW(timestamp0);
139
140static ssize_t timestamp0_count_show(struct device *dev,
141 struct device_attribute *attr, char *buf)
142{
143 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent);
144 int ret, count;
145
146 ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count);
147 if (ret)
148 return ret;
149
150 return sprintf(buf, "%u\n", count);
151};
152
153static DEVICE_ATTR_RO(timestamp0_count);
154
155static struct attribute *rv3028_attrs[] = {
156 &dev_attr_timestamp0.attr,
157 &dev_attr_timestamp0_count.attr,
158 NULL
159};
160
161static const struct attribute_group rv3028_attr_group = {
162 .attrs = rv3028_attrs,
163};
164
165static irqreturn_t rv3028_handle_irq(int irq, void *dev_id)
166{
167 struct rv3028_data *rv3028 = dev_id;
168 unsigned long events = 0;
169 u32 status = 0, ctrl = 0;
170
171 if (regmap_read(rv3028->regmap, RV3028_STATUS, &status) < 0 ||
172 status == 0) {
173 return IRQ_NONE;
174 }
175
176 if (status & RV3028_STATUS_PORF)
177 dev_warn(&rv3028->rtc->dev, "Voltage low, data loss detected.\n");
178
179 if (status & RV3028_STATUS_TF) {
180 status |= RV3028_STATUS_TF;
181 ctrl |= RV3028_CTRL2_TIE;
182 events |= RTC_PF;
183 }
184
185 if (status & RV3028_STATUS_AF) {
186 status |= RV3028_STATUS_AF;
187 ctrl |= RV3028_CTRL2_AIE;
188 events |= RTC_AF;
189 }
190
191 if (status & RV3028_STATUS_UF) {
192 status |= RV3028_STATUS_UF;
193 ctrl |= RV3028_CTRL2_UIE;
194 events |= RTC_UF;
195 }
196
197 if (events) {
198 rtc_update_irq(rv3028->rtc, 1, events);
199 regmap_update_bits(rv3028->regmap, RV3028_STATUS, status, 0);
200 regmap_update_bits(rv3028->regmap, RV3028_CTRL2, ctrl, 0);
201 }
202
203 if (status & RV3028_STATUS_EVF) {
204 sysfs_notify(&rv3028->rtc->dev.kobj, NULL,
205 dev_attr_timestamp0.attr.name);
206 dev_warn(&rv3028->rtc->dev, "event detected");
207 }
208
209 return IRQ_HANDLED;
210}
211
212static int rv3028_get_time(struct device *dev, struct rtc_time *tm)
213{
214 struct rv3028_data *rv3028 = dev_get_drvdata(dev);
215 u8 date[7];
216 int ret, status;
217
218 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status);
219 if (ret < 0)
220 return ret;
221
222 if (status & RV3028_STATUS_PORF) {
223 dev_warn(dev, "Voltage low, data is invalid.\n");
224 return -EINVAL;
225 }
226
227 ret = regmap_bulk_read(rv3028->regmap, RV3028_SEC, date, sizeof(date));
228 if (ret)
229 return ret;
230
231 tm->tm_sec = bcd2bin(date[RV3028_SEC] & 0x7f);
232 tm->tm_min = bcd2bin(date[RV3028_MIN] & 0x7f);
233 tm->tm_hour = bcd2bin(date[RV3028_HOUR] & 0x3f);
234 tm->tm_wday = ilog2(date[RV3028_WDAY] & 0x7f);
235 tm->tm_mday = bcd2bin(date[RV3028_DAY] & 0x3f);
236 tm->tm_mon = bcd2bin(date[RV3028_MONTH] & 0x1f) - 1;
237 tm->tm_year = bcd2bin(date[RV3028_YEAR]) + 100;
238
239 return 0;
240}
241
242static int rv3028_set_time(struct device *dev, struct rtc_time *tm)
243{
244 struct rv3028_data *rv3028 = dev_get_drvdata(dev);
245 u8 date[7];
246 int ret;
247
248 date[RV3028_SEC] = bin2bcd(tm->tm_sec);
249 date[RV3028_MIN] = bin2bcd(tm->tm_min);
250 date[RV3028_HOUR] = bin2bcd(tm->tm_hour);
251 date[RV3028_WDAY] = 1 << (tm->tm_wday);
252 date[RV3028_DAY] = bin2bcd(tm->tm_mday);
253 date[RV3028_MONTH] = bin2bcd(tm->tm_mon + 1);
254 date[RV3028_YEAR] = bin2bcd(tm->tm_year - 100);
255
256 /*
257 * Writing to the Seconds register has the same effect as setting RESET
258 * bit to 1
259 */
260 ret = regmap_bulk_write(rv3028->regmap, RV3028_SEC, date,
261 sizeof(date));
262 if (ret)
263 return ret;
264
265 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS,
266 RV3028_STATUS_PORF, 0);
267
268 return ret;
269}
270
271static int rv3028_get_alarm(struct device *dev, struct rtc_wkalrm *alrm)
272{
273 struct rv3028_data *rv3028 = dev_get_drvdata(dev);
274 u8 alarmvals[3];
275 int status, ctrl, ret;
276
277 ret = regmap_bulk_read(rv3028->regmap, RV3028_ALARM_MIN, alarmvals,
278 sizeof(alarmvals));
279 if (ret)
280 return ret;
281
282 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status);
283 if (ret < 0)
284 return ret;
285
286 ret = regmap_read(rv3028->regmap, RV3028_CTRL2, &ctrl);
287 if (ret < 0)
288 return ret;
289
290 alrm->time.tm_sec = 0;
291 alrm->time.tm_min = bcd2bin(alarmvals[0] & 0x7f);
292 alrm->time.tm_hour = bcd2bin(alarmvals[1] & 0x3f);
293 alrm->time.tm_mday = bcd2bin(alarmvals[2] & 0x3f);
294
295 alrm->enabled = !!(ctrl & RV3028_CTRL2_AIE);
296 alrm->pending = (status & RV3028_STATUS_AF) && alrm->enabled;
297
298 return 0;
299}
300
301static int rv3028_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
302{
303 struct rv3028_data *rv3028 = dev_get_drvdata(dev);
304 u8 alarmvals[3];
305 u8 ctrl = 0;
306 int ret;
307
308 /* The alarm has no seconds, round up to nearest minute */
309 if (alrm->time.tm_sec) {
310 time64_t alarm_time = rtc_tm_to_time64(&alrm->time);
311
312 alarm_time += 60 - alrm->time.tm_sec;
313 rtc_time64_to_tm(alarm_time, &alrm->time);
314 }
315
316 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2,
317 RV3028_CTRL2_AIE | RV3028_CTRL2_UIE, 0);
318 if (ret)
319 return ret;
320
321 alarmvals[0] = bin2bcd(alrm->time.tm_min);
322 alarmvals[1] = bin2bcd(alrm->time.tm_hour);
323 alarmvals[2] = bin2bcd(alrm->time.tm_mday);
324
325 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS,
326 RV3028_STATUS_AF, 0);
327 if (ret)
328 return ret;
329
330 ret = regmap_bulk_write(rv3028->regmap, RV3028_ALARM_MIN, alarmvals,
331 sizeof(alarmvals));
332 if (ret)
333 return ret;
334
335 if (alrm->enabled) {
336 if (rv3028->rtc->uie_rtctimer.enabled)
337 ctrl |= RV3028_CTRL2_UIE;
338 if (rv3028->rtc->aie_timer.enabled)
339 ctrl |= RV3028_CTRL2_AIE;
340 }
341
342 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2,
343 RV3028_CTRL2_UIE | RV3028_CTRL2_AIE, ctrl);
344
345 return ret;
346}
347
348static int rv3028_alarm_irq_enable(struct device *dev, unsigned int enabled)
349{
350 struct rv3028_data *rv3028 = dev_get_drvdata(dev);
351 int ctrl = 0, ret;
352
353 if (enabled) {
354 if (rv3028->rtc->uie_rtctimer.enabled)
355 ctrl |= RV3028_CTRL2_UIE;
356 if (rv3028->rtc->aie_timer.enabled)
357 ctrl |= RV3028_CTRL2_AIE;
358 }
359
360 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS,
361 RV3028_STATUS_AF | RV3028_STATUS_UF, 0);
362 if (ret)
363 return ret;
364
365 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2,
366 RV3028_CTRL2_UIE | RV3028_CTRL2_AIE, ctrl);
367 if (ret)
368 return ret;
369
370 return 0;
371}
372
373static int rv3028_read_offset(struct device *dev, long *offset)
374{
375 struct rv3028_data *rv3028 = dev_get_drvdata(dev);
376 int ret, value, steps;
377
378 ret = regmap_read(rv3028->regmap, RV3028_OFFSET, &value);
379 if (ret < 0)
380 return ret;
381
382 steps = sign_extend32(value << 1, 8);
383
384 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value);
385 if (ret < 0)
386 return ret;
387
388 steps += value >> 7;
389
390 *offset = DIV_ROUND_CLOSEST(steps * OFFSET_STEP_PPT, 1000);
391
392 return 0;
393}
394
395static int rv3028_set_offset(struct device *dev, long offset)
396{
397 struct rv3028_data *rv3028 = dev_get_drvdata(dev);
398 int ret;
399
400 offset = clamp(offset, -244141L, 243187L) * 1000;
401 offset = DIV_ROUND_CLOSEST(offset, OFFSET_STEP_PPT);
402
403 ret = regmap_write(rv3028->regmap, RV3028_OFFSET, offset >> 1);
404 if (ret < 0)
405 return ret;
406
407 return regmap_update_bits(rv3028->regmap, RV3028_BACKUP, BIT(7),
408 offset << 7);
409}
410
411static int rv3028_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
412{
413 struct rv3028_data *rv3028 = dev_get_drvdata(dev);
414 int status, ret = 0;
415
416 switch (cmd) {
417 case RTC_VL_READ:
418 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status);
419 if (ret < 0)
420 return ret;
421
422 if (status & RV3028_STATUS_PORF)
423 dev_warn(&rv3028->rtc->dev, "Voltage low, data loss detected.\n");
424
425 status &= RV3028_STATUS_PORF;
426
427 if (copy_to_user((void __user *)arg, &status, sizeof(int)))
428 return -EFAULT;
429
430 return 0;
431
432 case RTC_VL_CLR:
433 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS,
434 RV3028_STATUS_PORF, 0);
435
436 return ret;
437
438 default:
439 return -ENOIOCTLCMD;
440 }
441}
442
443static int rv3028_nvram_write(void *priv, unsigned int offset, void *val,
444 size_t bytes)
445{
446 return regmap_bulk_write(priv, RV3028_RAM1 + offset, val, bytes);
447}
448
449static int rv3028_nvram_read(void *priv, unsigned int offset, void *val,
450 size_t bytes)
451{
452 return regmap_bulk_read(priv, RV3028_RAM1 + offset, val, bytes);
453}
454
455static int rv3028_eeprom_write(void *priv, unsigned int offset, void *val,
456 size_t bytes)
457{
458 u32 status, ctrl1;
459 int i, ret, err;
460 u8 *buf = val;
461
462 ret = regmap_read(priv, RV3028_CTRL1, &ctrl1);
463 if (ret)
464 return ret;
465
466 if (!(ctrl1 & RV3028_CTRL1_EERD)) {
467 ret = regmap_update_bits(priv, RV3028_CTRL1,
468 RV3028_CTRL1_EERD, RV3028_CTRL1_EERD);
469 if (ret)
470 return ret;
471
472 ret = regmap_read_poll_timeout(priv, RV3028_STATUS, status,
473 !(status & RV3028_STATUS_EEBUSY),
474 RV3028_EEBUSY_POLL,
475 RV3028_EEBUSY_TIMEOUT);
476 if (ret)
477 goto restore_eerd;
478 }
479
480 for (i = 0; i < bytes; i++) {
481 ret = regmap_write(priv, RV3028_EEPROM_ADDR, offset + i);
482 if (ret)
483 goto restore_eerd;
484
485 ret = regmap_write(priv, RV3028_EEPROM_DATA, buf[i]);
486 if (ret)
487 goto restore_eerd;
488
489 ret = regmap_write(priv, RV3028_EEPROM_CMD, 0x0);
490 if (ret)
491 goto restore_eerd;
492
493 ret = regmap_write(priv, RV3028_EEPROM_CMD,
494 RV3028_EEPROM_CMD_WRITE);
495 if (ret)
496 goto restore_eerd;
497
498 usleep_range(RV3028_EEBUSY_POLL, RV3028_EEBUSY_TIMEOUT);
499
500 ret = regmap_read_poll_timeout(priv, RV3028_STATUS, status,
501 !(status & RV3028_STATUS_EEBUSY),
502 RV3028_EEBUSY_POLL,
503 RV3028_EEBUSY_TIMEOUT);
504 if (ret)
505 goto restore_eerd;
506 }
507
508restore_eerd:
509 if (!(ctrl1 & RV3028_CTRL1_EERD))
510 {
511 err = regmap_update_bits(priv, RV3028_CTRL1, RV3028_CTRL1_EERD,
512 0);
513 if (err && !ret)
514 ret = err;
515 }
516
517 return ret;
518}
519
520static int rv3028_eeprom_read(void *priv, unsigned int offset, void *val,
521 size_t bytes)
522{
523 u32 status, ctrl1, data;
524 int i, ret, err;
525 u8 *buf = val;
526
527 ret = regmap_read(priv, RV3028_CTRL1, &ctrl1);
528 if (ret)
529 return ret;
530
531 if (!(ctrl1 & RV3028_CTRL1_EERD)) {
532 ret = regmap_update_bits(priv, RV3028_CTRL1,
533 RV3028_CTRL1_EERD, RV3028_CTRL1_EERD);
534 if (ret)
535 return ret;
536
537 ret = regmap_read_poll_timeout(priv, RV3028_STATUS, status,
538 !(status & RV3028_STATUS_EEBUSY),
539 RV3028_EEBUSY_POLL,
540 RV3028_EEBUSY_TIMEOUT);
541 if (ret)
542 goto restore_eerd;
543 }
544
545 for (i = 0; i < bytes; i++) {
546 ret = regmap_write(priv, RV3028_EEPROM_ADDR, offset + i);
547 if (ret)
548 goto restore_eerd;
549
550 ret = regmap_write(priv, RV3028_EEPROM_CMD, 0x0);
551 if (ret)
552 goto restore_eerd;
553
554 ret = regmap_write(priv, RV3028_EEPROM_CMD,
555 RV3028_EEPROM_CMD_READ);
556 if (ret)
557 goto restore_eerd;
558
559 ret = regmap_read_poll_timeout(priv, RV3028_STATUS, status,
560 !(status & RV3028_STATUS_EEBUSY),
561 RV3028_EEBUSY_POLL,
562 RV3028_EEBUSY_TIMEOUT);
563 if (ret)
564 goto restore_eerd;
565
566 ret = regmap_read(priv, RV3028_EEPROM_DATA, &data);
567 if (ret)
568 goto restore_eerd;
569 buf[i] = data;
570 }
571
572restore_eerd:
573 if (!(ctrl1 & RV3028_CTRL1_EERD))
574 {
575 err = regmap_update_bits(priv, RV3028_CTRL1, RV3028_CTRL1_EERD,
576 0);
577 if (err && !ret)
578 ret = err;
579 }
580
581 return ret;
582}
583
584static struct rtc_class_ops rv3028_rtc_ops = {
585 .read_time = rv3028_get_time,
586 .set_time = rv3028_set_time,
587 .read_offset = rv3028_read_offset,
588 .set_offset = rv3028_set_offset,
589 .ioctl = rv3028_ioctl,
590};
591
592static const struct regmap_config regmap_config = {
593 .reg_bits = 8,
594 .val_bits = 8,
595 .max_register = 0x37,
596};
597
598static int rv3028_probe(struct i2c_client *client)
599{
600 struct rv3028_data *rv3028;
601 int ret, status;
602 u32 ohms;
603 struct nvmem_config nvmem_cfg = {
604 .name = "rv3028_nvram",
605 .word_size = 1,
606 .stride = 1,
607 .size = 2,
608 .type = NVMEM_TYPE_BATTERY_BACKED,
609 .reg_read = rv3028_nvram_read,
610 .reg_write = rv3028_nvram_write,
611 };
612 struct nvmem_config eeprom_cfg = {
613 .name = "rv3028_eeprom",
614 .word_size = 1,
615 .stride = 1,
616 .size = 43,
617 .type = NVMEM_TYPE_EEPROM,
618 .reg_read = rv3028_eeprom_read,
619 .reg_write = rv3028_eeprom_write,
620 };
621
622 rv3028 = devm_kzalloc(&client->dev, sizeof(struct rv3028_data),
623 GFP_KERNEL);
624 if (!rv3028)
625 return -ENOMEM;
626
627 rv3028->regmap = devm_regmap_init_i2c(client, &regmap_config);
628
629 i2c_set_clientdata(client, rv3028);
630
631 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status);
632 if (ret < 0)
633 return ret;
634
635 if (status & RV3028_STATUS_PORF)
636 dev_warn(&client->dev, "Voltage low, data loss detected.\n");
637
638 if (status & RV3028_STATUS_AF)
639 dev_warn(&client->dev, "An alarm may have been missed.\n");
640
641 rv3028->rtc = devm_rtc_allocate_device(&client->dev);
642 if (IS_ERR(rv3028->rtc)) {
643 return PTR_ERR(rv3028->rtc);
644 }
645
646 if (client->irq > 0) {
647 ret = devm_request_threaded_irq(&client->dev, client->irq,
648 NULL, rv3028_handle_irq,
649 IRQF_TRIGGER_LOW | IRQF_ONESHOT,
650 "rv3028", rv3028);
651 if (ret) {
652 dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
653 client->irq = 0;
654 } else {
655 rv3028_rtc_ops.read_alarm = rv3028_get_alarm;
656 rv3028_rtc_ops.set_alarm = rv3028_set_alarm;
657 rv3028_rtc_ops.alarm_irq_enable = rv3028_alarm_irq_enable;
658 }
659 }
660
661 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL1,
662 RV3028_CTRL1_WADA, RV3028_CTRL1_WADA);
663 if (ret)
664 return ret;
665
666 /* setup timestamping */
667 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2,
668 RV3028_CTRL2_EIE | RV3028_CTRL2_TSE,
669 RV3028_CTRL2_EIE | RV3028_CTRL2_TSE);
670 if (ret)
671 return ret;
672
673 /* setup trickle charger */
674 if (!device_property_read_u32(&client->dev, "trickle-resistor-ohms",
675 &ohms)) {
676 int i;
677
678 for (i = 0; i < ARRAY_SIZE(rv3028_trickle_resistors); i++)
679 if (ohms == rv3028_trickle_resistors[i])
680 break;
681
682 if (i < ARRAY_SIZE(rv3028_trickle_resistors)) {
683 ret = regmap_update_bits(rv3028->regmap, RV3028_BACKUP,
684 RV3028_BACKUP_TCE |
685 RV3028_BACKUP_TCR_MASK,
686 RV3028_BACKUP_TCE | i);
687 if (ret)
688 return ret;
689 } else {
690 dev_warn(&client->dev, "invalid trickle resistor value\n");
691 }
692 }
693
694 ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
695 if (ret)
696 return ret;
697
698 rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
699 rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099;
700 rv3028->rtc->ops = &rv3028_rtc_ops;
701 ret = rtc_register_device(rv3028->rtc);
702 if (ret)
703 return ret;
704
705 nvmem_cfg.priv = rv3028->regmap;
706 rtc_nvmem_register(rv3028->rtc, &nvmem_cfg);
707 eeprom_cfg.priv = rv3028->regmap;
708 rtc_nvmem_register(rv3028->rtc, &eeprom_cfg);
709
710 rv3028->rtc->max_user_freq = 1;
711
712 return 0;
713}
714
715static const struct of_device_id rv3028_of_match[] = {
716 { .compatible = "microcrystal,rv3028", },
717 { }
718};
719MODULE_DEVICE_TABLE(of, rv3028_of_match);
720
721static struct i2c_driver rv3028_driver = {
722 .driver = {
723 .name = "rtc-rv3028",
724 .of_match_table = of_match_ptr(rv3028_of_match),
725 },
726 .probe_new = rv3028_probe,
727};
728module_i2c_driver(rv3028_driver);
729
730MODULE_AUTHOR("Alexandre Belloni <alexandre.belloni@bootlin.com>");
731MODULE_DESCRIPTION("Micro Crystal RV3028 RTC driver");
732MODULE_LICENSE("GPL v2");