1 // SPDX-License-Identifier: GPL-2.0-only
3 * An I2C driver for the Intersil ISL 12022
5 * Author: Roman Fietze <roman.fietze@telemotive.de>
7 * Based on the Philips PCF8563 RTC
8 * by Alessandro Zummo <a.zummo@towertech.it>.
11 #include <linux/bcd.h>
12 #include <linux/bitfield.h>
13 #include <linux/clk-provider.h>
14 #include <linux/err.h>
15 #include <linux/hwmon.h>
16 #include <linux/i2c.h>
17 #include <linux/module.h>
18 #include <linux/regmap.h>
19 #include <linux/rtc.h>
20 #include <linux/slab.h>
22 #include <asm/byteorder.h>
24 /* RTC - Real time clock registers */
25 #define ISL12022_REG_SC 0x00
26 #define ISL12022_REG_MN 0x01
27 #define ISL12022_REG_HR 0x02
28 #define ISL12022_REG_DT 0x03
29 #define ISL12022_REG_MO 0x04
30 #define ISL12022_REG_YR 0x05
31 #define ISL12022_REG_DW 0x06
33 /* CSR - Control and status registers */
34 #define ISL12022_REG_SR 0x07
35 #define ISL12022_REG_INT 0x08
36 #define ISL12022_REG_PWR_VBAT 0x0a
37 #define ISL12022_REG_BETA 0x0d
39 /* ALARM - Alarm registers */
40 #define ISL12022_REG_SCA0 0x10
41 #define ISL12022_REG_MNA0 0x11
42 #define ISL12022_REG_HRA0 0x12
43 #define ISL12022_REG_DTA0 0x13
44 #define ISL12022_REG_MOA0 0x14
45 #define ISL12022_REG_DWA0 0x15
46 #define ISL12022_ALARM ISL12022_REG_SCA0
47 #define ISL12022_ALARM_LEN (ISL12022_REG_DWA0 - ISL12022_REG_SCA0 + 1)
49 /* TEMP - Temperature sensor registers */
50 #define ISL12022_REG_TEMP_L 0x28
52 /* ISL register bits */
53 #define ISL12022_HR_MIL (1 << 7) /* military or 24 hour time */
55 #define ISL12022_SR_ALM (1 << 4)
56 #define ISL12022_SR_LBAT85 (1 << 2)
57 #define ISL12022_SR_LBAT75 (1 << 1)
59 #define ISL12022_INT_ARST (1 << 7)
60 #define ISL12022_INT_WRTC (1 << 6)
61 #define ISL12022_INT_IM (1 << 5)
62 #define ISL12022_INT_FOBATB (1 << 4)
63 #define ISL12022_INT_FO_MASK GENMASK(3, 0)
64 #define ISL12022_INT_FO_OFF 0x0
65 #define ISL12022_INT_FO_32K 0x1
67 #define ISL12022_REG_VB85_MASK GENMASK(5, 3)
68 #define ISL12022_REG_VB75_MASK GENMASK(2, 0)
70 #define ISL12022_ALARM_ENABLE (1 << 7) /* for all ALARM registers */
72 #define ISL12022_BETA_TSE (1 << 7)
74 static struct i2c_driver isl12022_driver
;
77 struct rtc_device
*rtc
;
78 struct regmap
*regmap
;
83 static umode_t
isl12022_hwmon_is_visible(const void *data
,
84 enum hwmon_sensor_types type
,
85 u32 attr
, int channel
)
87 if (type
== hwmon_temp
&& attr
== hwmon_temp_input
)
94 * A user-initiated temperature conversion is not started by this function,
95 * so the temperature is updated once every ~60 seconds.
97 static int isl12022_hwmon_read_temp(struct device
*dev
, long *mC
)
99 struct regmap
*regmap
= dev_get_drvdata(dev
);
103 ret
= regmap_bulk_read(regmap
, ISL12022_REG_TEMP_L
, &buf
, sizeof(buf
));
107 * Temperature is represented as a 10-bit number, unit half-Kelvins.
109 temp
= le16_to_cpu(buf
);
118 static int isl12022_hwmon_read(struct device
*dev
,
119 enum hwmon_sensor_types type
,
120 u32 attr
, int channel
, long *val
)
122 if (type
== hwmon_temp
&& attr
== hwmon_temp_input
)
123 return isl12022_hwmon_read_temp(dev
, val
);
128 static const struct hwmon_channel_info
* const isl12022_hwmon_info
[] = {
129 HWMON_CHANNEL_INFO(temp
, HWMON_T_INPUT
),
133 static const struct hwmon_ops isl12022_hwmon_ops
= {
134 .is_visible
= isl12022_hwmon_is_visible
,
135 .read
= isl12022_hwmon_read
,
138 static const struct hwmon_chip_info isl12022_hwmon_chip_info
= {
139 .ops
= &isl12022_hwmon_ops
,
140 .info
= isl12022_hwmon_info
,
143 static void isl12022_hwmon_register(struct device
*dev
)
145 struct isl12022
*isl12022
= dev_get_drvdata(dev
);
146 struct regmap
*regmap
= isl12022
->regmap
;
147 struct device
*hwmon
;
150 if (!IS_REACHABLE(CONFIG_HWMON
))
153 ret
= regmap_update_bits(regmap
, ISL12022_REG_BETA
,
154 ISL12022_BETA_TSE
, ISL12022_BETA_TSE
);
156 dev_warn(dev
, "unable to enable temperature sensor\n");
160 hwmon
= devm_hwmon_device_register_with_info(dev
, "isl12022", regmap
,
161 &isl12022_hwmon_chip_info
,
164 dev_warn(dev
, "unable to register hwmon device: %pe\n", hwmon
);
168 * In the routines that deal directly with the isl12022 hardware, we use
169 * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.
171 static int isl12022_rtc_read_time(struct device
*dev
, struct rtc_time
*tm
)
173 struct isl12022
*isl12022
= dev_get_drvdata(dev
);
174 struct regmap
*regmap
= isl12022
->regmap
;
175 u8 buf
[ISL12022_REG_INT
+ 1];
178 ret
= regmap_bulk_read(regmap
, ISL12022_REG_SC
, buf
, sizeof(buf
));
183 "raw data is sec=%02x, min=%02x, hr=%02x, mday=%02x, mon=%02x, year=%02x, wday=%02x, sr=%02x, int=%02x",
184 buf
[ISL12022_REG_SC
],
185 buf
[ISL12022_REG_MN
],
186 buf
[ISL12022_REG_HR
],
187 buf
[ISL12022_REG_DT
],
188 buf
[ISL12022_REG_MO
],
189 buf
[ISL12022_REG_YR
],
190 buf
[ISL12022_REG_DW
],
191 buf
[ISL12022_REG_SR
],
192 buf
[ISL12022_REG_INT
]);
194 tm
->tm_sec
= bcd2bin(buf
[ISL12022_REG_SC
] & 0x7F);
195 tm
->tm_min
= bcd2bin(buf
[ISL12022_REG_MN
] & 0x7F);
196 tm
->tm_hour
= bcd2bin(buf
[ISL12022_REG_HR
] & 0x3F);
197 tm
->tm_mday
= bcd2bin(buf
[ISL12022_REG_DT
] & 0x3F);
198 tm
->tm_wday
= buf
[ISL12022_REG_DW
] & 0x07;
199 tm
->tm_mon
= bcd2bin(buf
[ISL12022_REG_MO
] & 0x1F) - 1;
200 tm
->tm_year
= bcd2bin(buf
[ISL12022_REG_YR
]) + 100;
202 dev_dbg(dev
, "%s: %ptR\n", __func__
, tm
);
207 static int isl12022_rtc_set_time(struct device
*dev
, struct rtc_time
*tm
)
209 struct isl12022
*isl12022
= dev_get_drvdata(dev
);
210 struct regmap
*regmap
= isl12022
->regmap
;
212 u8 buf
[ISL12022_REG_DW
+ 1];
214 dev_dbg(dev
, "%s: %ptR\n", __func__
, tm
);
216 /* Ensure the write enable bit is set. */
217 ret
= regmap_update_bits(regmap
, ISL12022_REG_INT
,
218 ISL12022_INT_WRTC
, ISL12022_INT_WRTC
);
222 /* hours, minutes and seconds */
223 buf
[ISL12022_REG_SC
] = bin2bcd(tm
->tm_sec
);
224 buf
[ISL12022_REG_MN
] = bin2bcd(tm
->tm_min
);
225 buf
[ISL12022_REG_HR
] = bin2bcd(tm
->tm_hour
) | ISL12022_HR_MIL
;
227 buf
[ISL12022_REG_DT
] = bin2bcd(tm
->tm_mday
);
230 buf
[ISL12022_REG_MO
] = bin2bcd(tm
->tm_mon
+ 1);
232 /* year and century */
233 buf
[ISL12022_REG_YR
] = bin2bcd(tm
->tm_year
% 100);
235 buf
[ISL12022_REG_DW
] = tm
->tm_wday
& 0x07;
237 return regmap_bulk_write(regmap
, ISL12022_REG_SC
, buf
, sizeof(buf
));
240 static int isl12022_rtc_read_alarm(struct device
*dev
, struct rtc_wkalrm
*alarm
)
242 struct rtc_time
*tm
= &alarm
->time
;
243 struct isl12022
*isl12022
= dev_get_drvdata(dev
);
244 struct regmap
*regmap
= isl12022
->regmap
;
245 u8 buf
[ISL12022_ALARM_LEN
];
249 ret
= regmap_bulk_read(regmap
, ISL12022_ALARM
, buf
, sizeof(buf
));
251 dev_dbg(dev
, "%s: reading ALARM registers failed\n",
256 /* The alarm doesn't store the year so get it from the rtc section */
257 ret
= regmap_read(regmap
, ISL12022_REG_YR
, &yr
);
259 dev_dbg(dev
, "%s: reading YR register failed\n", __func__
);
264 "%s: sc=%02x, mn=%02x, hr=%02x, dt=%02x, mo=%02x, dw=%02x yr=%u\n",
265 __func__
, buf
[0], buf
[1], buf
[2], buf
[3], buf
[4], buf
[5], yr
);
267 tm
->tm_sec
= bcd2bin(buf
[ISL12022_REG_SCA0
- ISL12022_ALARM
] & 0x7F);
268 tm
->tm_min
= bcd2bin(buf
[ISL12022_REG_MNA0
- ISL12022_ALARM
] & 0x7F);
269 tm
->tm_hour
= bcd2bin(buf
[ISL12022_REG_HRA0
- ISL12022_ALARM
] & 0x3F);
270 tm
->tm_mday
= bcd2bin(buf
[ISL12022_REG_DTA0
- ISL12022_ALARM
] & 0x3F);
271 tm
->tm_mon
= bcd2bin(buf
[ISL12022_REG_MOA0
- ISL12022_ALARM
] & 0x1F) - 1;
272 tm
->tm_wday
= buf
[ISL12022_REG_DWA0
- ISL12022_ALARM
] & 0x07;
273 tm
->tm_year
= bcd2bin(yr
) + 100;
275 for (i
= 0; i
< ISL12022_ALARM_LEN
; i
++) {
276 if (buf
[i
] & ISL12022_ALARM_ENABLE
) {
282 dev_dbg(dev
, "%s: %ptR\n", __func__
, tm
);
287 static int isl12022_rtc_set_alarm(struct device
*dev
, struct rtc_wkalrm
*alarm
)
289 struct rtc_time
*alarm_tm
= &alarm
->time
;
290 struct isl12022
*isl12022
= dev_get_drvdata(dev
);
291 struct regmap
*regmap
= isl12022
->regmap
;
292 u8 regs
[ISL12022_ALARM_LEN
] = { 0, };
293 struct rtc_time rtc_tm
;
296 ret
= isl12022_rtc_read_time(dev
, &rtc_tm
);
300 /* If the alarm time is before the current time disable the alarm */
301 if (!alarm
->enabled
|| rtc_tm_sub(alarm_tm
, &rtc_tm
) <= 0)
304 enable
= ISL12022_ALARM_ENABLE
;
307 * Set non-matching day of the week to safeguard against early false
308 * matching while setting all the alarm registers (this rtc lacks a
309 * general alarm/irq enable/disable bit).
311 ret
= regmap_read(regmap
, ISL12022_REG_DW
, &dw
);
313 dev_dbg(dev
, "%s: reading DW failed\n", __func__
);
316 /* ~4 days into the future should be enough to avoid match */
317 dw
= ((dw
+ 4) % 7) | ISL12022_ALARM_ENABLE
;
318 ret
= regmap_write(regmap
, ISL12022_REG_DWA0
, dw
);
320 dev_dbg(dev
, "%s: writing DWA0 failed\n", __func__
);
324 /* Program the alarm and enable it for each setting */
325 regs
[ISL12022_REG_SCA0
- ISL12022_ALARM
] = bin2bcd(alarm_tm
->tm_sec
) | enable
;
326 regs
[ISL12022_REG_MNA0
- ISL12022_ALARM
] = bin2bcd(alarm_tm
->tm_min
) | enable
;
327 regs
[ISL12022_REG_HRA0
- ISL12022_ALARM
] = bin2bcd(alarm_tm
->tm_hour
) | enable
;
328 regs
[ISL12022_REG_DTA0
- ISL12022_ALARM
] = bin2bcd(alarm_tm
->tm_mday
) | enable
;
329 regs
[ISL12022_REG_MOA0
- ISL12022_ALARM
] = bin2bcd(alarm_tm
->tm_mon
+ 1) | enable
;
330 regs
[ISL12022_REG_DWA0
- ISL12022_ALARM
] = bin2bcd(alarm_tm
->tm_wday
& 7) | enable
;
332 /* write ALARM registers */
333 ret
= regmap_bulk_write(regmap
, ISL12022_ALARM
, ®s
, sizeof(regs
));
335 dev_dbg(dev
, "%s: writing ALARM registers failed\n", __func__
);
342 static irqreturn_t
isl12022_rtc_interrupt(int irq
, void *data
)
344 struct isl12022
*isl12022
= data
;
345 struct rtc_device
*rtc
= isl12022
->rtc
;
346 struct device
*dev
= &rtc
->dev
;
347 struct regmap
*regmap
= isl12022
->regmap
;
349 unsigned long events
= 0;
352 ret
= regmap_read(regmap
, ISL12022_REG_SR
, &val
);
354 dev_dbg(dev
, "%s: reading SR failed\n", __func__
);
358 if (val
& ISL12022_SR_ALM
)
359 events
|= RTC_IRQF
| RTC_AF
;
362 dev_dbg(dev
, "alarm!\n");
367 rtc_update_irq(rtc
, 1, events
);
371 static int isl12022_rtc_alarm_irq_enable(struct device
*dev
,
372 unsigned int enabled
)
374 struct isl12022
*isl12022
= dev_get_drvdata(dev
);
376 /* Make sure enabled is 0 or 1 */
379 if (isl12022
->irq_enabled
== enabled
)
383 enable_irq(isl12022
->irq
);
385 disable_irq(isl12022
->irq
);
387 isl12022
->irq_enabled
= enabled
;
392 static int isl12022_setup_irq(struct device
*dev
, int irq
)
394 struct isl12022
*isl12022
= dev_get_drvdata(dev
);
395 struct regmap
*regmap
= isl12022
->regmap
;
396 unsigned int reg_mask
, reg_val
;
397 u8 buf
[ISL12022_ALARM_LEN
] = { 0, };
400 /* Clear and disable all alarm registers */
401 ret
= regmap_bulk_write(regmap
, ISL12022_ALARM
, buf
, sizeof(buf
));
406 * Enable automatic reset of ALM bit and enable single event interrupt
409 reg_mask
= ISL12022_INT_ARST
| ISL12022_INT_IM
| ISL12022_INT_FO_MASK
;
410 reg_val
= ISL12022_INT_ARST
| ISL12022_INT_FO_OFF
;
411 ret
= regmap_write_bits(regmap
, ISL12022_REG_INT
,
416 ret
= devm_request_threaded_irq(dev
, irq
, NULL
,
417 isl12022_rtc_interrupt
,
418 IRQF_SHARED
| IRQF_ONESHOT
,
419 isl12022_driver
.driver
.name
,
422 return dev_err_probe(dev
, ret
, "Unable to request irq %d\n", irq
);
428 static int isl12022_rtc_ioctl(struct device
*dev
, unsigned int cmd
, unsigned long arg
)
430 struct isl12022
*isl12022
= dev_get_drvdata(dev
);
431 struct regmap
*regmap
= isl12022
->regmap
;
437 ret
= regmap_read(regmap
, ISL12022_REG_SR
, &val
);
442 if (val
& ISL12022_SR_LBAT85
)
443 user
|= RTC_VL_BACKUP_LOW
;
445 if (val
& ISL12022_SR_LBAT75
)
446 user
|= RTC_VL_BACKUP_EMPTY
;
448 return put_user(user
, (u32 __user
*)arg
);
455 static const struct rtc_class_ops isl12022_rtc_ops
= {
456 .ioctl
= isl12022_rtc_ioctl
,
457 .read_time
= isl12022_rtc_read_time
,
458 .set_time
= isl12022_rtc_set_time
,
459 .read_alarm
= isl12022_rtc_read_alarm
,
460 .set_alarm
= isl12022_rtc_set_alarm
,
461 .alarm_irq_enable
= isl12022_rtc_alarm_irq_enable
,
464 static const struct regmap_config regmap_config
= {
467 .use_single_write
= true,
470 static int isl12022_register_clock(struct device
*dev
)
472 struct isl12022
*isl12022
= dev_get_drvdata(dev
);
473 struct regmap
*regmap
= isl12022
->regmap
;
477 if (!device_property_present(dev
, "#clock-cells")) {
479 * Disabling the F_OUT pin reduces the power
480 * consumption in battery mode by ~25%.
482 regmap_update_bits(regmap
, ISL12022_REG_INT
, ISL12022_INT_FO_MASK
,
483 ISL12022_INT_FO_OFF
);
488 if (!IS_ENABLED(CONFIG_COMMON_CLK
))
492 * For now, only support a fixed clock of 32768Hz (the reset default).
494 ret
= regmap_update_bits(regmap
, ISL12022_REG_INT
,
495 ISL12022_INT_FO_MASK
, ISL12022_INT_FO_32K
);
499 hw
= devm_clk_hw_register_fixed_rate(dev
, "isl12022", NULL
, 0, 32768);
503 return devm_of_clk_add_hw_provider(dev
, of_clk_hw_simple_get
, hw
);
506 static const u32 trip_levels
[2][7] = {
507 { 2125000, 2295000, 2550000, 2805000, 3060000, 4250000, 4675000 },
508 { 1875000, 2025000, 2250000, 2475000, 2700000, 3750000, 4125000 },
511 static void isl12022_set_trip_levels(struct device
*dev
)
513 struct isl12022
*isl12022
= dev_get_drvdata(dev
);
514 struct regmap
*regmap
= isl12022
->regmap
;
515 u32 levels
[2] = {0, 0};
519 device_property_read_u32_array(dev
, "isil,battery-trip-levels-microvolt",
522 for (i
= 0; i
< 2; i
++) {
523 for (j
= 0; j
< ARRAY_SIZE(trip_levels
[i
]) - 1; j
++) {
524 if (levels
[i
] <= trip_levels
[i
][j
])
530 val
= FIELD_PREP(ISL12022_REG_VB85_MASK
, x
[0]) |
531 FIELD_PREP(ISL12022_REG_VB75_MASK
, x
[1]);
532 mask
= ISL12022_REG_VB85_MASK
| ISL12022_REG_VB75_MASK
;
534 ret
= regmap_update_bits(regmap
, ISL12022_REG_PWR_VBAT
, mask
, val
);
536 dev_warn(dev
, "unable to set battery alarm levels: %d\n", ret
);
539 * Force a write of the TSE bit in the BETA register, in order
540 * to trigger an update of the LBAT75 and LBAT85 bits in the
541 * status register. In battery backup mode, those bits have
542 * another meaning, so without this, they may contain stale
543 * values for up to a minute after power-on.
545 regmap_write_bits(regmap
, ISL12022_REG_BETA
,
546 ISL12022_BETA_TSE
, ISL12022_BETA_TSE
);
549 static int isl12022_probe(struct i2c_client
*client
)
551 struct isl12022
*isl12022
;
552 struct rtc_device
*rtc
;
553 struct regmap
*regmap
;
556 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
))
559 /* Allocate driver state */
560 isl12022
= devm_kzalloc(&client
->dev
, sizeof(*isl12022
), GFP_KERNEL
);
564 regmap
= devm_regmap_init_i2c(client
, ®map_config
);
566 return dev_err_probe(&client
->dev
, PTR_ERR(regmap
), "regmap allocation failed\n");
567 isl12022
->regmap
= regmap
;
569 dev_set_drvdata(&client
->dev
, isl12022
);
571 ret
= isl12022_register_clock(&client
->dev
);
575 isl12022_set_trip_levels(&client
->dev
);
576 isl12022_hwmon_register(&client
->dev
);
578 rtc
= devm_rtc_allocate_device(&client
->dev
);
583 rtc
->ops
= &isl12022_rtc_ops
;
584 rtc
->range_min
= RTC_TIMESTAMP_BEGIN_2000
;
585 rtc
->range_max
= RTC_TIMESTAMP_END_2099
;
587 if (client
->irq
> 0) {
588 ret
= isl12022_setup_irq(&client
->dev
, client
->irq
);
592 clear_bit(RTC_FEATURE_ALARM
, rtc
->features
);
595 return devm_rtc_register_device(rtc
);
598 static const struct of_device_id isl12022_dt_match
[] = {
599 { .compatible
= "isl,isl12022" }, /* for backward compat., don't use */
600 { .compatible
= "isil,isl12022" },
603 MODULE_DEVICE_TABLE(of
, isl12022_dt_match
);
605 static const struct i2c_device_id isl12022_id
[] = {
609 MODULE_DEVICE_TABLE(i2c
, isl12022_id
);
611 static struct i2c_driver isl12022_driver
= {
613 .name
= "rtc-isl12022",
614 .of_match_table
= isl12022_dt_match
,
616 .probe
= isl12022_probe
,
617 .id_table
= isl12022_id
,
620 module_i2c_driver(isl12022_driver
);
622 MODULE_AUTHOR("roman.fietze@telemotive.de");
623 MODULE_DESCRIPTION("ISL 12022 RTC driver");
624 MODULE_LICENSE("GPL");