Lines Matching +full:auto +full:- +full:retry
1 // SPDX-License-Identifier: GPL-2.0+
3 // Copyright (c) 2013-2014 Samsung Electronics Co., Ltd
26 * in S5M_RTC_UDR_CON register. UDR is auto-cleared when data have
48 * specific fields in UDR register. These fields usually are auto-cleared
74 * auto-cleared after successful update.
77 /* Auto-cleared mask in UDR field for writing time and alarm */
131 * Register map for S2MPS15 - in comparison to S2MPS14 the WUDR and AUDR bits
176 tm->tm_sec = data[RTC_SEC] & 0x7f; in s5m8767_data_to_tm()
177 tm->tm_min = data[RTC_MIN] & 0x7f; in s5m8767_data_to_tm()
179 tm->tm_hour = data[RTC_HOUR] & 0x1f; in s5m8767_data_to_tm()
181 tm->tm_hour = data[RTC_HOUR] & 0x0f; in s5m8767_data_to_tm()
183 tm->tm_hour += 12; in s5m8767_data_to_tm()
186 tm->tm_wday = ffs(data[RTC_WEEKDAY] & 0x7f); in s5m8767_data_to_tm()
187 tm->tm_mday = data[RTC_DATE] & 0x1f; in s5m8767_data_to_tm()
188 tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1; in s5m8767_data_to_tm()
189 tm->tm_year = (data[RTC_YEAR1] & 0x7f) + 100; in s5m8767_data_to_tm()
190 tm->tm_yday = 0; in s5m8767_data_to_tm()
191 tm->tm_isdst = 0; in s5m8767_data_to_tm()
196 data[RTC_SEC] = tm->tm_sec; in s5m8767_tm_to_data()
197 data[RTC_MIN] = tm->tm_min; in s5m8767_tm_to_data()
199 if (tm->tm_hour >= 12) in s5m8767_tm_to_data()
200 data[RTC_HOUR] = tm->tm_hour | HOUR_PM_MASK; in s5m8767_tm_to_data()
202 data[RTC_HOUR] = tm->tm_hour & ~HOUR_PM_MASK; in s5m8767_tm_to_data()
204 data[RTC_WEEKDAY] = 1 << tm->tm_wday; in s5m8767_tm_to_data()
205 data[RTC_DATE] = tm->tm_mday; in s5m8767_tm_to_data()
206 data[RTC_MONTH] = tm->tm_mon + 1; in s5m8767_tm_to_data()
207 data[RTC_YEAR1] = tm->tm_year - 100; in s5m8767_tm_to_data()
218 int ret, retry = UDR_READ_RETRY_CNT; in s5m8767_wait_for_udr_update() local
222 ret = regmap_read(info->regmap, info->regs->udr_update, &data); in s5m8767_wait_for_udr_update()
223 } while (--retry && (data & info->regs->autoclear_udr_mask) && !ret); in s5m8767_wait_for_udr_update()
225 if (!retry) in s5m8767_wait_for_udr_update()
226 dev_err(info->dev, "waiting for UDR update, reached max number of retries\n"); in s5m8767_wait_for_udr_update()
237 switch (info->device_type) { in s5m_check_peding_alarm_interrupt()
239 ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val); in s5m_check_peding_alarm_interrupt()
245 ret = regmap_read(info->s5m87xx->regmap_pmic, S2MPS14_REG_ST2, in s5m_check_peding_alarm_interrupt()
250 return -EINVAL; in s5m_check_peding_alarm_interrupt()
256 alarm->pending = 1; in s5m_check_peding_alarm_interrupt()
258 alarm->pending = 0; in s5m_check_peding_alarm_interrupt()
268 ret = regmap_read(info->regmap, info->regs->udr_update, &data); in s5m8767_rtc_set_time_reg()
270 dev_err(info->dev, "failed to read update reg(%d)\n", ret); in s5m8767_rtc_set_time_reg()
274 data |= info->regs->write_time_udr_mask; in s5m8767_rtc_set_time_reg()
276 ret = regmap_write(info->regmap, info->regs->udr_update, data); in s5m8767_rtc_set_time_reg()
278 dev_err(info->dev, "failed to write update reg(%d)\n", ret); in s5m8767_rtc_set_time_reg()
292 ret = regmap_read(info->regmap, info->regs->udr_update, &data); in s5m8767_rtc_set_alarm_reg()
294 dev_err(info->dev, "%s: fail to read update reg(%d)\n", in s5m8767_rtc_set_alarm_reg()
299 data |= info->regs->write_alarm_udr_mask; in s5m8767_rtc_set_alarm_reg()
300 switch (info->device_type) { in s5m8767_rtc_set_alarm_reg()
310 return -EINVAL; in s5m8767_rtc_set_alarm_reg()
313 ret = regmap_write(info->regmap, info->regs->udr_update, data); in s5m8767_rtc_set_alarm_reg()
315 dev_err(info->dev, "%s: fail to write update reg(%d)\n", in s5m8767_rtc_set_alarm_reg()
322 /* On S2MPS13 the AUDR is not auto-cleared */ in s5m8767_rtc_set_alarm_reg()
323 if (info->device_type == S2MPS13X) in s5m8767_rtc_set_alarm_reg()
324 regmap_update_bits(info->regmap, info->regs->udr_update, in s5m8767_rtc_set_alarm_reg()
336 if (info->regs->read_time_udr_mask) { in s5m_rtc_read_time()
337 ret = regmap_update_bits(info->regmap, in s5m_rtc_read_time()
338 info->regs->udr_update, in s5m_rtc_read_time()
339 info->regs->read_time_udr_mask, in s5m_rtc_read_time()
340 info->regs->read_time_udr_mask); in s5m_rtc_read_time()
348 ret = regmap_bulk_read(info->regmap, info->regs->time, data, in s5m_rtc_read_time()
349 info->regs->regs_count); in s5m_rtc_read_time()
353 switch (info->device_type) { in s5m_rtc_read_time()
358 s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode); in s5m_rtc_read_time()
362 return -EINVAL; in s5m_rtc_read_time()
365 dev_dbg(dev, "%s: %ptR(%d)\n", __func__, tm, tm->tm_wday); in s5m_rtc_read_time()
376 switch (info->device_type) { in s5m_rtc_set_time()
384 return -EINVAL; in s5m_rtc_set_time()
390 dev_dbg(dev, "%s: %ptR(%d)\n", __func__, tm, tm->tm_wday); in s5m_rtc_set_time()
392 ret = regmap_raw_write(info->regmap, info->regs->time, data, in s5m_rtc_set_time()
393 info->regs->regs_count); in s5m_rtc_set_time()
408 ret = regmap_bulk_read(info->regmap, info->regs->alarm0, data, in s5m_rtc_read_alarm()
409 info->regs->regs_count); in s5m_rtc_read_alarm()
413 switch (info->device_type) { in s5m_rtc_read_alarm()
418 s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode); in s5m_rtc_read_alarm()
419 alrm->enabled = 0; in s5m_rtc_read_alarm()
420 for (i = 0; i < info->regs->regs_count; i++) { in s5m_rtc_read_alarm()
422 alrm->enabled = 1; in s5m_rtc_read_alarm()
429 return -EINVAL; in s5m_rtc_read_alarm()
432 dev_dbg(dev, "%s: %ptR(%d)\n", __func__, &alrm->time, alrm->time.tm_wday); in s5m_rtc_read_alarm()
443 ret = regmap_bulk_read(info->regmap, info->regs->alarm0, data, in s5m_rtc_stop_alarm()
444 info->regs->regs_count); in s5m_rtc_stop_alarm()
448 s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); in s5m_rtc_stop_alarm()
449 dev_dbg(info->dev, "%s: %ptR(%d)\n", __func__, &tm, tm.tm_wday); in s5m_rtc_stop_alarm()
451 switch (info->device_type) { in s5m_rtc_stop_alarm()
456 for (i = 0; i < info->regs->regs_count; i++) in s5m_rtc_stop_alarm()
459 ret = regmap_raw_write(info->regmap, info->regs->alarm0, data, in s5m_rtc_stop_alarm()
460 info->regs->regs_count); in s5m_rtc_stop_alarm()
469 return -EINVAL; in s5m_rtc_stop_alarm()
481 ret = regmap_bulk_read(info->regmap, info->regs->alarm0, data, in s5m_rtc_start_alarm()
482 info->regs->regs_count); in s5m_rtc_start_alarm()
486 s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); in s5m_rtc_start_alarm()
487 dev_dbg(info->dev, "%s: %ptR(%d)\n", __func__, &tm, tm.tm_wday); in s5m_rtc_start_alarm()
489 switch (info->device_type) { in s5m_rtc_start_alarm()
505 ret = regmap_raw_write(info->regmap, info->regs->alarm0, data, in s5m_rtc_start_alarm()
506 info->regs->regs_count); in s5m_rtc_start_alarm()
514 return -EINVAL; in s5m_rtc_start_alarm()
526 switch (info->device_type) { in s5m_rtc_set_alarm()
531 s5m8767_tm_to_data(&alrm->time, data); in s5m_rtc_set_alarm()
535 return -EINVAL; in s5m_rtc_set_alarm()
538 dev_dbg(dev, "%s: %ptR(%d)\n", __func__, &alrm->time, alrm->time.tm_wday); in s5m_rtc_set_alarm()
544 ret = regmap_raw_write(info->regmap, info->regs->alarm0, data, in s5m_rtc_set_alarm()
545 info->regs->regs_count); in s5m_rtc_set_alarm()
553 if (alrm->enabled) in s5m_rtc_set_alarm()
574 rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF); in s5m_rtc_alarm_irq()
592 switch (info->device_type) { in s5m8767_rtc_init_reg()
595 ret = regmap_update_bits(info->regmap, S5M_RTC_UDR_CON, in s5m8767_rtc_init_reg()
598 dev_err(info->dev, "%s: fail to change UDR time: %d\n", in s5m8767_rtc_init_reg()
605 ret = regmap_raw_write(info->regmap, S5M_ALARM0_CONF, data, 2); in s5m8767_rtc_init_reg()
612 ret = regmap_write(info->regmap, info->regs->ctrl, data[0]); in s5m8767_rtc_init_reg()
626 return -EINVAL; in s5m8767_rtc_init_reg()
629 info->rtc_24hr_mode = 1; in s5m8767_rtc_init_reg()
631 dev_err(info->dev, "%s: fail to write controlm reg(%d)\n", in s5m8767_rtc_init_reg()
641 struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent); in s5m_rtc_probe()
646 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in s5m_rtc_probe()
648 return -ENOMEM; in s5m_rtc_probe()
650 switch (platform_get_device_id(pdev)->driver_data) { in s5m_rtc_probe()
653 info->regs = &s2mps15_rtc_regs; in s5m_rtc_probe()
658 info->regs = &s2mps14_rtc_regs; in s5m_rtc_probe()
663 info->regs = &s2mps13_rtc_regs; in s5m_rtc_probe()
668 info->regs = &s5m_rtc_regs; in s5m_rtc_probe()
672 dev_err(&pdev->dev, in s5m_rtc_probe()
674 platform_get_device_id(pdev)->driver_data); in s5m_rtc_probe()
675 return -ENODEV; in s5m_rtc_probe()
678 info->i2c = devm_i2c_new_dummy_device(&pdev->dev, s5m87xx->i2c->adapter, in s5m_rtc_probe()
680 if (IS_ERR(info->i2c)) { in s5m_rtc_probe()
681 dev_err(&pdev->dev, "Failed to allocate I2C for RTC\n"); in s5m_rtc_probe()
682 return PTR_ERR(info->i2c); in s5m_rtc_probe()
685 info->regmap = devm_regmap_init_i2c(info->i2c, regmap_cfg); in s5m_rtc_probe()
686 if (IS_ERR(info->regmap)) { in s5m_rtc_probe()
687 ret = PTR_ERR(info->regmap); in s5m_rtc_probe()
688 dev_err(&pdev->dev, "Failed to allocate RTC register map: %d\n", in s5m_rtc_probe()
693 info->dev = &pdev->dev; in s5m_rtc_probe()
694 info->s5m87xx = s5m87xx; in s5m_rtc_probe()
695 info->device_type = platform_get_device_id(pdev)->driver_data; in s5m_rtc_probe()
697 if (s5m87xx->irq_data) { in s5m_rtc_probe()
698 info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq); in s5m_rtc_probe()
699 if (info->irq <= 0) { in s5m_rtc_probe()
700 dev_err(&pdev->dev, "Failed to get virtual IRQ %d\n", in s5m_rtc_probe()
702 return -EINVAL; in s5m_rtc_probe()
712 info->rtc_dev = devm_rtc_allocate_device(&pdev->dev); in s5m_rtc_probe()
713 if (IS_ERR(info->rtc_dev)) in s5m_rtc_probe()
714 return PTR_ERR(info->rtc_dev); in s5m_rtc_probe()
716 info->rtc_dev->ops = &s5m_rtc_ops; in s5m_rtc_probe()
718 info->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_2000; in s5m_rtc_probe()
719 info->rtc_dev->range_max = RTC_TIMESTAMP_END_2099; in s5m_rtc_probe()
721 if (!info->irq) { in s5m_rtc_probe()
722 clear_bit(RTC_FEATURE_ALARM, info->rtc_dev->features); in s5m_rtc_probe()
724 ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, in s5m_rtc_probe()
725 s5m_rtc_alarm_irq, 0, "rtc-alarm0", in s5m_rtc_probe()
728 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", in s5m_rtc_probe()
729 info->irq, ret); in s5m_rtc_probe()
732 device_init_wakeup(&pdev->dev, true); in s5m_rtc_probe()
735 return devm_rtc_register_device(info->rtc_dev); in s5m_rtc_probe()
744 if (info->irq && device_may_wakeup(dev)) in s5m_rtc_resume()
745 ret = disable_irq_wake(info->irq); in s5m_rtc_resume()
755 if (info->irq && device_may_wakeup(dev)) in s5m_rtc_suspend()
756 ret = enable_irq_wake(info->irq); in s5m_rtc_suspend()
765 { "s5m-rtc", S5M8767X },
766 { "s2mps13-rtc", S2MPS13X },
767 { "s2mps14-rtc", S2MPS14X },
768 { "s2mps15-rtc", S2MPS15X },
775 .name = "s5m-rtc",