Lines Matching +full:battery +full:- +full:trip +full:- +full:levels +full:- +full:microvolt

1 // SPDX-License-Identifier: GPL-2.0-only
13 #include <linux/clk-provider.h>
24 /* RTC - Real time clock registers */
33 /* CSR - Control and status registers */
39 /* ALARM - Alarm registers */
47 #define ISL12022_ALARM_LEN (ISL12022_REG_DWA0 - ISL12022_REG_SCA0 + 1)
49 /* TEMP - Temperature sensor registers */
94 * A user-initiated temperature conversion is not started by this function,
107 * Temperature is represented as a 10-bit number, unit half-Kelvins. in isl12022_hwmon_read_temp()
111 temp -= 273000; in isl12022_hwmon_read_temp()
125 return -EOPNOTSUPP; in isl12022_hwmon_read()
146 struct regmap *regmap = isl12022->regmap; in isl12022_hwmon_register()
169 * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.
174 struct regmap *regmap = isl12022->regmap; in isl12022_rtc_read_time()
194 tm->tm_sec = bcd2bin(buf[ISL12022_REG_SC] & 0x7F); in isl12022_rtc_read_time()
195 tm->tm_min = bcd2bin(buf[ISL12022_REG_MN] & 0x7F); in isl12022_rtc_read_time()
196 tm->tm_hour = bcd2bin(buf[ISL12022_REG_HR] & 0x3F); in isl12022_rtc_read_time()
197 tm->tm_mday = bcd2bin(buf[ISL12022_REG_DT] & 0x3F); in isl12022_rtc_read_time()
198 tm->tm_wday = buf[ISL12022_REG_DW] & 0x07; in isl12022_rtc_read_time()
199 tm->tm_mon = bcd2bin(buf[ISL12022_REG_MO] & 0x1F) - 1; in isl12022_rtc_read_time()
200 tm->tm_year = bcd2bin(buf[ISL12022_REG_YR]) + 100; in isl12022_rtc_read_time()
210 struct regmap *regmap = isl12022->regmap; in isl12022_rtc_set_time()
223 buf[ISL12022_REG_SC] = bin2bcd(tm->tm_sec); in isl12022_rtc_set_time()
224 buf[ISL12022_REG_MN] = bin2bcd(tm->tm_min); in isl12022_rtc_set_time()
225 buf[ISL12022_REG_HR] = bin2bcd(tm->tm_hour) | ISL12022_HR_MIL; in isl12022_rtc_set_time()
227 buf[ISL12022_REG_DT] = bin2bcd(tm->tm_mday); in isl12022_rtc_set_time()
229 /* month, 1 - 12 */ in isl12022_rtc_set_time()
230 buf[ISL12022_REG_MO] = bin2bcd(tm->tm_mon + 1); in isl12022_rtc_set_time()
233 buf[ISL12022_REG_YR] = bin2bcd(tm->tm_year % 100); in isl12022_rtc_set_time()
235 buf[ISL12022_REG_DW] = tm->tm_wday & 0x07; in isl12022_rtc_set_time()
242 struct rtc_time *tm = &alarm->time; in isl12022_rtc_read_alarm()
244 struct regmap *regmap = isl12022->regmap; in isl12022_rtc_read_alarm()
267 tm->tm_sec = bcd2bin(buf[ISL12022_REG_SCA0 - ISL12022_ALARM] & 0x7F); in isl12022_rtc_read_alarm()
268 tm->tm_min = bcd2bin(buf[ISL12022_REG_MNA0 - ISL12022_ALARM] & 0x7F); in isl12022_rtc_read_alarm()
269 tm->tm_hour = bcd2bin(buf[ISL12022_REG_HRA0 - ISL12022_ALARM] & 0x3F); in isl12022_rtc_read_alarm()
270 tm->tm_mday = bcd2bin(buf[ISL12022_REG_DTA0 - ISL12022_ALARM] & 0x3F); in isl12022_rtc_read_alarm()
271 tm->tm_mon = bcd2bin(buf[ISL12022_REG_MOA0 - ISL12022_ALARM] & 0x1F) - 1; in isl12022_rtc_read_alarm()
272 tm->tm_wday = buf[ISL12022_REG_DWA0 - ISL12022_ALARM] & 0x07; in isl12022_rtc_read_alarm()
273 tm->tm_year = bcd2bin(yr) + 100; in isl12022_rtc_read_alarm()
277 alarm->enabled = 1; in isl12022_rtc_read_alarm()
289 struct rtc_time *alarm_tm = &alarm->time; in isl12022_rtc_set_alarm()
291 struct regmap *regmap = isl12022->regmap; in isl12022_rtc_set_alarm()
301 if (!alarm->enabled || rtc_tm_sub(alarm_tm, &rtc_tm) <= 0) in isl12022_rtc_set_alarm()
307 * Set non-matching day of the week to safeguard against early false in isl12022_rtc_set_alarm()
325 regs[ISL12022_REG_SCA0 - ISL12022_ALARM] = bin2bcd(alarm_tm->tm_sec) | enable; in isl12022_rtc_set_alarm()
326 regs[ISL12022_REG_MNA0 - ISL12022_ALARM] = bin2bcd(alarm_tm->tm_min) | enable; in isl12022_rtc_set_alarm()
327 regs[ISL12022_REG_HRA0 - ISL12022_ALARM] = bin2bcd(alarm_tm->tm_hour) | enable; in isl12022_rtc_set_alarm()
328 regs[ISL12022_REG_DTA0 - ISL12022_ALARM] = bin2bcd(alarm_tm->tm_mday) | enable; in isl12022_rtc_set_alarm()
329 regs[ISL12022_REG_MOA0 - ISL12022_ALARM] = bin2bcd(alarm_tm->tm_mon + 1) | enable; in isl12022_rtc_set_alarm()
330 regs[ISL12022_REG_DWA0 - ISL12022_ALARM] = bin2bcd(alarm_tm->tm_wday & 7) | enable; in isl12022_rtc_set_alarm()
345 struct rtc_device *rtc = isl12022->rtc; in isl12022_rtc_interrupt()
346 struct device *dev = &rtc->dev; in isl12022_rtc_interrupt()
347 struct regmap *regmap = isl12022->regmap; in isl12022_rtc_interrupt()
379 if (isl12022->irq_enabled == enabled) in isl12022_rtc_alarm_irq_enable()
383 enable_irq(isl12022->irq); in isl12022_rtc_alarm_irq_enable()
385 disable_irq(isl12022->irq); in isl12022_rtc_alarm_irq_enable()
387 isl12022->irq_enabled = enabled; in isl12022_rtc_alarm_irq_enable()
395 struct regmap *regmap = isl12022->regmap; in isl12022_setup_irq()
424 isl12022->irq = irq; in isl12022_setup_irq()
431 struct regmap *regmap = isl12022->regmap; in isl12022_rtc_ioctl()
451 return -ENOIOCTLCMD; in isl12022_rtc_ioctl()
473 struct regmap *regmap = isl12022->regmap; in isl12022_register_clock()
477 if (!device_property_present(dev, "#clock-cells")) { in isl12022_register_clock()
480 * consumption in battery mode by ~25%. in isl12022_register_clock()
514 struct regmap *regmap = isl12022->regmap; in isl12022_set_trip_levels()
515 u32 levels[2] = {0, 0}; in isl12022_set_trip_levels() local
519 device_property_read_u32_array(dev, "isil,battery-trip-levels-microvolt", in isl12022_set_trip_levels()
520 levels, 2); in isl12022_set_trip_levels()
523 for (j = 0; j < ARRAY_SIZE(trip_levels[i]) - 1; j++) { in isl12022_set_trip_levels()
524 if (levels[i] <= trip_levels[i][j]) in isl12022_set_trip_levels()
536 dev_warn(dev, "unable to set battery alarm levels: %d\n", ret); in isl12022_set_trip_levels()
541 * status register. In battery backup mode, those bits have in isl12022_set_trip_levels()
543 * values for up to a minute after power-on. in isl12022_set_trip_levels()
556 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in isl12022_probe()
557 return -ENODEV; in isl12022_probe()
560 isl12022 = devm_kzalloc(&client->dev, sizeof(*isl12022), GFP_KERNEL); in isl12022_probe()
562 return -ENOMEM; in isl12022_probe()
566 return dev_err_probe(&client->dev, PTR_ERR(regmap), "regmap allocation failed\n"); in isl12022_probe()
567 isl12022->regmap = regmap; in isl12022_probe()
569 dev_set_drvdata(&client->dev, isl12022); in isl12022_probe()
571 ret = isl12022_register_clock(&client->dev); in isl12022_probe()
575 isl12022_set_trip_levels(&client->dev); in isl12022_probe()
576 isl12022_hwmon_register(&client->dev); in isl12022_probe()
578 rtc = devm_rtc_allocate_device(&client->dev); in isl12022_probe()
581 isl12022->rtc = rtc; in isl12022_probe()
583 rtc->ops = &isl12022_rtc_ops; in isl12022_probe()
584 rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in isl12022_probe()
585 rtc->range_max = RTC_TIMESTAMP_END_2099; in isl12022_probe()
587 if (client->irq > 0) { in isl12022_probe()
588 ret = isl12022_setup_irq(&client->dev, client->irq); in isl12022_probe()
592 clear_bit(RTC_FEATURE_ALARM, rtc->features); in isl12022_probe()
613 .name = "rtc-isl12022",