Lines Matching +full:trickle +full:- +full:diode +full:- +full:disable
1 // SPDX-License-Identifier: GPL-2.0
80 while ((ret == -ENXIO || ret == -EIO) && --try); in rv8803_read_reg()
82 dev_err(&client->dev, "Unable to read register 0x%02x\n", reg); in rv8803_read_reg()
95 while ((ret == -ENXIO || ret == -EIO) && --try); in rv8803_read_regs()
97 dev_err(&client->dev, in rv8803_read_regs()
99 reg, reg + count - 1); in rv8803_read_regs()
100 return ret < 0 ? ret : -EIO; in rv8803_read_regs()
113 while ((ret == -ENXIO || ret == -EIO) && --try); in rv8803_write_reg()
115 dev_err(&client->dev, "Unable to write register 0x%02x\n", reg); in rv8803_write_reg()
129 while ((ret == -ENXIO || ret == -EIO) && --try); in rv8803_write_regs()
131 dev_err(&client->dev, in rv8803_write_regs()
133 reg, reg + count - 1); in rv8803_write_regs()
145 mutex_lock(&rv8803->flags_lock); in rv8803_handle_irq()
149 mutex_unlock(&rv8803->flags_lock); in rv8803_handle_irq()
154 dev_warn(&client->dev, "Voltage low, temperature compensation stopped.\n"); in rv8803_handle_irq()
157 dev_warn(&client->dev, "Voltage low, data loss detected.\n"); in rv8803_handle_irq()
161 rv8803->ctrl &= ~RV8803_CTRL_TIE; in rv8803_handle_irq()
167 rv8803->ctrl &= ~RV8803_CTRL_AIE; in rv8803_handle_irq()
173 rv8803->ctrl &= ~RV8803_CTRL_UIE; in rv8803_handle_irq()
178 rtc_update_irq(rv8803->rtc, 1, events); in rv8803_handle_irq()
180 rv8803_write_reg(rv8803->client, RV8803_CTRL, rv8803->ctrl); in rv8803_handle_irq()
183 mutex_unlock(&rv8803->flags_lock); in rv8803_handle_irq()
196 flags = rv8803_read_reg(rv8803->client, RV8803_FLAG); in rv8803_get_time()
202 return -EINVAL; in rv8803_get_time()
205 ret = rv8803_read_regs(rv8803->client, RV8803_SEC, 7, date); in rv8803_get_time()
210 ret = rv8803_read_regs(rv8803->client, RV8803_SEC, 7, date2); in rv8803_get_time()
218 tm->tm_sec = bcd2bin(date[RV8803_SEC] & 0x7f); in rv8803_get_time()
219 tm->tm_min = bcd2bin(date[RV8803_MIN] & 0x7f); in rv8803_get_time()
220 tm->tm_hour = bcd2bin(date[RV8803_HOUR] & 0x3f); in rv8803_get_time()
221 tm->tm_wday = ilog2(date[RV8803_WEEK] & 0x7f); in rv8803_get_time()
222 tm->tm_mday = bcd2bin(date[RV8803_DAY] & 0x3f); in rv8803_get_time()
223 tm->tm_mon = bcd2bin(date[RV8803_MONTH] & 0x1f) - 1; in rv8803_get_time()
224 tm->tm_year = bcd2bin(date[RV8803_YEAR]) + 100; in rv8803_get_time()
235 ctrl = rv8803_read_reg(rv8803->client, RV8803_CTRL); in rv8803_set_time()
240 ret = rv8803_write_reg(rv8803->client, RV8803_CTRL, in rv8803_set_time()
245 date[RV8803_SEC] = bin2bcd(tm->tm_sec); in rv8803_set_time()
246 date[RV8803_MIN] = bin2bcd(tm->tm_min); in rv8803_set_time()
247 date[RV8803_HOUR] = bin2bcd(tm->tm_hour); in rv8803_set_time()
248 date[RV8803_WEEK] = 1 << (tm->tm_wday); in rv8803_set_time()
249 date[RV8803_DAY] = bin2bcd(tm->tm_mday); in rv8803_set_time()
250 date[RV8803_MONTH] = bin2bcd(tm->tm_mon + 1); in rv8803_set_time()
251 date[RV8803_YEAR] = bin2bcd(tm->tm_year - 100); in rv8803_set_time()
253 ret = rv8803_write_regs(rv8803->client, RV8803_SEC, 7, date); in rv8803_set_time()
258 ret = rv8803_write_reg(rv8803->client, RV8803_CTRL, in rv8803_set_time()
263 mutex_lock(&rv8803->flags_lock); in rv8803_set_time()
265 flags = rv8803_read_reg(rv8803->client, RV8803_FLAG); in rv8803_set_time()
267 mutex_unlock(&rv8803->flags_lock); in rv8803_set_time()
271 ret = rv8803_write_reg(rv8803->client, RV8803_FLAG, in rv8803_set_time()
274 mutex_unlock(&rv8803->flags_lock); in rv8803_set_time()
282 struct i2c_client *client = rv8803->client; in rv8803_get_alarm()
294 alrm->time.tm_sec = 0; in rv8803_get_alarm()
295 alrm->time.tm_min = bcd2bin(alarmvals[0] & 0x7f); in rv8803_get_alarm()
296 alrm->time.tm_hour = bcd2bin(alarmvals[1] & 0x3f); in rv8803_get_alarm()
297 alrm->time.tm_mday = bcd2bin(alarmvals[2] & 0x3f); in rv8803_get_alarm()
299 alrm->enabled = !!(rv8803->ctrl & RV8803_CTRL_AIE); in rv8803_get_alarm()
300 alrm->pending = (flags & RV8803_FLAG_AF) && alrm->enabled; in rv8803_get_alarm()
314 if (alrm->time.tm_sec) { in rv8803_set_alarm()
315 time64_t alarm_time = rtc_tm_to_time64(&alrm->time); in rv8803_set_alarm()
317 alarm_time += 60 - alrm->time.tm_sec; in rv8803_set_alarm()
318 rtc_time64_to_tm(alarm_time, &alrm->time); in rv8803_set_alarm()
321 mutex_lock(&rv8803->flags_lock); in rv8803_set_alarm()
325 mutex_unlock(&rv8803->flags_lock); in rv8803_set_alarm()
329 alarmvals[0] = bin2bcd(alrm->time.tm_min); in rv8803_set_alarm()
330 alarmvals[1] = bin2bcd(alrm->time.tm_hour); in rv8803_set_alarm()
331 alarmvals[2] = bin2bcd(alrm->time.tm_mday); in rv8803_set_alarm()
333 if (rv8803->ctrl & (RV8803_CTRL_AIE | RV8803_CTRL_UIE)) { in rv8803_set_alarm()
334 rv8803->ctrl &= ~(RV8803_CTRL_AIE | RV8803_CTRL_UIE); in rv8803_set_alarm()
335 err = rv8803_write_reg(rv8803->client, RV8803_CTRL, in rv8803_set_alarm()
336 rv8803->ctrl); in rv8803_set_alarm()
338 mutex_unlock(&rv8803->flags_lock); in rv8803_set_alarm()
344 err = rv8803_write_reg(rv8803->client, RV8803_FLAG, ctrl[1]); in rv8803_set_alarm()
345 mutex_unlock(&rv8803->flags_lock); in rv8803_set_alarm()
349 err = rv8803_write_regs(rv8803->client, RV8803_ALARM_MIN, 3, alarmvals); in rv8803_set_alarm()
353 if (alrm->enabled) { in rv8803_set_alarm()
354 if (rv8803->rtc->uie_rtctimer.enabled) in rv8803_set_alarm()
355 rv8803->ctrl |= RV8803_CTRL_UIE; in rv8803_set_alarm()
356 if (rv8803->rtc->aie_timer.enabled) in rv8803_set_alarm()
357 rv8803->ctrl |= RV8803_CTRL_AIE; in rv8803_set_alarm()
359 err = rv8803_write_reg(rv8803->client, RV8803_CTRL, in rv8803_set_alarm()
360 rv8803->ctrl); in rv8803_set_alarm()
374 ctrl = rv8803->ctrl; in rv8803_alarm_irq_enable()
377 if (rv8803->rtc->uie_rtctimer.enabled) in rv8803_alarm_irq_enable()
379 if (rv8803->rtc->aie_timer.enabled) in rv8803_alarm_irq_enable()
382 if (!rv8803->rtc->uie_rtctimer.enabled) in rv8803_alarm_irq_enable()
384 if (!rv8803->rtc->aie_timer.enabled) in rv8803_alarm_irq_enable()
388 mutex_lock(&rv8803->flags_lock); in rv8803_alarm_irq_enable()
391 mutex_unlock(&rv8803->flags_lock); in rv8803_alarm_irq_enable()
396 mutex_unlock(&rv8803->flags_lock); in rv8803_alarm_irq_enable()
400 if (ctrl != rv8803->ctrl) { in rv8803_alarm_irq_enable()
401 rv8803->ctrl = ctrl; in rv8803_alarm_irq_enable()
402 err = rv8803_write_reg(client, RV8803_CTRL, rv8803->ctrl); in rv8803_alarm_irq_enable()
424 dev_warn(&client->dev, "Voltage low, temperature compensation stopped.\n"); in rv8803_ioctl()
434 mutex_lock(&rv8803->flags_lock); in rv8803_ioctl()
437 mutex_unlock(&rv8803->flags_lock); in rv8803_ioctl()
443 mutex_unlock(&rv8803->flags_lock); in rv8803_ioctl()
450 return -ENOIOCTLCMD; in rv8803_ioctl()
482 struct i2c_client *client = rv8803->client; in rx8900_trickle_charger_init()
483 struct device_node *node = client->dev.of_node; in rx8900_trickle_charger_init()
490 if (rv8803->type != rx_8900) in rx8900_trickle_charger_init()
493 err = i2c_smbus_read_byte_data(rv8803->client, RX8900_BACKUP_CTRL); in rx8900_trickle_charger_init()
499 if (of_property_read_bool(node, "epson,vdet-disable")) in rx8900_trickle_charger_init()
502 if (of_property_read_bool(node, "trickle-diode-disable")) in rx8900_trickle_charger_init()
505 return i2c_smbus_write_byte_data(rv8803->client, RX8900_BACKUP_CTRL, in rx8900_trickle_charger_init()
512 struct i2c_adapter *adapter = client->adapter; in rv8803_probe()
527 dev_err(&adapter->dev, "doesn't support I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_I2C_BLOCK\n"); in rv8803_probe()
528 return -EIO; in rv8803_probe()
531 rv8803 = devm_kzalloc(&client->dev, sizeof(struct rv8803_data), in rv8803_probe()
534 return -ENOMEM; in rv8803_probe()
536 mutex_init(&rv8803->flags_lock); in rv8803_probe()
537 rv8803->client = client; in rv8803_probe()
538 if (client->dev.of_node) in rv8803_probe()
539 rv8803->type = (enum rv8803_type) in rv8803_probe()
540 of_device_get_match_data(&client->dev); in rv8803_probe()
542 rv8803->type = id->driver_data; in rv8803_probe()
550 dev_warn(&client->dev, "Voltage low, temperature compensation stopped.\n"); in rv8803_probe()
553 dev_warn(&client->dev, "Voltage low, data loss detected.\n"); in rv8803_probe()
556 dev_warn(&client->dev, "An alarm maybe have been missed.\n"); in rv8803_probe()
558 rv8803->rtc = devm_rtc_allocate_device(&client->dev); in rv8803_probe()
559 if (IS_ERR(rv8803->rtc)) in rv8803_probe()
560 return PTR_ERR(rv8803->rtc); in rv8803_probe()
562 if (client->irq > 0) { in rv8803_probe()
563 err = devm_request_threaded_irq(&client->dev, client->irq, in rv8803_probe()
568 dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n"); in rv8803_probe()
569 client->irq = 0; in rv8803_probe()
577 err = rv8803_write_reg(rv8803->client, RV8803_EXT, RV8803_EXT_WADA); in rv8803_probe()
583 dev_err(&client->dev, "failed to init charger\n"); in rv8803_probe()
587 rv8803->rtc->ops = &rv8803_rtc_ops; in rv8803_probe()
588 rv8803->rtc->nvram_old_abi = true; in rv8803_probe()
589 rv8803->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in rv8803_probe()
590 rv8803->rtc->range_max = RTC_TIMESTAMP_END_2099; in rv8803_probe()
591 err = rtc_register_device(rv8803->rtc); in rv8803_probe()
595 rtc_nvmem_register(rv8803->rtc, &nvmem_cfg); in rv8803_probe()
597 rv8803->rtc->max_user_freq = 1; in rv8803_probe()
629 .name = "rtc-rv8803",