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()
127 ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count); in timestamp0_show()
134 ret = regmap_bulk_read(rv3028->regmap, RV3028_TS_SEC, date, in timestamp0_show()
143 tm.tm_mon = bcd2bin(date[4]) - 1; in timestamp0_show()
159 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent); in timestamp0_count_show()
163 ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count); in timestamp0_count_show()
187 return regmap_update_bits(rv3028->regmap, RV3028_CTRL1, RV3028_CTRL1_EERD, 0); in rv3028_exit_eerd()
195 ret = regmap_read(rv3028->regmap, RV3028_CTRL1, &ctrl1); in rv3028_enter_eerd()
203 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL1, in rv3028_enter_eerd()
208 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_enter_eerd()
225 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0); in rv3028_update_eeprom()
229 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, RV3028_EEPROM_CMD_UPDATE); in rv3028_update_eeprom()
235 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_update_eeprom()
255 ret = regmap_update_bits(rv3028->regmap, reg, mask, val); in rv3028_update_cfg()
270 if (regmap_read(rv3028->regmap, RV3028_STATUS, &status) < 0 || in rv3028_handle_irq()
296 rtc_update_irq(rv3028->rtc, 1, events); in rv3028_handle_irq()
297 regmap_update_bits(rv3028->regmap, RV3028_STATUS, status, 0); in rv3028_handle_irq()
298 regmap_update_bits(rv3028->regmap, RV3028_CTRL2, ctrl, 0); in rv3028_handle_irq()
302 sysfs_notify(&rv3028->rtc->dev.kobj, NULL, in rv3028_handle_irq()
304 dev_warn(&rv3028->rtc->dev, "event detected"); in rv3028_handle_irq()
316 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_get_time()
321 return -EINVAL; in rv3028_get_time()
323 ret = regmap_bulk_read(rv3028->regmap, RV3028_SEC, date, sizeof(date)); in rv3028_get_time()
327 tm->tm_sec = bcd2bin(date[RV3028_SEC] & 0x7f); in rv3028_get_time()
328 tm->tm_min = bcd2bin(date[RV3028_MIN] & 0x7f); in rv3028_get_time()
329 tm->tm_hour = bcd2bin(date[RV3028_HOUR] & 0x3f); in rv3028_get_time()
330 tm->tm_wday = date[RV3028_WDAY] & 0x7f; in rv3028_get_time()
331 tm->tm_mday = bcd2bin(date[RV3028_DAY] & 0x3f); in rv3028_get_time()
332 tm->tm_mon = bcd2bin(date[RV3028_MONTH] & 0x1f) - 1; in rv3028_get_time()
333 tm->tm_year = bcd2bin(date[RV3028_YEAR]) + 100; in rv3028_get_time()
344 date[RV3028_SEC] = bin2bcd(tm->tm_sec); in rv3028_set_time()
345 date[RV3028_MIN] = bin2bcd(tm->tm_min); in rv3028_set_time()
346 date[RV3028_HOUR] = bin2bcd(tm->tm_hour); in rv3028_set_time()
347 date[RV3028_WDAY] = tm->tm_wday; in rv3028_set_time()
348 date[RV3028_DAY] = bin2bcd(tm->tm_mday); in rv3028_set_time()
349 date[RV3028_MONTH] = bin2bcd(tm->tm_mon + 1); in rv3028_set_time()
350 date[RV3028_YEAR] = bin2bcd(tm->tm_year - 100); in rv3028_set_time()
356 ret = regmap_bulk_write(rv3028->regmap, RV3028_SEC, date, in rv3028_set_time()
361 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_set_time()
373 ret = regmap_bulk_read(rv3028->regmap, RV3028_ALARM_MIN, alarmvals, in rv3028_get_alarm()
378 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_get_alarm()
382 ret = regmap_read(rv3028->regmap, RV3028_CTRL2, &ctrl); in rv3028_get_alarm()
386 alrm->time.tm_sec = 0; in rv3028_get_alarm()
387 alrm->time.tm_min = bcd2bin(alarmvals[0] & 0x7f); in rv3028_get_alarm()
388 alrm->time.tm_hour = bcd2bin(alarmvals[1] & 0x3f); in rv3028_get_alarm()
389 alrm->time.tm_mday = bcd2bin(alarmvals[2] & 0x3f); in rv3028_get_alarm()
391 alrm->enabled = !!(ctrl & RV3028_CTRL2_AIE); in rv3028_get_alarm()
392 alrm->pending = (status & RV3028_STATUS_AF) && alrm->enabled; in rv3028_get_alarm()
405 if (alrm->time.tm_sec) { in rv3028_set_alarm()
406 time64_t alarm_time = rtc_tm_to_time64(&alrm->time); in rv3028_set_alarm()
408 alarm_time += 60 - alrm->time.tm_sec; in rv3028_set_alarm()
409 rtc_time64_to_tm(alarm_time, &alrm->time); in rv3028_set_alarm()
412 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_set_alarm()
417 alarmvals[0] = bin2bcd(alrm->time.tm_min); in rv3028_set_alarm()
418 alarmvals[1] = bin2bcd(alrm->time.tm_hour); in rv3028_set_alarm()
419 alarmvals[2] = bin2bcd(alrm->time.tm_mday); in rv3028_set_alarm()
421 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_set_alarm()
426 ret = regmap_bulk_write(rv3028->regmap, RV3028_ALARM_MIN, alarmvals, in rv3028_set_alarm()
431 if (alrm->enabled) { in rv3028_set_alarm()
432 if (rv3028->rtc->uie_rtctimer.enabled) in rv3028_set_alarm()
434 if (rv3028->rtc->aie_timer.enabled) in rv3028_set_alarm()
438 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_set_alarm()
450 if (rv3028->rtc->uie_rtctimer.enabled) in rv3028_alarm_irq_enable()
452 if (rv3028->rtc->aie_timer.enabled) in rv3028_alarm_irq_enable()
456 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_alarm_irq_enable()
461 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_alarm_irq_enable()
474 ret = regmap_read(rv3028->regmap, RV3028_OFFSET, &value); in rv3028_read_offset()
480 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value); in rv3028_read_offset()
497 offset = clamp(offset, -244141L, 243187L) * 1000; in rv3028_set_offset()
504 ret = regmap_write(rv3028->regmap, RV3028_OFFSET, offset >> 1); in rv3028_set_offset()
508 ret = regmap_update_bits(rv3028->regmap, RV3028_BACKUP, BIT(7), in rv3028_set_offset()
528 switch(param->param) { in rv3028_param_get()
530 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value); in rv3028_param_get()
538 param->uvalue = RTC_BSM_DIRECT; in rv3028_param_get()
541 param->uvalue = RTC_BSM_LEVEL; in rv3028_param_get()
544 param->uvalue = RTC_BSM_DISABLED; in rv3028_param_get()
549 return -EINVAL; in rv3028_param_get()
560 switch(param->param) { in rv3028_param_set()
562 switch (param->uvalue) { in rv3028_param_set()
573 return -EINVAL; in rv3028_param_set()
580 return -EINVAL; in rv3028_param_set()
593 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_ioctl()
601 return -ENOIOCTLCMD; in rv3028_ioctl()
630 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_ADDR, offset + i); in rv3028_eeprom_write()
634 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_DATA, buf[i]); in rv3028_eeprom_write()
638 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0); in rv3028_eeprom_write()
642 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, in rv3028_eeprom_write()
649 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_eeprom_write()
676 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_ADDR, offset + i); in rv3028_eeprom_read()
680 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0); in rv3028_eeprom_read()
684 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, in rv3028_eeprom_read()
689 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_eeprom_read()
696 ret = regmap_read(rv3028->regmap, RV3028_EEPROM_DATA, &data); in rv3028_eeprom_read()
726 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &clkout); in rv3028_clkout_recalc_rate()
753 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &enabled); in rv3028_clkout_set_rate()
757 ret = regmap_write(rv3028->regmap, RV3028_CLKOUT, 0x0); in rv3028_clkout_set_rate()
768 return -EINVAL; in rv3028_clkout_set_rate()
775 return regmap_write(rv3028->regmap, RV3028_CLKOUT, in rv3028_clkout_prepare()
783 regmap_write(rv3028->regmap, RV3028_CLKOUT, 0x0); in rv3028_clkout_unprepare()
784 regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_clkout_unprepare()
793 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &clkout); in rv3028_clkout_is_prepared()
815 struct device_node *node = client->dev.of_node; in rv3028_clkout_register_clk()
817 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_clkout_register_clk()
822 init.name = "rv3028-clkout"; in rv3028_clkout_register_clk()
827 rv3028->clkout_hw.init = &init; in rv3028_clkout_register_clk()
830 of_property_read_string(node, "clock-output-names", &init.name); in rv3028_clkout_register_clk()
833 clk = devm_clk_register(&client->dev, &rv3028->clkout_hw); in rv3028_clkout_register_clk()
864 u32 ohms, chargeable; in rv3028_set_trickle_charger() local
866 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old); in rv3028_set_trickle_charger()
870 /* mask out only trickle charger bits */ in rv3028_set_trickle_charger()
874 /* setup trickle charger */ in rv3028_set_trickle_charger()
875 if (!device_property_read_u32(&client->dev, "trickle-resistor-ohms", in rv3028_set_trickle_charger()
876 &ohms)) { in rv3028_set_trickle_charger()
880 if (ohms == rv3028_trickle_resistors[i]) in rv3028_set_trickle_charger()
884 /* enable trickle charger and its resistor */ in rv3028_set_trickle_charger()
887 dev_warn(&client->dev, "invalid trickle resistor value\n"); in rv3028_set_trickle_charger()
891 if (!device_property_read_u32(&client->dev, "aux-voltage-chargeable", in rv3028_set_trickle_charger()
901 dev_warn(&client->dev, in rv3028_set_trickle_charger()
902 "unsupported aux-voltage-chargeable value\n"); in rv3028_set_trickle_charger()
941 rv3028 = devm_kzalloc(&client->dev, sizeof(struct rv3028_data), in rv3028_probe()
944 return -ENOMEM; in rv3028_probe()
946 rv3028->regmap = devm_regmap_init_i2c(client, &regmap_config); in rv3028_probe()
947 if (IS_ERR(rv3028->regmap)) in rv3028_probe()
948 return PTR_ERR(rv3028->regmap); in rv3028_probe()
952 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_probe()
957 dev_warn(&client->dev, "An alarm may have been missed.\n"); in rv3028_probe()
959 rv3028->rtc = devm_rtc_allocate_device(&client->dev); in rv3028_probe()
960 if (IS_ERR(rv3028->rtc)) in rv3028_probe()
961 return PTR_ERR(rv3028->rtc); in rv3028_probe()
963 if (client->irq > 0) { in rv3028_probe()
970 if (dev_fwnode(&client->dev)) in rv3028_probe()
975 ret = devm_request_threaded_irq(&client->dev, client->irq, in rv3028_probe()
980 dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n"); in rv3028_probe()
981 client->irq = 0; in rv3028_probe()
984 if (!client->irq) in rv3028_probe()
985 clear_bit(RTC_FEATURE_ALARM, rv3028->rtc->features); in rv3028_probe()
987 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL1, in rv3028_probe()
993 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_probe()
1003 ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group); in rv3028_probe()
1007 set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3028->rtc->features); in rv3028_probe()
1009 rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in rv3028_probe()
1010 rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099; in rv3028_probe()
1011 rv3028->rtc->ops = &rv3028_rtc_ops; in rv3028_probe()
1012 ret = devm_rtc_register_device(rv3028->rtc); in rv3028_probe()
1016 nvmem_cfg.priv = rv3028->regmap; in rv3028_probe()
1017 devm_rtc_nvmem_register(rv3028->rtc, &nvmem_cfg); in rv3028_probe()
1019 devm_rtc_nvmem_register(rv3028->rtc, &eeprom_cfg); in rv3028_probe()
1021 rv3028->rtc->max_user_freq = 1; in rv3028_probe()
1049 .name = "rtc-rv3028",