Lines Matching refs:rv8803
146 static int rv8803_regs_init(struct rv8803_data *rv8803) in rv8803_regs_init() argument
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()
167 static int rv8803_regs_configure(struct rv8803_data *rv8803);
169 static int rv8803_regs_reset(struct rv8803_data *rv8803, bool full) in rv8803_regs_reset() argument
175 if (full || rv8803->type == rx_8803 || rv8803->type == rx_8900) { in rv8803_regs_reset()
176 int ret = rv8803_regs_init(rv8803); in rv8803_regs_reset()
181 return rv8803_regs_configure(rv8803); in rv8803_regs_reset()
187 struct rv8803_data *rv8803 = i2c_get_clientdata(client); in rv8803_handle_irq() local
191 mutex_lock(&rv8803->flags_lock); in rv8803_handle_irq()
195 mutex_unlock(&rv8803->flags_lock); 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()
236 struct rv8803_data *rv8803 = dev_get_drvdata(dev); in rv8803_get_time() local
242 if (rv8803->alarm_invalid) { in rv8803_get_time()
247 flags = rv8803_read_reg(rv8803->client, RV8803_FLAG); 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()
282 struct rv8803_data *rv8803 = dev_get_drvdata(dev); in rv8803_set_time() local
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()
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()
347 struct rv8803_data *rv8803 = dev_get_drvdata(dev); in rv8803_get_alarm() local
348 struct i2c_client *client = rv8803->client; in rv8803_get_alarm()
374 alrm->enabled = !!(rv8803->ctrl & RV8803_CTRL_AIE); in rv8803_get_alarm()
385 rv8803->alarm_invalid = true; in rv8803_get_alarm()
392 struct rv8803_data *rv8803 = dev_get_drvdata(dev); in rv8803_set_alarm() local
405 mutex_lock(&rv8803->flags_lock); in rv8803_set_alarm()
409 mutex_unlock(&rv8803->flags_lock); 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()
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()
455 struct rv8803_data *rv8803 = dev_get_drvdata(dev); in rv8803_alarm_irq_enable() local
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()
497 struct rv8803_data *rv8803 = dev_get_drvdata(dev); in rv8803_ioctl() local
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()
567 static int rx8900_trickle_charger_init(struct rv8803_data *rv8803) in rx8900_trickle_charger_init() argument
569 struct i2c_client *client = rv8803->client; 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()
593 static int rv8803_regs_configure(struct rv8803_data *rv8803) in rv8803_regs_configure() argument
597 err = rv8803_write_reg(rv8803->client, RV8803_EXT, RV8803_EXT_WADA); in rv8803_regs_configure()
601 err = rx8900_trickle_charger_init(rv8803); in rv8803_regs_configure()
603 dev_err(&rv8803->client->dev, "failed to init charger\n"); in rv8803_regs_configure()
622 struct rv8803_data *rv8803; in rv8803_probe() local
640 rv8803 = devm_kzalloc(&client->dev, sizeof(struct rv8803_data), in rv8803_probe()
642 if (!rv8803) in rv8803_probe()
645 mutex_init(&rv8803->flags_lock); in rv8803_probe()
646 rv8803->client = client; 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()
654 i2c_set_clientdata(client, rv8803); 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()
689 clear_bit(RTC_FEATURE_ALARM, rv8803->rtc->features); in rv8803_probe()
692 rv8803->backup |= RX8900_FLAG_VDETOFF; in rv8803_probe()
695 rv8803->backup |= RX8900_FLAG_SWOFF; in rv8803_probe()
697 err = rv8803_regs_configure(rv8803); 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()