• Home
  • Raw
  • Download

Lines Matching full:rv3028

3  * RTC driver for the Micro Crystal RV3028
105 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent); in timestamp0_store() local
107 regmap_update_bits(rv3028->regmap, RV3028_EVT_CTRL, RV3028_EVT_CTRL_TSR, in timestamp0_store()
116 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent); in timestamp0_show() local
121 ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count); in timestamp0_show()
128 ret = regmap_bulk_read(rv3028->regmap, RV3028_TS_SEC, date, in timestamp0_show()
153 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent); in timestamp0_count_show() local
156 ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count); in timestamp0_count_show()
175 static int rv3028_exit_eerd(struct rv3028_data *rv3028, u32 eerd) in rv3028_exit_eerd() argument
180 return regmap_update_bits(rv3028->regmap, RV3028_CTRL1, RV3028_CTRL1_EERD, 0); in rv3028_exit_eerd()
183 static int rv3028_enter_eerd(struct rv3028_data *rv3028, u32 *eerd) in rv3028_enter_eerd() argument
188 ret = regmap_read(rv3028->regmap, RV3028_CTRL1, &ctrl1); in rv3028_enter_eerd()
196 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL1, in rv3028_enter_eerd()
201 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_enter_eerd()
205 rv3028_exit_eerd(rv3028, *eerd); in rv3028_enter_eerd()
213 static int rv3028_update_eeprom(struct rv3028_data *rv3028, u32 eerd) in rv3028_update_eeprom() argument
218 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0); in rv3028_update_eeprom()
222 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, RV3028_EEPROM_CMD_UPDATE); in rv3028_update_eeprom()
228 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_update_eeprom()
233 rv3028_exit_eerd(rv3028, eerd); in rv3028_update_eeprom()
238 static int rv3028_update_cfg(struct rv3028_data *rv3028, unsigned int reg, in rv3028_update_cfg() argument
244 ret = rv3028_enter_eerd(rv3028, &eerd); in rv3028_update_cfg()
248 ret = regmap_update_bits(rv3028->regmap, reg, mask, val); in rv3028_update_cfg()
250 rv3028_exit_eerd(rv3028, eerd); in rv3028_update_cfg()
254 return rv3028_update_eeprom(rv3028, eerd); in rv3028_update_cfg()
259 struct rv3028_data *rv3028 = dev_id; in rv3028_handle_irq() local
263 if (regmap_read(rv3028->regmap, RV3028_STATUS, &status) < 0 || in rv3028_handle_irq()
269 dev_warn(&rv3028->rtc->dev, "Voltage low, data loss detected.\n"); in rv3028_handle_irq()
290 rtc_update_irq(rv3028->rtc, 1, events); in rv3028_handle_irq()
291 regmap_update_bits(rv3028->regmap, RV3028_STATUS, status, 0); in rv3028_handle_irq()
292 regmap_update_bits(rv3028->regmap, RV3028_CTRL2, ctrl, 0); in rv3028_handle_irq()
296 sysfs_notify(&rv3028->rtc->dev.kobj, NULL, in rv3028_handle_irq()
298 dev_warn(&rv3028->rtc->dev, "event detected"); in rv3028_handle_irq()
306 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_get_time() local
310 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_get_time()
319 ret = regmap_bulk_read(rv3028->regmap, RV3028_SEC, date, sizeof(date)); in rv3028_get_time()
336 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_set_time() local
352 ret = regmap_bulk_write(rv3028->regmap, RV3028_SEC, date, in rv3028_set_time()
357 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_set_time()
365 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_get_alarm() local
369 ret = regmap_bulk_read(rv3028->regmap, RV3028_ALARM_MIN, alarmvals, in rv3028_get_alarm()
374 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_get_alarm()
378 ret = regmap_read(rv3028->regmap, RV3028_CTRL2, &ctrl); in rv3028_get_alarm()
395 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_set_alarm() local
408 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_set_alarm()
417 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_set_alarm()
422 ret = regmap_bulk_write(rv3028->regmap, RV3028_ALARM_MIN, alarmvals, in rv3028_set_alarm()
428 if (rv3028->rtc->uie_rtctimer.enabled) in rv3028_set_alarm()
430 if (rv3028->rtc->aie_timer.enabled) in rv3028_set_alarm()
434 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_set_alarm()
442 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_alarm_irq_enable() local
446 if (rv3028->rtc->uie_rtctimer.enabled) in rv3028_alarm_irq_enable()
448 if (rv3028->rtc->aie_timer.enabled) in rv3028_alarm_irq_enable()
452 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_alarm_irq_enable()
457 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_alarm_irq_enable()
467 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_read_offset() local
470 ret = regmap_read(rv3028->regmap, RV3028_OFFSET, &value); in rv3028_read_offset()
476 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value); in rv3028_read_offset()
489 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_set_offset() local
496 ret = rv3028_enter_eerd(rv3028, &eerd); in rv3028_set_offset()
500 ret = regmap_write(rv3028->regmap, RV3028_OFFSET, offset >> 1); in rv3028_set_offset()
504 ret = regmap_update_bits(rv3028->regmap, RV3028_BACKUP, BIT(7), in rv3028_set_offset()
509 return rv3028_update_eeprom(rv3028, eerd); in rv3028_set_offset()
512 rv3028_exit_eerd(rv3028, eerd); in rv3028_set_offset()
520 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_ioctl() local
525 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_ioctl()
552 struct rv3028_data *rv3028 = priv; in rv3028_eeprom_write() local
557 ret = rv3028_enter_eerd(rv3028, &eerd); in rv3028_eeprom_write()
562 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_ADDR, offset + i); in rv3028_eeprom_write()
566 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_DATA, buf[i]); in rv3028_eeprom_write()
570 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0); in rv3028_eeprom_write()
574 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, in rv3028_eeprom_write()
581 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_eeprom_write()
590 rv3028_exit_eerd(rv3028, eerd); in rv3028_eeprom_write()
598 struct rv3028_data *rv3028 = priv; in rv3028_eeprom_read() local
603 ret = rv3028_enter_eerd(rv3028, &eerd); in rv3028_eeprom_read()
608 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_ADDR, offset + i); in rv3028_eeprom_read()
612 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0); in rv3028_eeprom_read()
616 ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, in rv3028_eeprom_read()
621 ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status, in rv3028_eeprom_read()
628 ret = regmap_read(rv3028->regmap, RV3028_EEPROM_DATA, &data); in rv3028_eeprom_read()
635 rv3028_exit_eerd(rv3028, eerd); in rv3028_eeprom_read()
656 struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw); in rv3028_clkout_recalc_rate() local
658 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &clkout); in rv3028_clkout_recalc_rate()
683 struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw); in rv3028_clkout_set_rate() local
685 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &enabled); in rv3028_clkout_set_rate()
689 ret = regmap_write(rv3028->regmap, RV3028_CLKOUT, 0x0); in rv3028_clkout_set_rate()
697 return rv3028_update_cfg(rv3028, RV3028_CLKOUT, 0xff, in rv3028_clkout_set_rate()
705 struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw); in rv3028_clkout_prepare() local
707 return regmap_write(rv3028->regmap, RV3028_CLKOUT, in rv3028_clkout_prepare()
713 struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw); in rv3028_clkout_unprepare() local
715 regmap_write(rv3028->regmap, RV3028_CLKOUT, 0x0); in rv3028_clkout_unprepare()
716 regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_clkout_unprepare()
723 struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw); in rv3028_clkout_is_prepared() local
725 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &clkout); in rv3028_clkout_is_prepared()
741 static int rv3028_clkout_register_clk(struct rv3028_data *rv3028, in rv3028_clkout_register_clk() argument
749 ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_clkout_register_clk()
754 init.name = "rv3028-clkout"; in rv3028_clkout_register_clk()
759 rv3028->clkout_hw.init = &init; in rv3028_clkout_register_clk()
765 clk = devm_clk_register(&client->dev, &rv3028->clkout_hw); in rv3028_clkout_register_clk()
789 struct rv3028_data *rv3028; in rv3028_probe() local
811 rv3028 = devm_kzalloc(&client->dev, sizeof(struct rv3028_data), in rv3028_probe()
813 if (!rv3028) in rv3028_probe()
816 rv3028->regmap = devm_regmap_init_i2c(client, &regmap_config); in rv3028_probe()
817 if (IS_ERR(rv3028->regmap)) in rv3028_probe()
818 return PTR_ERR(rv3028->regmap); in rv3028_probe()
820 i2c_set_clientdata(client, rv3028); in rv3028_probe()
822 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_probe()
832 rv3028->rtc = devm_rtc_allocate_device(&client->dev); in rv3028_probe()
833 if (IS_ERR(rv3028->rtc)) in rv3028_probe()
834 return PTR_ERR(rv3028->rtc); in rv3028_probe()
840 "rv3028", rv3028); in rv3028_probe()
851 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL1, in rv3028_probe()
857 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, in rv3028_probe()
873 ret = rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_TCE | in rv3028_probe()
882 ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group); in rv3028_probe()
886 rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in rv3028_probe()
887 rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099; in rv3028_probe()
888 rv3028->rtc->ops = &rv3028_rtc_ops; in rv3028_probe()
889 ret = rtc_register_device(rv3028->rtc); in rv3028_probe()
893 nvmem_cfg.priv = rv3028->regmap; in rv3028_probe()
894 rtc_nvmem_register(rv3028->rtc, &nvmem_cfg); in rv3028_probe()
895 eeprom_cfg.priv = rv3028; in rv3028_probe()
896 rtc_nvmem_register(rv3028->rtc, &eeprom_cfg); in rv3028_probe()
898 rv3028->rtc->max_user_freq = 1; in rv3028_probe()
901 rv3028_clkout_register_clk(rv3028, client); in rv3028_probe()
907 { .compatible = "microcrystal,rv3028", },
914 .name = "rtc-rv3028",
922 MODULE_DESCRIPTION("Micro Crystal RV3028 RTC driver");