Lines Matching +full:read +full:- +full:enable +full:- +full:delay

1 // SPDX-License-Identifier: GPL-2.0+
7 // based on rtc-max8997.c
12 #include <linux/delay.h>
16 #include <linux/mfd/max77686-private.h>
23 #define MAX77686_INVALID_I2C_ADDR (-1)
26 #define MAX77686_INVALID_REG (-1)
38 /* RTC Alarm Enable */
45 * MAX77802 has separate register (RTCAE1) for alarm enable instead
63 * struct max77686_rtc_driver_data - model-specific configuration
64 * @delay: Minimum usecs needed for a RTC update
65 * @mask: Mask used to read RTC registers value
67 * @alarm_enable_reg: Has a separate alarm enable register?
75 unsigned long delay; member
178 .name = "max77686-rtc",
192 .delay = 16000,
204 .name = "max77714-rtc",
209 .num_irqs = ARRAY_SIZE(max77686_rtc_irqs) - 1, /* no WTSR on 77714 */
213 .delay = 16000,
232 .delay = 16000,
273 .name = "max77802-rtc",
282 .delay = 200,
295 u8 mask = info->drv_data->mask; in max77686_rtc_data_to_tm()
297 tm->tm_sec = data[RTC_SEC] & mask; in max77686_rtc_data_to_tm()
298 tm->tm_min = data[RTC_MIN] & mask; in max77686_rtc_data_to_tm()
299 tm->tm_hour = data[RTC_HOUR] & 0x1f; in max77686_rtc_data_to_tm()
302 tm->tm_wday = ffs(data[RTC_WEEKDAY] & mask) - 1; in max77686_rtc_data_to_tm()
303 tm->tm_mday = data[RTC_MONTHDAY] & 0x1f; in max77686_rtc_data_to_tm()
304 tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1; in max77686_rtc_data_to_tm()
305 tm->tm_year = data[RTC_YEAR] & mask; in max77686_rtc_data_to_tm()
306 tm->tm_yday = 0; in max77686_rtc_data_to_tm()
307 tm->tm_isdst = 0; in max77686_rtc_data_to_tm()
313 if (!info->drv_data->alarm_enable_reg) in max77686_rtc_data_to_tm()
314 tm->tm_year += 100; in max77686_rtc_data_to_tm()
320 data[RTC_SEC] = tm->tm_sec; in max77686_rtc_tm_to_data()
321 data[RTC_MIN] = tm->tm_min; in max77686_rtc_tm_to_data()
322 data[RTC_HOUR] = tm->tm_hour; in max77686_rtc_tm_to_data()
323 data[RTC_WEEKDAY] = 1 << tm->tm_wday; in max77686_rtc_tm_to_data()
324 data[RTC_MONTHDAY] = tm->tm_mday; in max77686_rtc_tm_to_data()
325 data[RTC_MONTH] = tm->tm_mon + 1; in max77686_rtc_tm_to_data()
327 if (info->drv_data->alarm_enable_reg) { in max77686_rtc_tm_to_data()
328 data[RTC_YEAR] = tm->tm_year; in max77686_rtc_tm_to_data()
332 data[RTC_YEAR] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0; in max77686_rtc_tm_to_data()
334 if (tm->tm_year < 100) { in max77686_rtc_tm_to_data()
335 dev_err(info->dev, "RTC cannot handle the year %d.\n", in max77686_rtc_tm_to_data()
336 1900 + tm->tm_year); in max77686_rtc_tm_to_data()
337 return -EINVAL; in max77686_rtc_tm_to_data()
348 unsigned long delay = info->drv_data->delay; in max77686_rtc_update() local
355 ret = regmap_update_bits(info->rtc_regmap, in max77686_rtc_update()
356 info->drv_data->map[REG_RTC_UPDATE0], in max77686_rtc_update()
359 dev_err(info->dev, "Fail to write update reg(ret=%d, data=0x%x)\n", in max77686_rtc_update()
362 /* Minimum delay required before RTC update. */ in max77686_rtc_update()
363 usleep_range(delay, delay * 2); in max77686_rtc_update()
375 mutex_lock(&info->lock); in max77686_rtc_read_time()
381 ret = regmap_bulk_read(info->rtc_regmap, in max77686_rtc_read_time()
382 info->drv_data->map[REG_RTC_SEC], in max77686_rtc_read_time()
385 dev_err(info->dev, "Fail to read time reg(%d)\n", ret); in max77686_rtc_read_time()
392 mutex_unlock(&info->lock); in max77686_rtc_read_time()
406 mutex_lock(&info->lock); in max77686_rtc_set_time()
408 ret = regmap_bulk_write(info->rtc_regmap, in max77686_rtc_set_time()
409 info->drv_data->map[REG_RTC_SEC], in max77686_rtc_set_time()
412 dev_err(info->dev, "Fail to write time reg(%d)\n", ret); in max77686_rtc_set_time()
419 mutex_unlock(&info->lock); in max77686_rtc_set_time()
428 const unsigned int *map = info->drv_data->map; in max77686_rtc_read_alarm()
431 mutex_lock(&info->lock); in max77686_rtc_read_alarm()
437 ret = regmap_bulk_read(info->rtc_regmap, map[REG_ALARM1_SEC], in max77686_rtc_read_alarm()
440 dev_err(info->dev, "Fail to read alarm reg(%d)\n", ret); in max77686_rtc_read_alarm()
444 max77686_rtc_data_to_tm(data, &alrm->time, info); in max77686_rtc_read_alarm()
446 alrm->enabled = 0; in max77686_rtc_read_alarm()
448 if (info->drv_data->alarm_enable_reg) { in max77686_rtc_read_alarm()
450 ret = -EINVAL; in max77686_rtc_read_alarm()
451 dev_err(info->dev, in max77686_rtc_read_alarm()
452 "alarm enable register not set(%d)\n", ret); in max77686_rtc_read_alarm()
456 ret = regmap_read(info->rtc_regmap, map[REG_RTC_AE1], &val); in max77686_rtc_read_alarm()
458 dev_err(info->dev, in max77686_rtc_read_alarm()
459 "fail to read alarm enable(%d)\n", ret); in max77686_rtc_read_alarm()
464 alrm->enabled = 1; in max77686_rtc_read_alarm()
468 alrm->enabled = 1; in max77686_rtc_read_alarm()
474 alrm->pending = 0; in max77686_rtc_read_alarm()
476 if (info->drv_data->alarm_pending_status_reg == MAX77686_INVALID_REG) in max77686_rtc_read_alarm()
479 ret = regmap_read(info->regmap, in max77686_rtc_read_alarm()
480 info->drv_data->alarm_pending_status_reg, &val); in max77686_rtc_read_alarm()
482 dev_err(info->dev, in max77686_rtc_read_alarm()
483 "Fail to read alarm pending status reg(%d)\n", ret); in max77686_rtc_read_alarm()
488 alrm->pending = 1; in max77686_rtc_read_alarm()
491 mutex_unlock(&info->lock); in max77686_rtc_read_alarm()
500 const unsigned int *map = info->drv_data->map; in max77686_rtc_stop_alarm()
502 if (!mutex_is_locked(&info->lock)) in max77686_rtc_stop_alarm()
503 dev_warn(info->dev, "%s: should have mutex locked\n", __func__); in max77686_rtc_stop_alarm()
509 if (info->drv_data->alarm_enable_reg) { in max77686_rtc_stop_alarm()
511 ret = -EINVAL; in max77686_rtc_stop_alarm()
512 dev_err(info->dev, in max77686_rtc_stop_alarm()
513 "alarm enable register not set(%d)\n", ret); in max77686_rtc_stop_alarm()
517 ret = regmap_write(info->rtc_regmap, map[REG_RTC_AE1], 0); in max77686_rtc_stop_alarm()
519 ret = regmap_bulk_read(info->rtc_regmap, map[REG_ALARM1_SEC], in max77686_rtc_stop_alarm()
522 dev_err(info->dev, "Fail to read alarm reg(%d)\n", ret); in max77686_rtc_stop_alarm()
531 ret = regmap_bulk_write(info->rtc_regmap, map[REG_ALARM1_SEC], in max77686_rtc_stop_alarm()
536 dev_err(info->dev, "Fail to write alarm reg(%d)\n", ret); in max77686_rtc_stop_alarm()
550 const unsigned int *map = info->drv_data->map; in max77686_rtc_start_alarm()
552 if (!mutex_is_locked(&info->lock)) in max77686_rtc_start_alarm()
553 dev_warn(info->dev, "%s: should have mutex locked\n", __func__); in max77686_rtc_start_alarm()
559 if (info->drv_data->alarm_enable_reg) { in max77686_rtc_start_alarm()
560 ret = regmap_write(info->rtc_regmap, map[REG_RTC_AE1], in max77686_rtc_start_alarm()
563 ret = regmap_bulk_read(info->rtc_regmap, map[REG_ALARM1_SEC], in max77686_rtc_start_alarm()
566 dev_err(info->dev, "Fail to read alarm reg(%d)\n", ret); in max77686_rtc_start_alarm()
578 if (data[RTC_YEAR] & info->drv_data->mask) in max77686_rtc_start_alarm()
583 ret = regmap_bulk_write(info->rtc_regmap, map[REG_ALARM1_SEC], in max77686_rtc_start_alarm()
588 dev_err(info->dev, "Fail to write alarm reg(%d)\n", ret); in max77686_rtc_start_alarm()
603 ret = max77686_rtc_tm_to_data(&alrm->time, data, info); in max77686_rtc_set_alarm()
607 mutex_lock(&info->lock); in max77686_rtc_set_alarm()
613 ret = regmap_bulk_write(info->rtc_regmap, in max77686_rtc_set_alarm()
614 info->drv_data->map[REG_ALARM1_SEC], in max77686_rtc_set_alarm()
618 dev_err(info->dev, "Fail to write alarm reg(%d)\n", ret); in max77686_rtc_set_alarm()
626 if (alrm->enabled) in max77686_rtc_set_alarm()
629 mutex_unlock(&info->lock); in max77686_rtc_set_alarm()
639 mutex_lock(&info->lock); in max77686_rtc_alarm_irq_enable()
644 mutex_unlock(&info->lock); in max77686_rtc_alarm_irq_enable()
653 dev_dbg(info->dev, "RTC alarm IRQ: %d\n", irq); in max77686_rtc_alarm_irq()
655 rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF); in max77686_rtc_alarm_irq()
677 ret = regmap_bulk_write(info->rtc_regmap, in max77686_rtc_init_reg()
678 info->drv_data->map[REG_RTC_CONTROLM], in max77686_rtc_init_reg()
681 dev_err(info->dev, "Fail to write controlm reg(%d)\n", ret); in max77686_rtc_init_reg()
691 struct device *parent = info->dev->parent; in max77686_init_rtc_regmap()
696 if (info->drv_data->rtc_irq_from_platform) { in max77686_init_rtc_regmap()
697 struct platform_device *pdev = to_platform_device(info->dev); in max77686_init_rtc_regmap()
699 info->rtc_irq = platform_get_irq(pdev, 0); in max77686_init_rtc_regmap()
700 if (info->rtc_irq < 0) in max77686_init_rtc_regmap()
701 return info->rtc_irq; in max77686_init_rtc_regmap()
703 info->rtc_irq = parent_i2c->irq; in max77686_init_rtc_regmap()
706 info->regmap = dev_get_regmap(parent, NULL); in max77686_init_rtc_regmap()
707 if (!info->regmap) in max77686_init_rtc_regmap()
708 return dev_err_probe(info->dev, -ENODEV, in max77686_init_rtc_regmap()
711 if (info->drv_data->rtc_i2c_addr == MAX77686_INVALID_I2C_ADDR) { in max77686_init_rtc_regmap()
712 info->rtc_regmap = info->regmap; in max77686_init_rtc_regmap()
716 client = devm_i2c_new_dummy_device(info->dev, parent_i2c->adapter, in max77686_init_rtc_regmap()
717 info->drv_data->rtc_i2c_addr); in max77686_init_rtc_regmap()
719 return dev_err_probe(info->dev, PTR_ERR(client), in max77686_init_rtc_regmap()
722 info->rtc_regmap = devm_regmap_init_i2c(client, in max77686_init_rtc_regmap()
723 info->drv_data->regmap_config); in max77686_init_rtc_regmap()
724 if (IS_ERR(info->rtc_regmap)) in max77686_init_rtc_regmap()
725 return dev_err_probe(info->dev, PTR_ERR(info->rtc_regmap), in max77686_init_rtc_regmap()
729 ret = regmap_add_irq_chip(info->rtc_regmap, info->rtc_irq, in max77686_init_rtc_regmap()
731 0, info->drv_data->rtc_irq_chip, in max77686_init_rtc_regmap()
732 &info->rtc_irq_data); in max77686_init_rtc_regmap()
734 return dev_err_probe(info->dev, ret, in max77686_init_rtc_regmap()
746 info = devm_kzalloc(&pdev->dev, sizeof(struct max77686_rtc_info), in max77686_rtc_probe()
749 return -ENOMEM; in max77686_rtc_probe()
751 mutex_init(&info->lock); in max77686_rtc_probe()
752 info->dev = &pdev->dev; in max77686_rtc_probe()
753 info->drv_data = (const struct max77686_rtc_driver_data *) in max77686_rtc_probe()
754 id->driver_data; in max77686_rtc_probe()
764 dev_err(&pdev->dev, "Failed to initialize RTC reg:%d\n", ret); in max77686_rtc_probe()
768 device_init_wakeup(&pdev->dev, true); in max77686_rtc_probe()
770 info->rtc_dev = devm_rtc_device_register(&pdev->dev, id->name, in max77686_rtc_probe()
773 if (IS_ERR(info->rtc_dev)) { in max77686_rtc_probe()
774 ret = PTR_ERR(info->rtc_dev); in max77686_rtc_probe()
775 dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret); in max77686_rtc_probe()
777 ret = -EINVAL; in max77686_rtc_probe()
781 info->virq = regmap_irq_get_virq(info->rtc_irq_data, in max77686_rtc_probe()
783 if (info->virq <= 0) { in max77686_rtc_probe()
784 ret = -ENXIO; in max77686_rtc_probe()
788 ret = request_threaded_irq(info->virq, NULL, max77686_rtc_alarm_irq, 0, in max77686_rtc_probe()
789 "rtc-alarm1", info); in max77686_rtc_probe()
791 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", in max77686_rtc_probe()
792 info->virq, ret); in max77686_rtc_probe()
799 regmap_del_irq_chip(info->rtc_irq, info->rtc_irq_data); in max77686_rtc_probe()
808 free_irq(info->virq, info); in max77686_rtc_remove()
809 regmap_del_irq_chip(info->rtc_irq, info->rtc_irq_data); in max77686_rtc_remove()
821 ret = enable_irq_wake(info->virq); in max77686_rtc_suspend()
832 if (!info->drv_data->rtc_irq_from_platform) in max77686_rtc_suspend()
833 disable_irq(info->rtc_irq); in max77686_rtc_suspend()
842 if (!info->drv_data->rtc_irq_from_platform) in max77686_rtc_resume()
843 enable_irq(info->rtc_irq); in max77686_rtc_resume()
848 return disable_irq_wake(info->virq); in max77686_rtc_resume()
859 { "max77686-rtc", .driver_data = (kernel_ulong_t)&max77686_drv_data, },
860 { "max77802-rtc", .driver_data = (kernel_ulong_t)&max77802_drv_data, },
861 { "max77620-rtc", .driver_data = (kernel_ulong_t)&max77620_drv_data, },
862 { "max77714-rtc", .driver_data = (kernel_ulong_t)&max77714_drv_data, },
869 .name = "max77686-rtc",