Lines Matching full:rv3028
3 * RTC driver for the Micro Crystal RV3028
110 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent); in timestamp0_store() local
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() local
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()
159 struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent); in timestamp0_count_show() local
163 ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count); in timestamp0_count_show()
182 static int rv3028_exit_eerd(struct rv3028_data *rv3028, u32 eerd) in rv3028_exit_eerd() argument
187 return regmap_update_bits(rv3028->regmap, RV3028_CTRL1, RV3028_CTRL1_EERD, 0); in rv3028_exit_eerd()
190 static int rv3028_enter_eerd(struct rv3028_data *rv3028, u32 *eerd) in rv3028_enter_eerd() argument
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()
212 rv3028_exit_eerd(rv3028, *eerd); in rv3028_enter_eerd()
220 static int rv3028_update_eeprom(struct rv3028_data *rv3028, u32 eerd) in rv3028_update_eeprom() argument
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()
240 rv3028_exit_eerd(rv3028, eerd); in rv3028_update_eeprom()
245 static int rv3028_update_cfg(struct rv3028_data *rv3028, unsigned int reg, in rv3028_update_cfg() argument
251 ret = rv3028_enter_eerd(rv3028, &eerd); in rv3028_update_cfg()
255 ret = regmap_update_bits(rv3028->regmap, reg, mask, val); in rv3028_update_cfg()
257 rv3028_exit_eerd(rv3028, eerd); in rv3028_update_cfg()
261 return rv3028_update_eeprom(rv3028, eerd); in rv3028_update_cfg()
266 struct rv3028_data *rv3028 = dev_id; in rv3028_handle_irq() local
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()
312 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_get_time() local
316 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_get_time()
323 ret = regmap_bulk_read(rv3028->regmap, RV3028_SEC, date, sizeof(date)); in rv3028_get_time()
340 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_set_time() local
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()
369 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_get_alarm() local
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()
399 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_set_alarm() local
412 ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2, 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()
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()
446 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_alarm_irq_enable() local
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()
471 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_read_offset() local
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()
493 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_set_offset() local
500 ret = rv3028_enter_eerd(rv3028, &eerd); 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()
513 return rv3028_update_eeprom(rv3028, eerd); in rv3028_set_offset()
516 rv3028_exit_eerd(rv3028, eerd); in rv3028_set_offset()
524 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_param_get() local
530 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value); in rv3028_param_get()
557 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_param_set() local
576 return rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_BSM, in rv3028_param_set()
588 struct rv3028_data *rv3028 = dev_get_drvdata(dev); in rv3028_ioctl() local
593 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); in rv3028_ioctl()
620 struct rv3028_data *rv3028 = priv; in rv3028_eeprom_write() local
625 ret = rv3028_enter_eerd(rv3028, &eerd); in rv3028_eeprom_write()
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()
658 rv3028_exit_eerd(rv3028, eerd); in rv3028_eeprom_write()
666 struct rv3028_data *rv3028 = priv; in rv3028_eeprom_read() local
671 ret = rv3028_enter_eerd(rv3028, &eerd); in rv3028_eeprom_read()
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()
703 rv3028_exit_eerd(rv3028, eerd); in rv3028_eeprom_read()
724 struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw); in rv3028_clkout_recalc_rate() local
726 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &clkout); in rv3028_clkout_recalc_rate()
751 struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw); in rv3028_clkout_set_rate() local
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()
765 return rv3028_update_cfg(rv3028, RV3028_CLKOUT, 0xff, in rv3028_clkout_set_rate()
773 struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw); in rv3028_clkout_prepare() local
775 return regmap_write(rv3028->regmap, RV3028_CLKOUT, in rv3028_clkout_prepare()
781 struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw); in rv3028_clkout_unprepare() local
783 regmap_write(rv3028->regmap, RV3028_CLKOUT, 0x0); in rv3028_clkout_unprepare()
784 regmap_update_bits(rv3028->regmap, RV3028_STATUS, in rv3028_clkout_unprepare()
791 struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw); in rv3028_clkout_is_prepared() local
793 ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &clkout); in rv3028_clkout_is_prepared()
809 static int rv3028_clkout_register_clk(struct rv3028_data *rv3028, in rv3028_clkout_register_clk() argument
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()
833 clk = devm_clk_register(&client->dev, &rv3028->clkout_hw); in rv3028_clkout_register_clk()
860 static u8 rv3028_set_trickle_charger(struct rv3028_data *rv3028, in rv3028_set_trickle_charger() argument
866 ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old); in rv3028_set_trickle_charger()
909 ret = rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_TCE | in rv3028_set_trickle_charger()
920 struct rv3028_data *rv3028; in rv3028_probe() local
941 rv3028 = devm_kzalloc(&client->dev, sizeof(struct rv3028_data), in rv3028_probe()
943 if (!rv3028) in rv3028_probe()
946 rv3028->regmap = devm_regmap_init_i2c(client, ®map_config); in rv3028_probe()
947 if (IS_ERR(rv3028->regmap)) in rv3028_probe()
948 return PTR_ERR(rv3028->regmap); in rv3028_probe()
950 i2c_set_clientdata(client, rv3028); in rv3028_probe()
952 ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status); 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()
978 "rv3028", rv3028); 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()
999 ret = rv3028_set_trickle_charger(rv3028, client); 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()
1018 eeprom_cfg.priv = rv3028; 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()
1024 rv3028_clkout_register_clk(rv3028, client); in rv3028_probe()
1036 { .compatible = "microcrystal,rv3028", },
1042 { .name = "rv3028", },
1049 .name = "rtc-rv3028",
1059 MODULE_DESCRIPTION("Micro Crystal RV3028 RTC driver");