Lines Matching +full:trickle +full:- +full:resistor +full:- +full:ohms

1 // SPDX-License-Identifier: GPL-2.0
11 #include <linux/clk-provider.h>
110 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent); in timestamp0_store()
112 regmap_update_bits(rv3028->regmap, RV3028_EVT_CTRL, RV3028_EVT_CTRL_TSR, in timestamp0_store()
121 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent); in timestamp0_show()
126 ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count); in timestamp0_show()
133 ret = regmap_bulk_read(rv3028->regmap, RV3028_TS_SEC, date, in timestamp0_show()
142 tm.tm_mon = bcd2bin(date[4]) - 1; in timestamp0_show()
158 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent); in timestamp0_count_show()
161 ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count); in timestamp0_count_show()
185 return regmap_update_bits(rv3028->regmap, RV3028_CTRL1, RV3028_CTRL1_EERD, 0); in rv3028_exit_eerd()
193 ret = regmap_read(rv3028->regmap, RV3028_CTRL1, &ctrl1); in rv3028_enter_eerd()
201 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL1, in rv3028_enter_eerd()
206 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_enter_eerd()
223 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0); in rv3028_update_eeprom()
227 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, RV3028_EEPROM_CMD_UPDATE); in rv3028_update_eeprom()
233 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_update_eeprom()
253 ret = regmap_update_bits(rv3028->regmap, reg, mask, val); in rv3028_update_cfg()
268 if (regmap_read(rv3028->regmap, RV3028_STATUS, &status) < 0 || in rv3028_handle_irq()
294 rtc_update_irq(rv3028->rtc, 1, events); in rv3028_handle_irq()
295 regmap_update_bits(rv3028->regmap, RV3028_STATUS, status, 0); in rv3028_handle_irq()
296 regmap_update_bits(rv3028->regmap, RV3028_CTRL2, ctrl, 0); in rv3028_handle_irq()
300 sysfs_notify(&rv3028->rtc->dev.kobj, NULL, in rv3028_handle_irq()
302 dev_warn(&rv3028->rtc->dev, "event detected"); in rv3028_handle_irq()
314 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_get_time()
319 return -EINVAL; in rv3028_get_time()
321 ret = regmap_bulk_read(rv3028->regmap, RV3028_SEC, date, sizeof(date)); in rv3028_get_time()
325 tm->tm_sec = bcd2bin(date[RV3028_SEC] & 0x7f); in rv3028_get_time()
326 tm->tm_min = bcd2bin(date[RV3028_MIN] & 0x7f); in rv3028_get_time()
327 tm->tm_hour = bcd2bin(date[RV3028_HOUR] & 0x3f); in rv3028_get_time()
328 tm->tm_wday = date[RV3028_WDAY] & 0x7f; in rv3028_get_time()
329 tm->tm_mday = bcd2bin(date[RV3028_DAY] & 0x3f); in rv3028_get_time()
330 tm->tm_mon = bcd2bin(date[RV3028_MONTH] & 0x1f) - 1; in rv3028_get_time()
331 tm->tm_year = bcd2bin(date[RV3028_YEAR]) + 100; in rv3028_get_time()
342 date[RV3028_SEC] = bin2bcd(tm->tm_sec); in rv3028_set_time()
343 date[RV3028_MIN] = bin2bcd(tm->tm_min); in rv3028_set_time()
344 date[RV3028_HOUR] = bin2bcd(tm->tm_hour); in rv3028_set_time()
345 date[RV3028_WDAY] = tm->tm_wday; in rv3028_set_time()
346 date[RV3028_DAY] = bin2bcd(tm->tm_mday); in rv3028_set_time()
347 date[RV3028_MONTH] = bin2bcd(tm->tm_mon + 1); in rv3028_set_time()
348 date[RV3028_YEAR] = bin2bcd(tm->tm_year - 100); in rv3028_set_time()
354 ret = regmap_bulk_write(rv3028->regmap, RV3028_SEC, date, in rv3028_set_time()
359 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_set_time()
371 ret = regmap_bulk_read(rv3028->regmap, RV3028_ALARM_MIN, alarmvals, in rv3028_get_alarm()
376 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_get_alarm()
380 ret = regmap_read(rv3028->regmap, RV3028_CTRL2, &ctrl); in rv3028_get_alarm()
384 alrm->time.tm_sec = 0; in rv3028_get_alarm()
385 alrm->time.tm_min = bcd2bin(alarmvals[0] & 0x7f); in rv3028_get_alarm()
386 alrm->time.tm_hour = bcd2bin(alarmvals[1] & 0x3f); in rv3028_get_alarm()
387 alrm->time.tm_mday = bcd2bin(alarmvals[2] & 0x3f); in rv3028_get_alarm()
389 alrm->enabled = !!(ctrl & RV3028_CTRL2_AIE); in rv3028_get_alarm()
390 alrm->pending = (status & RV3028_STATUS_AF) && alrm->enabled; in rv3028_get_alarm()
403 if (alrm->time.tm_sec) { in rv3028_set_alarm()
404 time64_t alarm_time = rtc_tm_to_time64(&alrm->time); in rv3028_set_alarm()
406 alarm_time += 60 - alrm->time.tm_sec; in rv3028_set_alarm()
407 rtc_time64_to_tm(alarm_time, &alrm->time); in rv3028_set_alarm()
410 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_set_alarm()
415 alarmvals[0] = bin2bcd(alrm->time.tm_min); in rv3028_set_alarm()
416 alarmvals[1] = bin2bcd(alrm->time.tm_hour); in rv3028_set_alarm()
417 alarmvals[2] = bin2bcd(alrm->time.tm_mday); in rv3028_set_alarm()
419 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_set_alarm()
424 ret = regmap_bulk_write(rv3028->regmap, RV3028_ALARM_MIN, alarmvals, in rv3028_set_alarm()
429 if (alrm->enabled) { in rv3028_set_alarm()
430 if (rv3028->rtc->uie_rtctimer.enabled) in rv3028_set_alarm()
432 if (rv3028->rtc->aie_timer.enabled) in rv3028_set_alarm()
436 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_set_alarm()
448 if (rv3028->rtc->uie_rtctimer.enabled) in rv3028_alarm_irq_enable()
450 if (rv3028->rtc->aie_timer.enabled) in rv3028_alarm_irq_enable()
454 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_alarm_irq_enable()
459 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_alarm_irq_enable()
472 ret = regmap_read(rv3028->regmap, RV3028_OFFSET, &value); in rv3028_read_offset()
478 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value); in rv3028_read_offset()
495 offset = clamp(offset, -244141L, 243187L) * 1000; in rv3028_set_offset()
502 ret = regmap_write(rv3028->regmap, RV3028_OFFSET, offset >> 1); in rv3028_set_offset()
506 ret = regmap_update_bits(rv3028->regmap, RV3028_BACKUP, BIT(7), in rv3028_set_offset()
526 switch(param->param) { in rv3028_param_get()
528 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value); in rv3028_param_get()
536 param->uvalue = RTC_BSM_DIRECT; in rv3028_param_get()
539 param->uvalue = RTC_BSM_LEVEL; in rv3028_param_get()
542 param->uvalue = RTC_BSM_DISABLED; in rv3028_param_get()
547 return -EINVAL; in rv3028_param_get()
558 switch(param->param) { in rv3028_param_set()
560 switch (param->uvalue) { in rv3028_param_set()
571 return -EINVAL; in rv3028_param_set()
578 return -EINVAL; in rv3028_param_set()
591 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_ioctl()
599 return -ENOIOCTLCMD; in rv3028_ioctl()
628 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_ADDR, offset + i); in rv3028_eeprom_write()
632 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_DATA, buf[i]); in rv3028_eeprom_write()
636 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0); in rv3028_eeprom_write()
640 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, in rv3028_eeprom_write()
647 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_eeprom_write()
674 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_ADDR, offset + i); in rv3028_eeprom_read()
678 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0); in rv3028_eeprom_read()
682 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, in rv3028_eeprom_read()
687 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_eeprom_read()
694 ret = regmap_read(rv3028->regmap, RV3028_EEPROM_DATA, &data); in rv3028_eeprom_read()
724 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &clkout); in rv3028_clkout_recalc_rate()
751 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &enabled); in rv3028_clkout_set_rate()
755 ret = regmap_write(rv3028->regmap, RV3028_CLKOUT, 0x0); in rv3028_clkout_set_rate()
766 return -EINVAL; in rv3028_clkout_set_rate()
773 return regmap_write(rv3028->regmap, RV3028_CLKOUT, in rv3028_clkout_prepare()
781 regmap_write(rv3028->regmap, RV3028_CLKOUT, 0x0); in rv3028_clkout_unprepare()
782 regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_clkout_unprepare()
791 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &clkout); in rv3028_clkout_is_prepared()
813 struct device_node *node = client->dev.of_node; in rv3028_clkout_register_clk()
815 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_clkout_register_clk()
820 init.name = "rv3028-clkout"; in rv3028_clkout_register_clk()
825 rv3028->clkout_hw.init = &init; in rv3028_clkout_register_clk()
828 of_property_read_string(node, "clock-output-names", &init.name); in rv3028_clkout_register_clk()
831 clk = devm_clk_register(&client->dev, &rv3028->clkout_hw); in rv3028_clkout_register_clk()
862 u32 ohms, chargeable; in rv3028_set_trickle_charger() local
864 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old); in rv3028_set_trickle_charger()
868 /* mask out only trickle charger bits */ in rv3028_set_trickle_charger()
872 /* setup trickle charger */ in rv3028_set_trickle_charger()
873 if (!device_property_read_u32(&client->dev, "trickle-resistor-ohms", in rv3028_set_trickle_charger()
874 &ohms)) { in rv3028_set_trickle_charger()
878 if (ohms == rv3028_trickle_resistors[i]) in rv3028_set_trickle_charger()
882 /* enable trickle charger and its resistor */ in rv3028_set_trickle_charger()
885 dev_warn(&client->dev, "invalid trickle resistor value\n"); in rv3028_set_trickle_charger()
889 if (!device_property_read_u32(&client->dev, "aux-voltage-chargeable", in rv3028_set_trickle_charger()
899 dev_warn(&client->dev, in rv3028_set_trickle_charger()
900 "unsupported aux-voltage-chargeable value\n"); in rv3028_set_trickle_charger()
939 rv3028 = devm_kzalloc(&client->dev, sizeof(struct rv3028_data), in rv3028_probe()
942 return -ENOMEM; in rv3028_probe()
944 rv3028->regmap = devm_regmap_init_i2c(client, &regmap_config); in rv3028_probe()
945 if (IS_ERR(rv3028->regmap)) in rv3028_probe()
946 return PTR_ERR(rv3028->regmap); in rv3028_probe()
950 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_probe()
955 dev_warn(&client->dev, "An alarm may have been missed.\n"); in rv3028_probe()
957 rv3028->rtc = devm_rtc_allocate_device(&client->dev); in rv3028_probe()
958 if (IS_ERR(rv3028->rtc)) in rv3028_probe()
959 return PTR_ERR(rv3028->rtc); in rv3028_probe()
961 if (client->irq > 0) { in rv3028_probe()
968 if (dev_fwnode(&client->dev)) in rv3028_probe()
973 ret = devm_request_threaded_irq(&client->dev, client->irq, in rv3028_probe()
978 dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n"); in rv3028_probe()
979 client->irq = 0; in rv3028_probe()
982 if (!client->irq) in rv3028_probe()
983 clear_bit(RTC_FEATURE_ALARM, rv3028->rtc->features); in rv3028_probe()
985 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL1, in rv3028_probe()
991 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_probe()
1001 ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group); in rv3028_probe()
1005 set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3028->rtc->features); in rv3028_probe()
1007 rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in rv3028_probe()
1008 rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099; in rv3028_probe()
1009 rv3028->rtc->ops = &rv3028_rtc_ops; in rv3028_probe()
1010 ret = devm_rtc_register_device(rv3028->rtc); in rv3028_probe()
1014 nvmem_cfg.priv = rv3028->regmap; in rv3028_probe()
1015 devm_rtc_nvmem_register(rv3028->rtc, &nvmem_cfg); in rv3028_probe()
1017 devm_rtc_nvmem_register(rv3028->rtc, &eeprom_cfg); in rv3028_probe()
1019 rv3028->rtc->max_user_freq = 1; in rv3028_probe()
1047 .name = "rtc-rv3028",