Lines Matching +full:vdet +full:- +full:disable
1 // SPDX-License-Identifier: GPL-2.0
88 while ((ret == -ENXIO || ret == -EIO) && --try); in rv8803_read_reg()
90 dev_err(&client->dev, "Unable to read register 0x%02x\n", reg); in rv8803_read_reg()
103 while ((ret == -ENXIO || ret == -EIO) && --try); in rv8803_read_regs()
105 dev_err(&client->dev, in rv8803_read_regs()
107 reg, reg + count - 1); in rv8803_read_regs()
108 return ret < 0 ? ret : -EIO; in rv8803_read_regs()
121 while ((ret == -ENXIO || ret == -EIO) && --try); in rv8803_write_reg()
123 dev_err(&client->dev, "Unable to write register 0x%02x\n", reg); in rv8803_write_reg()
137 while ((ret == -ENXIO || ret == -EIO) && --try); in rv8803_write_regs()
139 dev_err(&client->dev, in rv8803_write_regs()
141 reg, reg + count - 1); in rv8803_write_regs()
150 ret = rv8803_write_reg(rv8803->client, RV8803_OSC_OFFSET, 0x00); in rv8803_regs_init()
154 ret = rv8803_write_reg(rv8803->client, RV8803_CTRL, in rv8803_regs_init()
159 ret = rv8803_write_regs(rv8803->client, RV8803_ALARM_MIN, 3, in rv8803_regs_init()
164 return rv8803_write_reg(rv8803->client, RV8803_RAM, 0x00); in rv8803_regs_init()
172 * The RV-8803 resets all registers to POR defaults after voltage-loss, in rv8803_regs_reset()
175 if (full || rv8803->type == rx_8803 || rv8803->type == rx_8900) { in rv8803_regs_reset()
191 mutex_lock(&rv8803->flags_lock); in rv8803_handle_irq()
195 mutex_unlock(&rv8803->flags_lock); in rv8803_handle_irq()
200 dev_warn(&client->dev, "Voltage low, temperature compensation stopped.\n"); in rv8803_handle_irq()
203 dev_warn(&client->dev, "Voltage low, data loss detected.\n"); in rv8803_handle_irq()
207 rv8803->ctrl &= ~RV8803_CTRL_TIE; in rv8803_handle_irq()
213 rv8803->ctrl &= ~RV8803_CTRL_AIE; in rv8803_handle_irq()
219 rv8803->ctrl &= ~RV8803_CTRL_UIE; in rv8803_handle_irq()
224 rtc_update_irq(rv8803->rtc, 1, events); in rv8803_handle_irq()
226 rv8803_write_reg(rv8803->client, RV8803_CTRL, rv8803->ctrl); in rv8803_handle_irq()
229 mutex_unlock(&rv8803->flags_lock); in rv8803_handle_irq()
242 if (rv8803->alarm_invalid) { in rv8803_get_time()
244 return -EINVAL; in rv8803_get_time()
247 flags = rv8803_read_reg(rv8803->client, RV8803_FLAG); in rv8803_get_time()
253 return -EINVAL; in rv8803_get_time()
256 ret = rv8803_read_regs(rv8803->client, RV8803_SEC, 7, date); in rv8803_get_time()
261 ret = rv8803_read_regs(rv8803->client, RV8803_SEC, 7, date2); in rv8803_get_time()
269 tm->tm_sec = bcd2bin(date[RV8803_SEC] & 0x7f); in rv8803_get_time()
270 tm->tm_min = bcd2bin(date[RV8803_MIN] & 0x7f); in rv8803_get_time()
271 tm->tm_hour = bcd2bin(date[RV8803_HOUR] & 0x3f); in rv8803_get_time()
272 tm->tm_wday = ilog2(date[RV8803_WEEK] & 0x7f); in rv8803_get_time()
273 tm->tm_mday = bcd2bin(date[RV8803_DAY] & 0x3f); in rv8803_get_time()
274 tm->tm_mon = bcd2bin(date[RV8803_MONTH] & 0x1f) - 1; in rv8803_get_time()
275 tm->tm_year = bcd2bin(date[RV8803_YEAR]) + 100; in rv8803_get_time()
286 ctrl = rv8803_read_reg(rv8803->client, RV8803_CTRL); in rv8803_set_time()
291 ret = rv8803_write_reg(rv8803->client, RV8803_CTRL, in rv8803_set_time()
296 date[RV8803_SEC] = bin2bcd(tm->tm_sec); in rv8803_set_time()
297 date[RV8803_MIN] = bin2bcd(tm->tm_min); in rv8803_set_time()
298 date[RV8803_HOUR] = bin2bcd(tm->tm_hour); in rv8803_set_time()
299 date[RV8803_WEEK] = 1 << (tm->tm_wday); in rv8803_set_time()
300 date[RV8803_DAY] = bin2bcd(tm->tm_mday); in rv8803_set_time()
301 date[RV8803_MONTH] = bin2bcd(tm->tm_mon + 1); in rv8803_set_time()
302 date[RV8803_YEAR] = bin2bcd(tm->tm_year - 100); in rv8803_set_time()
304 ret = rv8803_write_regs(rv8803->client, RV8803_SEC, 7, date); in rv8803_set_time()
309 ret = rv8803_write_reg(rv8803->client, RV8803_CTRL, in rv8803_set_time()
314 mutex_lock(&rv8803->flags_lock); in rv8803_set_time()
316 flags = rv8803_read_reg(rv8803->client, RV8803_FLAG); in rv8803_set_time()
318 mutex_unlock(&rv8803->flags_lock); in rv8803_set_time()
322 if ((flags & RV8803_FLAG_V2F) || rv8803->alarm_invalid) { in rv8803_set_time()
328 ret = rv8803_regs_reset(rv8803, rv8803->alarm_invalid); in rv8803_set_time()
330 mutex_unlock(&rv8803->flags_lock); in rv8803_set_time()
334 rv8803->alarm_invalid = false; in rv8803_set_time()
337 ret = rv8803_write_reg(rv8803->client, RV8803_FLAG, in rv8803_set_time()
340 mutex_unlock(&rv8803->flags_lock); in rv8803_set_time()
348 struct i2c_client *client = rv8803->client; in rv8803_get_alarm()
369 alrm->time.tm_sec = 0; in rv8803_get_alarm()
370 alrm->time.tm_min = bcd2bin(alarmvals[0]); in rv8803_get_alarm()
371 alrm->time.tm_hour = bcd2bin(alarmvals[1]); in rv8803_get_alarm()
372 alrm->time.tm_mday = bcd2bin(alarmvals[2]); in rv8803_get_alarm()
374 alrm->enabled = !!(rv8803->ctrl & RV8803_CTRL_AIE); in rv8803_get_alarm()
375 alrm->pending = (flags & RV8803_FLAG_AF) && alrm->enabled; in rv8803_get_alarm()
377 if ((unsigned int)alrm->time.tm_mday > 31 || in rv8803_get_alarm()
378 (unsigned int)alrm->time.tm_hour >= 24 || in rv8803_get_alarm()
379 (unsigned int)alrm->time.tm_min >= 60) in rv8803_get_alarm()
385 rv8803->alarm_invalid = true; in rv8803_get_alarm()
386 return -EINVAL; in rv8803_get_alarm()
398 if (alrm->time.tm_sec) { in rv8803_set_alarm()
399 time64_t alarm_time = rtc_tm_to_time64(&alrm->time); in rv8803_set_alarm()
401 alarm_time += 60 - alrm->time.tm_sec; in rv8803_set_alarm()
402 rtc_time64_to_tm(alarm_time, &alrm->time); in rv8803_set_alarm()
405 mutex_lock(&rv8803->flags_lock); in rv8803_set_alarm()
409 mutex_unlock(&rv8803->flags_lock); in rv8803_set_alarm()
413 alarmvals[0] = bin2bcd(alrm->time.tm_min); in rv8803_set_alarm()
414 alarmvals[1] = bin2bcd(alrm->time.tm_hour); in rv8803_set_alarm()
415 alarmvals[2] = bin2bcd(alrm->time.tm_mday); in rv8803_set_alarm()
417 if (rv8803->ctrl & (RV8803_CTRL_AIE | RV8803_CTRL_UIE)) { in rv8803_set_alarm()
418 rv8803->ctrl &= ~(RV8803_CTRL_AIE | RV8803_CTRL_UIE); in rv8803_set_alarm()
419 err = rv8803_write_reg(rv8803->client, RV8803_CTRL, in rv8803_set_alarm()
420 rv8803->ctrl); in rv8803_set_alarm()
422 mutex_unlock(&rv8803->flags_lock); in rv8803_set_alarm()
428 err = rv8803_write_reg(rv8803->client, RV8803_FLAG, ctrl[0]); in rv8803_set_alarm()
429 mutex_unlock(&rv8803->flags_lock); in rv8803_set_alarm()
433 err = rv8803_write_regs(rv8803->client, RV8803_ALARM_MIN, 3, alarmvals); in rv8803_set_alarm()
437 if (alrm->enabled) { in rv8803_set_alarm()
438 if (rv8803->rtc->uie_rtctimer.enabled) in rv8803_set_alarm()
439 rv8803->ctrl |= RV8803_CTRL_UIE; in rv8803_set_alarm()
440 if (rv8803->rtc->aie_timer.enabled) in rv8803_set_alarm()
441 rv8803->ctrl |= RV8803_CTRL_AIE; in rv8803_set_alarm()
443 err = rv8803_write_reg(rv8803->client, RV8803_CTRL, in rv8803_set_alarm()
444 rv8803->ctrl); in rv8803_set_alarm()
458 ctrl = rv8803->ctrl; in rv8803_alarm_irq_enable()
461 if (rv8803->rtc->uie_rtctimer.enabled) in rv8803_alarm_irq_enable()
463 if (rv8803->rtc->aie_timer.enabled) in rv8803_alarm_irq_enable()
466 if (!rv8803->rtc->uie_rtctimer.enabled) in rv8803_alarm_irq_enable()
468 if (!rv8803->rtc->aie_timer.enabled) in rv8803_alarm_irq_enable()
472 mutex_lock(&rv8803->flags_lock); in rv8803_alarm_irq_enable()
475 mutex_unlock(&rv8803->flags_lock); in rv8803_alarm_irq_enable()
480 mutex_unlock(&rv8803->flags_lock); in rv8803_alarm_irq_enable()
484 if (ctrl != rv8803->ctrl) { in rv8803_alarm_irq_enable()
485 rv8803->ctrl = ctrl; in rv8803_alarm_irq_enable()
486 err = rv8803_write_reg(client, RV8803_CTRL, rv8803->ctrl); in rv8803_alarm_irq_enable()
508 dev_warn(&client->dev, "Voltage low, temperature compensation stopped.\n"); in rv8803_ioctl()
518 mutex_lock(&rv8803->flags_lock); in rv8803_ioctl()
521 mutex_unlock(&rv8803->flags_lock); in rv8803_ioctl()
527 mutex_unlock(&rv8803->flags_lock); in rv8803_ioctl()
534 return -ENOIOCTLCMD; in rv8803_ioctl()
569 struct i2c_client *client = rv8803->client; in rx8900_trickle_charger_init()
570 struct device_node *node = client->dev.of_node; in rx8900_trickle_charger_init()
577 if (rv8803->type != rx_8900) in rx8900_trickle_charger_init()
580 err = i2c_smbus_read_byte_data(rv8803->client, RX8900_BACKUP_CTRL); in rx8900_trickle_charger_init()
586 flags |= rv8803->backup; in rx8900_trickle_charger_init()
588 return i2c_smbus_write_byte_data(rv8803->client, RX8900_BACKUP_CTRL, in rx8900_trickle_charger_init()
592 /* configure registers with values different than the Power-On reset defaults */
597 err = rv8803_write_reg(rv8803->client, RV8803_EXT, RV8803_EXT_WADA); in rv8803_regs_configure()
603 dev_err(&rv8803->client->dev, "failed to init charger\n"); in rv8803_regs_configure()
621 struct i2c_adapter *adapter = client->adapter; in rv8803_probe()
636 dev_err(&adapter->dev, "doesn't support I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_I2C_BLOCK\n"); in rv8803_probe()
637 return -EIO; in rv8803_probe()
640 rv8803 = devm_kzalloc(&client->dev, sizeof(struct rv8803_data), in rv8803_probe()
643 return -ENOMEM; in rv8803_probe()
645 mutex_init(&rv8803->flags_lock); in rv8803_probe()
646 rv8803->client = client; in rv8803_probe()
647 if (client->dev.of_node) { in rv8803_probe()
648 rv8803->type = (uintptr_t)of_device_get_match_data(&client->dev); in rv8803_probe()
652 rv8803->type = id->driver_data; in rv8803_probe()
661 dev_warn(&client->dev, "Voltage low, temperature compensation stopped.\n"); in rv8803_probe()
664 dev_warn(&client->dev, "Voltage low, data loss detected.\n"); in rv8803_probe()
667 dev_warn(&client->dev, "An alarm maybe have been missed.\n"); in rv8803_probe()
669 rv8803->rtc = devm_rtc_allocate_device(&client->dev); in rv8803_probe()
670 if (IS_ERR(rv8803->rtc)) in rv8803_probe()
671 return PTR_ERR(rv8803->rtc); in rv8803_probe()
673 if (client->irq > 0) { in rv8803_probe()
676 if (dev_fwnode(&client->dev)) in rv8803_probe()
679 err = devm_request_threaded_irq(&client->dev, client->irq, in rv8803_probe()
684 dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n"); in rv8803_probe()
685 client->irq = 0; in rv8803_probe()
688 if (!client->irq) in rv8803_probe()
689 clear_bit(RTC_FEATURE_ALARM, rv8803->rtc->features); in rv8803_probe()
691 if (of_property_read_bool(client->dev.of_node, "epson,vdet-disable")) in rv8803_probe()
692 rv8803->backup |= RX8900_FLAG_VDETOFF; in rv8803_probe()
694 if (of_property_read_bool(client->dev.of_node, "trickle-diode-disable")) in rv8803_probe()
695 rv8803->backup |= RX8900_FLAG_SWOFF; in rv8803_probe()
701 rv8803->rtc->ops = &rv8803_rtc_ops; in rv8803_probe()
702 rv8803->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in rv8803_probe()
703 rv8803->rtc->range_max = RTC_TIMESTAMP_END_2099; in rv8803_probe()
704 err = devm_rtc_register_device(rv8803->rtc); in rv8803_probe()
708 devm_rtc_nvmem_register(rv8803->rtc, &nvmem_cfg); in rv8803_probe()
710 rv8803->rtc->max_user_freq = 1; in rv8803_probe()
738 .name = "rtc-rv8803",