2 * A driver for the I2C members of the Abracon AB x8xx RTC family,
3 * and compatible: AB 1805 and AB 0805
5 * Copyright 2014-2015 Macq S.A.
7 * Author: Philippe De Muyter <phdm@macqel.be>
8 * Author: Alexandre Belloni <alexandre.belloni@free-electrons.com>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
16 #include <linux/bcd.h>
17 #include <linux/i2c.h>
18 #include <linux/module.h>
19 #include <linux/rtc.h>
21 #define ABX8XX_REG_HTH 0x00
22 #define ABX8XX_REG_SC 0x01
23 #define ABX8XX_REG_MN 0x02
24 #define ABX8XX_REG_HR 0x03
25 #define ABX8XX_REG_DA 0x04
26 #define ABX8XX_REG_MO 0x05
27 #define ABX8XX_REG_YR 0x06
28 #define ABX8XX_REG_WD 0x07
30 #define ABX8XX_REG_AHTH 0x08
31 #define ABX8XX_REG_ASC 0x09
32 #define ABX8XX_REG_AMN 0x0a
33 #define ABX8XX_REG_AHR 0x0b
34 #define ABX8XX_REG_ADA 0x0c
35 #define ABX8XX_REG_AMO 0x0d
36 #define ABX8XX_REG_AWD 0x0e
38 #define ABX8XX_REG_STATUS 0x0f
39 #define ABX8XX_STATUS_AF BIT(2)
41 #define ABX8XX_REG_CTRL1 0x10
42 #define ABX8XX_CTRL_WRITE BIT(0)
43 #define ABX8XX_CTRL_ARST BIT(2)
44 #define ABX8XX_CTRL_12_24 BIT(6)
46 #define ABX8XX_REG_IRQ 0x12
47 #define ABX8XX_IRQ_AIE BIT(2)
48 #define ABX8XX_IRQ_IM_1_4 (0x3 << 5)
50 #define ABX8XX_REG_CD_TIMER_CTL 0x18
52 #define ABX8XX_REG_OSC 0x1c
53 #define ABX8XX_OSC_FOS BIT(3)
54 #define ABX8XX_OSC_BOS BIT(4)
55 #define ABX8XX_OSC_ACAL_512 BIT(5)
56 #define ABX8XX_OSC_ACAL_1024 BIT(6)
58 #define ABX8XX_OSC_OSEL BIT(7)
60 #define ABX8XX_REG_OSS 0x1d
61 #define ABX8XX_OSS_OF BIT(1)
62 #define ABX8XX_OSS_OMODE BIT(4)
64 #define ABX8XX_REG_CFG_KEY 0x1f
65 #define ABX8XX_CFG_KEY_OSC 0xa1
66 #define ABX8XX_CFG_KEY_MISC 0x9d
68 #define ABX8XX_REG_ID0 0x28
70 #define ABX8XX_REG_TRICKLE 0x20
71 #define ABX8XX_TRICKLE_CHARGE_ENABLE 0xa0
72 #define ABX8XX_TRICKLE_STANDARD_DIODE 0x8
73 #define ABX8XX_TRICKLE_SCHOTTKY_DIODE 0x4
75 static u8 trickle_resistors
[] = {0, 3, 6, 11};
77 enum abx80x_chip
{AB0801
, AB0803
, AB0804
, AB0805
,
78 AB1801
, AB1803
, AB1804
, AB1805
, ABX80X
};
85 static struct abx80x_cap abx80x_caps
[] = {
86 [AB0801
] = {.pn
= 0x0801},
87 [AB0803
] = {.pn
= 0x0803},
88 [AB0804
] = {.pn
= 0x0804, .has_tc
= true},
89 [AB0805
] = {.pn
= 0x0805, .has_tc
= true},
90 [AB1801
] = {.pn
= 0x1801},
91 [AB1803
] = {.pn
= 0x1803},
92 [AB1804
] = {.pn
= 0x1804, .has_tc
= true},
93 [AB1805
] = {.pn
= 0x1805, .has_tc
= true},
97 static int abx80x_is_rc_mode(struct i2c_client
*client
)
101 flags
= i2c_smbus_read_byte_data(client
, ABX8XX_REG_OSS
);
103 dev_err(&client
->dev
,
104 "Failed to read autocalibration attribute\n");
108 return (flags
& ABX8XX_OSS_OMODE
) ? 1 : 0;
111 static int abx80x_enable_trickle_charger(struct i2c_client
*client
,
117 * Write the configuration key register to enable access to the Trickle
120 err
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_CFG_KEY
,
121 ABX8XX_CFG_KEY_MISC
);
123 dev_err(&client
->dev
, "Unable to write configuration key\n");
127 err
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_TRICKLE
,
128 ABX8XX_TRICKLE_CHARGE_ENABLE
|
131 dev_err(&client
->dev
, "Unable to write trickle register\n");
138 static int abx80x_rtc_read_time(struct device
*dev
, struct rtc_time
*tm
)
140 struct i2c_client
*client
= to_i2c_client(dev
);
141 unsigned char buf
[8];
142 int err
, flags
, rc_mode
= 0;
144 /* Read the Oscillator Failure only in XT mode */
145 rc_mode
= abx80x_is_rc_mode(client
);
150 flags
= i2c_smbus_read_byte_data(client
, ABX8XX_REG_OSS
);
154 if (flags
& ABX8XX_OSS_OF
) {
155 dev_err(dev
, "Oscillator failure, data is invalid.\n");
160 err
= i2c_smbus_read_i2c_block_data(client
, ABX8XX_REG_HTH
,
163 dev_err(&client
->dev
, "Unable to read date\n");
167 tm
->tm_sec
= bcd2bin(buf
[ABX8XX_REG_SC
] & 0x7F);
168 tm
->tm_min
= bcd2bin(buf
[ABX8XX_REG_MN
] & 0x7F);
169 tm
->tm_hour
= bcd2bin(buf
[ABX8XX_REG_HR
] & 0x3F);
170 tm
->tm_wday
= buf
[ABX8XX_REG_WD
] & 0x7;
171 tm
->tm_mday
= bcd2bin(buf
[ABX8XX_REG_DA
] & 0x3F);
172 tm
->tm_mon
= bcd2bin(buf
[ABX8XX_REG_MO
] & 0x1F) - 1;
173 tm
->tm_year
= bcd2bin(buf
[ABX8XX_REG_YR
]) + 100;
178 static int abx80x_rtc_set_time(struct device
*dev
, struct rtc_time
*tm
)
180 struct i2c_client
*client
= to_i2c_client(dev
);
181 unsigned char buf
[8];
184 if (tm
->tm_year
< 100)
187 buf
[ABX8XX_REG_HTH
] = 0;
188 buf
[ABX8XX_REG_SC
] = bin2bcd(tm
->tm_sec
);
189 buf
[ABX8XX_REG_MN
] = bin2bcd(tm
->tm_min
);
190 buf
[ABX8XX_REG_HR
] = bin2bcd(tm
->tm_hour
);
191 buf
[ABX8XX_REG_DA
] = bin2bcd(tm
->tm_mday
);
192 buf
[ABX8XX_REG_MO
] = bin2bcd(tm
->tm_mon
+ 1);
193 buf
[ABX8XX_REG_YR
] = bin2bcd(tm
->tm_year
- 100);
194 buf
[ABX8XX_REG_WD
] = tm
->tm_wday
;
196 err
= i2c_smbus_write_i2c_block_data(client
, ABX8XX_REG_HTH
,
199 dev_err(&client
->dev
, "Unable to write to date registers\n");
203 /* Clear the OF bit of Oscillator Status Register */
204 flags
= i2c_smbus_read_byte_data(client
, ABX8XX_REG_OSS
);
208 err
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_OSS
,
209 flags
& ~ABX8XX_OSS_OF
);
211 dev_err(&client
->dev
, "Unable to write oscillator status register\n");
218 static irqreturn_t
abx80x_handle_irq(int irq
, void *dev_id
)
220 struct i2c_client
*client
= dev_id
;
221 struct rtc_device
*rtc
= i2c_get_clientdata(client
);
224 status
= i2c_smbus_read_byte_data(client
, ABX8XX_REG_STATUS
);
228 if (status
& ABX8XX_STATUS_AF
)
229 rtc_update_irq(rtc
, 1, RTC_AF
| RTC_IRQF
);
231 i2c_smbus_write_byte_data(client
, ABX8XX_REG_STATUS
, 0);
236 static int abx80x_read_alarm(struct device
*dev
, struct rtc_wkalrm
*t
)
238 struct i2c_client
*client
= to_i2c_client(dev
);
239 unsigned char buf
[7];
243 if (client
->irq
<= 0)
246 err
= i2c_smbus_read_i2c_block_data(client
, ABX8XX_REG_ASC
,
251 irq_mask
= i2c_smbus_read_byte_data(client
, ABX8XX_REG_IRQ
);
255 t
->time
.tm_sec
= bcd2bin(buf
[0] & 0x7F);
256 t
->time
.tm_min
= bcd2bin(buf
[1] & 0x7F);
257 t
->time
.tm_hour
= bcd2bin(buf
[2] & 0x3F);
258 t
->time
.tm_mday
= bcd2bin(buf
[3] & 0x3F);
259 t
->time
.tm_mon
= bcd2bin(buf
[4] & 0x1F) - 1;
260 t
->time
.tm_wday
= buf
[5] & 0x7;
262 t
->enabled
= !!(irq_mask
& ABX8XX_IRQ_AIE
);
263 t
->pending
= (buf
[6] & ABX8XX_STATUS_AF
) && t
->enabled
;
268 static int abx80x_set_alarm(struct device
*dev
, struct rtc_wkalrm
*t
)
270 struct i2c_client
*client
= to_i2c_client(dev
);
274 if (client
->irq
<= 0)
278 alarm
[1] = bin2bcd(t
->time
.tm_sec
);
279 alarm
[2] = bin2bcd(t
->time
.tm_min
);
280 alarm
[3] = bin2bcd(t
->time
.tm_hour
);
281 alarm
[4] = bin2bcd(t
->time
.tm_mday
);
282 alarm
[5] = bin2bcd(t
->time
.tm_mon
+ 1);
284 err
= i2c_smbus_write_i2c_block_data(client
, ABX8XX_REG_AHTH
,
285 sizeof(alarm
), alarm
);
287 dev_err(&client
->dev
, "Unable to write alarm registers\n");
292 err
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_IRQ
,
302 static int abx80x_rtc_set_autocalibration(struct device
*dev
,
305 struct i2c_client
*client
= to_i2c_client(dev
);
306 int retval
, flags
= 0;
308 if ((autocalibration
!= 0) && (autocalibration
!= 1024) &&
309 (autocalibration
!= 512)) {
310 dev_err(dev
, "autocalibration value outside permitted range\n");
314 flags
= i2c_smbus_read_byte_data(client
, ABX8XX_REG_OSC
);
318 if (autocalibration
== 0) {
319 flags
&= ~(ABX8XX_OSC_ACAL_512
| ABX8XX_OSC_ACAL_1024
);
320 } else if (autocalibration
== 1024) {
321 /* 1024 autocalibration is 0x10 */
322 flags
|= ABX8XX_OSC_ACAL_1024
;
323 flags
&= ~(ABX8XX_OSC_ACAL_512
);
325 /* 512 autocalibration is 0x11 */
326 flags
|= (ABX8XX_OSC_ACAL_1024
| ABX8XX_OSC_ACAL_512
);
329 /* Unlock write access to Oscillator Control Register */
330 retval
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_CFG_KEY
,
333 dev_err(dev
, "Failed to write CONFIG_KEY register\n");
337 retval
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_OSC
, flags
);
342 static int abx80x_rtc_get_autocalibration(struct device
*dev
)
344 struct i2c_client
*client
= to_i2c_client(dev
);
345 int flags
= 0, autocalibration
;
347 flags
= i2c_smbus_read_byte_data(client
, ABX8XX_REG_OSC
);
351 if (flags
& ABX8XX_OSC_ACAL_512
)
352 autocalibration
= 512;
353 else if (flags
& ABX8XX_OSC_ACAL_1024
)
354 autocalibration
= 1024;
358 return autocalibration
;
361 static ssize_t
autocalibration_store(struct device
*dev
,
362 struct device_attribute
*attr
,
363 const char *buf
, size_t count
)
366 unsigned long autocalibration
= 0;
368 retval
= kstrtoul(buf
, 10, &autocalibration
);
370 dev_err(dev
, "Failed to store RTC autocalibration attribute\n");
374 retval
= abx80x_rtc_set_autocalibration(dev
, autocalibration
);
376 return retval
? retval
: count
;
379 static ssize_t
autocalibration_show(struct device
*dev
,
380 struct device_attribute
*attr
, char *buf
)
382 int autocalibration
= 0;
384 autocalibration
= abx80x_rtc_get_autocalibration(dev
);
385 if (autocalibration
< 0) {
386 dev_err(dev
, "Failed to read RTC autocalibration\n");
388 return autocalibration
;
391 return sprintf(buf
, "%d\n", autocalibration
);
394 static DEVICE_ATTR_RW(autocalibration
);
396 static ssize_t
oscillator_store(struct device
*dev
,
397 struct device_attribute
*attr
,
398 const char *buf
, size_t count
)
400 struct i2c_client
*client
= to_i2c_client(dev
);
401 int retval
, flags
, rc_mode
= 0;
403 if (strncmp(buf
, "rc", 2) == 0) {
405 } else if (strncmp(buf
, "xtal", 4) == 0) {
408 dev_err(dev
, "Oscillator selection value outside permitted ones\n");
412 flags
= i2c_smbus_read_byte_data(client
, ABX8XX_REG_OSC
);
417 flags
&= ~(ABX8XX_OSC_OSEL
);
419 flags
|= (ABX8XX_OSC_OSEL
);
421 /* Unlock write access on Oscillator Control register */
422 retval
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_CFG_KEY
,
425 dev_err(dev
, "Failed to write CONFIG_KEY register\n");
429 retval
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_OSC
, flags
);
431 dev_err(dev
, "Failed to write Oscillator Control register\n");
435 return retval
? retval
: count
;
438 static ssize_t
oscillator_show(struct device
*dev
,
439 struct device_attribute
*attr
, char *buf
)
442 struct i2c_client
*client
= to_i2c_client(dev
);
444 rc_mode
= abx80x_is_rc_mode(client
);
447 dev_err(dev
, "Failed to read RTC oscillator selection\n");
453 return sprintf(buf
, "rc\n");
455 return sprintf(buf
, "xtal\n");
458 static DEVICE_ATTR_RW(oscillator
);
460 static struct attribute
*rtc_calib_attrs
[] = {
461 &dev_attr_autocalibration
.attr
,
462 &dev_attr_oscillator
.attr
,
466 static const struct attribute_group rtc_calib_attr_group
= {
467 .attrs
= rtc_calib_attrs
,
470 static int abx80x_alarm_irq_enable(struct device
*dev
, unsigned int enabled
)
472 struct i2c_client
*client
= to_i2c_client(dev
);
476 err
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_IRQ
,
480 err
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_IRQ
,
485 static const struct rtc_class_ops abx80x_rtc_ops
= {
486 .read_time
= abx80x_rtc_read_time
,
487 .set_time
= abx80x_rtc_set_time
,
488 .read_alarm
= abx80x_read_alarm
,
489 .set_alarm
= abx80x_set_alarm
,
490 .alarm_irq_enable
= abx80x_alarm_irq_enable
,
493 static int abx80x_dt_trickle_cfg(struct device_node
*np
)
500 ret
= of_property_read_string(np
, "abracon,tc-diode", &diode
);
504 if (!strcmp(diode
, "standard"))
505 trickle_cfg
|= ABX8XX_TRICKLE_STANDARD_DIODE
;
506 else if (!strcmp(diode
, "schottky"))
507 trickle_cfg
|= ABX8XX_TRICKLE_SCHOTTKY_DIODE
;
511 ret
= of_property_read_u32(np
, "abracon,tc-resistor", &tmp
);
515 for (i
= 0; i
< sizeof(trickle_resistors
); i
++)
516 if (trickle_resistors
[i
] == tmp
)
519 if (i
== sizeof(trickle_resistors
))
522 return (trickle_cfg
| i
);
525 static void rtc_calib_remove_sysfs_group(void *_dev
)
527 struct device
*dev
= _dev
;
529 sysfs_remove_group(&dev
->kobj
, &rtc_calib_attr_group
);
532 static int abx80x_probe(struct i2c_client
*client
,
533 const struct i2c_device_id
*id
)
535 struct device_node
*np
= client
->dev
.of_node
;
536 struct rtc_device
*rtc
;
537 int i
, data
, err
, trickle_cfg
= -EINVAL
;
539 unsigned int part
= id
->driver_data
;
540 unsigned int partnumber
;
541 unsigned int majrev
, minrev
;
546 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
))
549 err
= i2c_smbus_read_i2c_block_data(client
, ABX8XX_REG_ID0
,
552 dev_err(&client
->dev
, "Unable to read partnumber\n");
556 partnumber
= (buf
[0] << 8) | buf
[1];
557 majrev
= buf
[2] >> 3;
558 minrev
= buf
[2] & 0x7;
559 lot
= ((buf
[4] & 0x80) << 2) | ((buf
[6] & 0x80) << 1) | buf
[3];
560 uid
= ((buf
[4] & 0x7f) << 8) | buf
[5];
561 wafer
= (buf
[6] & 0x7c) >> 2;
562 dev_info(&client
->dev
, "model %04x, revision %u.%u, lot %x, wafer %x, uid %x\n",
563 partnumber
, majrev
, minrev
, lot
, wafer
, uid
);
565 data
= i2c_smbus_read_byte_data(client
, ABX8XX_REG_CTRL1
);
567 dev_err(&client
->dev
, "Unable to read control register\n");
571 err
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_CTRL1
,
572 ((data
& ~(ABX8XX_CTRL_12_24
|
576 dev_err(&client
->dev
, "Unable to write control register\n");
580 /* part autodetection */
581 if (part
== ABX80X
) {
582 for (i
= 0; abx80x_caps
[i
].pn
; i
++)
583 if (partnumber
== abx80x_caps
[i
].pn
)
585 if (abx80x_caps
[i
].pn
== 0) {
586 dev_err(&client
->dev
, "Unknown part: %04x\n",
593 if (partnumber
!= abx80x_caps
[part
].pn
) {
594 dev_err(&client
->dev
, "partnumber mismatch %04x != %04x\n",
595 partnumber
, abx80x_caps
[part
].pn
);
599 if (np
&& abx80x_caps
[part
].has_tc
)
600 trickle_cfg
= abx80x_dt_trickle_cfg(np
);
602 if (trickle_cfg
> 0) {
603 dev_info(&client
->dev
, "Enabling trickle charger: %02x\n",
605 abx80x_enable_trickle_charger(client
, trickle_cfg
);
608 err
= i2c_smbus_write_byte_data(client
, ABX8XX_REG_CD_TIMER_CTL
,
613 rtc
= devm_rtc_allocate_device(&client
->dev
);
617 rtc
->ops
= &abx80x_rtc_ops
;
619 i2c_set_clientdata(client
, rtc
);
621 if (client
->irq
> 0) {
622 dev_info(&client
->dev
, "IRQ %d supplied\n", client
->irq
);
623 err
= devm_request_threaded_irq(&client
->dev
, client
->irq
, NULL
,
625 IRQF_SHARED
| IRQF_ONESHOT
,
629 dev_err(&client
->dev
, "unable to request IRQ, alarms disabled\n");
634 /* Export sysfs entries */
635 err
= sysfs_create_group(&(&client
->dev
)->kobj
, &rtc_calib_attr_group
);
637 dev_err(&client
->dev
, "Failed to create sysfs group: %d\n",
642 err
= devm_add_action_or_reset(&client
->dev
,
643 rtc_calib_remove_sysfs_group
,
646 dev_err(&client
->dev
,
647 "Failed to add sysfs cleanup action: %d\n",
652 err
= rtc_register_device(rtc
);
657 static int abx80x_remove(struct i2c_client
*client
)
662 static const struct i2c_device_id abx80x_id
[] = {
663 { "abx80x", ABX80X
},
664 { "ab0801", AB0801
},
665 { "ab0803", AB0803
},
666 { "ab0804", AB0804
},
667 { "ab0805", AB0805
},
668 { "ab1801", AB1801
},
669 { "ab1803", AB1803
},
670 { "ab1804", AB1804
},
671 { "ab1805", AB1805
},
672 { "rv1805", AB1805
},
675 MODULE_DEVICE_TABLE(i2c
, abx80x_id
);
677 static struct i2c_driver abx80x_driver
= {
679 .name
= "rtc-abx80x",
681 .probe
= abx80x_probe
,
682 .remove
= abx80x_remove
,
683 .id_table
= abx80x_id
,
686 module_i2c_driver(abx80x_driver
);
688 MODULE_AUTHOR("Philippe De Muyter <phdm@macqel.be>");
689 MODULE_AUTHOR("Alexandre Belloni <alexandre.belloni@free-electrons.com>");
690 MODULE_DESCRIPTION("Abracon ABX80X RTC driver");
691 MODULE_LICENSE("GPL v2");