Lines Matching +full:data +full:- +full:out

1 // SPDX-License-Identifier: GPL-2.0+
7 // based on rtc-max8997.c
16 #include <linux/mfd/max77686-private.h>
22 #define MAX77686_INVALID_I2C_ADDR (-1)
25 #define MAX77686_INVALID_REG (-1)
179 .name = "max77686-rtc",
252 .name = "max77802-rtc",
271 static void max77686_rtc_data_to_tm(u8 *data, struct rtc_time *tm, in max77686_rtc_data_to_tm() argument
274 u8 mask = info->drv_data->mask; in max77686_rtc_data_to_tm()
276 tm->tm_sec = data[RTC_SEC] & mask; in max77686_rtc_data_to_tm()
277 tm->tm_min = data[RTC_MIN] & mask; in max77686_rtc_data_to_tm()
278 if (info->rtc_24hr_mode) { in max77686_rtc_data_to_tm()
279 tm->tm_hour = data[RTC_HOUR] & 0x1f; in max77686_rtc_data_to_tm()
281 tm->tm_hour = data[RTC_HOUR] & 0x0f; in max77686_rtc_data_to_tm()
282 if (data[RTC_HOUR] & HOUR_PM_MASK) in max77686_rtc_data_to_tm()
283 tm->tm_hour += 12; in max77686_rtc_data_to_tm()
286 /* Only a single bit is set in data[], so fls() would be equivalent */ in max77686_rtc_data_to_tm()
287 tm->tm_wday = ffs(data[RTC_WEEKDAY] & mask) - 1; in max77686_rtc_data_to_tm()
288 tm->tm_mday = data[RTC_DATE] & 0x1f; in max77686_rtc_data_to_tm()
289 tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1; in max77686_rtc_data_to_tm()
290 tm->tm_year = data[RTC_YEAR] & mask; in max77686_rtc_data_to_tm()
291 tm->tm_yday = 0; in max77686_rtc_data_to_tm()
292 tm->tm_isdst = 0; in max77686_rtc_data_to_tm()
298 if (!info->drv_data->alarm_enable_reg) in max77686_rtc_data_to_tm()
299 tm->tm_year += 100; in max77686_rtc_data_to_tm()
302 static int max77686_rtc_tm_to_data(struct rtc_time *tm, u8 *data, in max77686_rtc_tm_to_data() argument
305 data[RTC_SEC] = tm->tm_sec; in max77686_rtc_tm_to_data()
306 data[RTC_MIN] = tm->tm_min; in max77686_rtc_tm_to_data()
307 data[RTC_HOUR] = tm->tm_hour; in max77686_rtc_tm_to_data()
308 data[RTC_WEEKDAY] = 1 << tm->tm_wday; in max77686_rtc_tm_to_data()
309 data[RTC_DATE] = tm->tm_mday; in max77686_rtc_tm_to_data()
310 data[RTC_MONTH] = tm->tm_mon + 1; in max77686_rtc_tm_to_data()
312 if (info->drv_data->alarm_enable_reg) { in max77686_rtc_tm_to_data()
313 data[RTC_YEAR] = tm->tm_year; in max77686_rtc_tm_to_data()
317 data[RTC_YEAR] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0; in max77686_rtc_tm_to_data()
319 if (tm->tm_year < 100) { in max77686_rtc_tm_to_data()
320 dev_err(info->dev, "RTC cannot handle the year %d.\n", in max77686_rtc_tm_to_data()
321 1900 + tm->tm_year); in max77686_rtc_tm_to_data()
322 return -EINVAL; in max77686_rtc_tm_to_data()
332 unsigned int data; in max77686_rtc_update() local
333 unsigned long delay = info->drv_data->delay; in max77686_rtc_update()
336 data = 1 << RTC_UDR_SHIFT; in max77686_rtc_update()
338 data = 1 << RTC_RBUDR_SHIFT; in max77686_rtc_update()
340 ret = regmap_update_bits(info->rtc_regmap, in max77686_rtc_update()
341 info->drv_data->map[REG_RTC_UPDATE0], in max77686_rtc_update()
342 data, data); in max77686_rtc_update()
344 dev_err(info->dev, "Fail to write update reg(ret=%d, data=0x%x)\n", in max77686_rtc_update()
345 ret, data); in max77686_rtc_update()
357 u8 data[RTC_NR_TIME]; in max77686_rtc_read_time() local
360 mutex_lock(&info->lock); in max77686_rtc_read_time()
364 goto out; in max77686_rtc_read_time()
366 ret = regmap_bulk_read(info->rtc_regmap, in max77686_rtc_read_time()
367 info->drv_data->map[REG_RTC_SEC], in max77686_rtc_read_time()
368 data, ARRAY_SIZE(data)); in max77686_rtc_read_time()
370 dev_err(info->dev, "Fail to read time reg(%d)\n", ret); in max77686_rtc_read_time()
371 goto out; in max77686_rtc_read_time()
374 max77686_rtc_data_to_tm(data, tm, info); in max77686_rtc_read_time()
376 out: in max77686_rtc_read_time()
377 mutex_unlock(&info->lock); in max77686_rtc_read_time()
384 u8 data[RTC_NR_TIME]; in max77686_rtc_set_time() local
387 ret = max77686_rtc_tm_to_data(tm, data, info); in max77686_rtc_set_time()
391 mutex_lock(&info->lock); in max77686_rtc_set_time()
393 ret = regmap_bulk_write(info->rtc_regmap, in max77686_rtc_set_time()
394 info->drv_data->map[REG_RTC_SEC], in max77686_rtc_set_time()
395 data, ARRAY_SIZE(data)); in max77686_rtc_set_time()
397 dev_err(info->dev, "Fail to write time reg(%d)\n", ret); in max77686_rtc_set_time()
398 goto out; in max77686_rtc_set_time()
403 out: in max77686_rtc_set_time()
404 mutex_unlock(&info->lock); in max77686_rtc_set_time()
411 u8 data[RTC_NR_TIME]; in max77686_rtc_read_alarm() local
413 const unsigned int *map = info->drv_data->map; in max77686_rtc_read_alarm()
416 mutex_lock(&info->lock); in max77686_rtc_read_alarm()
420 goto out; in max77686_rtc_read_alarm()
422 ret = regmap_bulk_read(info->rtc_regmap, map[REG_ALARM1_SEC], in max77686_rtc_read_alarm()
423 data, ARRAY_SIZE(data)); in max77686_rtc_read_alarm()
425 dev_err(info->dev, "Fail to read alarm reg(%d)\n", ret); in max77686_rtc_read_alarm()
426 goto out; in max77686_rtc_read_alarm()
429 max77686_rtc_data_to_tm(data, &alrm->time, info); in max77686_rtc_read_alarm()
431 alrm->enabled = 0; in max77686_rtc_read_alarm()
433 if (info->drv_data->alarm_enable_reg) { in max77686_rtc_read_alarm()
435 ret = -EINVAL; in max77686_rtc_read_alarm()
436 dev_err(info->dev, in max77686_rtc_read_alarm()
438 goto out; in max77686_rtc_read_alarm()
441 ret = regmap_read(info->rtc_regmap, map[REG_RTC_AE1], &val); in max77686_rtc_read_alarm()
443 dev_err(info->dev, in max77686_rtc_read_alarm()
445 goto out; in max77686_rtc_read_alarm()
449 alrm->enabled = 1; in max77686_rtc_read_alarm()
451 for (i = 0; i < ARRAY_SIZE(data); i++) { in max77686_rtc_read_alarm()
452 if (data[i] & ALARM_ENABLE_MASK) { in max77686_rtc_read_alarm()
453 alrm->enabled = 1; in max77686_rtc_read_alarm()
459 alrm->pending = 0; in max77686_rtc_read_alarm()
461 if (info->drv_data->alarm_pending_status_reg == MAX77686_INVALID_REG) in max77686_rtc_read_alarm()
462 goto out; in max77686_rtc_read_alarm()
464 ret = regmap_read(info->regmap, in max77686_rtc_read_alarm()
465 info->drv_data->alarm_pending_status_reg, &val); in max77686_rtc_read_alarm()
467 dev_err(info->dev, in max77686_rtc_read_alarm()
469 goto out; in max77686_rtc_read_alarm()
473 alrm->pending = 1; in max77686_rtc_read_alarm()
475 out: in max77686_rtc_read_alarm()
476 mutex_unlock(&info->lock); in max77686_rtc_read_alarm()
482 u8 data[RTC_NR_TIME]; in max77686_rtc_stop_alarm() local
485 const unsigned int *map = info->drv_data->map; in max77686_rtc_stop_alarm()
487 if (!mutex_is_locked(&info->lock)) in max77686_rtc_stop_alarm()
488 dev_warn(info->dev, "%s: should have mutex locked\n", __func__); in max77686_rtc_stop_alarm()
492 goto out; in max77686_rtc_stop_alarm()
494 if (info->drv_data->alarm_enable_reg) { in max77686_rtc_stop_alarm()
496 ret = -EINVAL; in max77686_rtc_stop_alarm()
497 dev_err(info->dev, in max77686_rtc_stop_alarm()
499 goto out; in max77686_rtc_stop_alarm()
502 ret = regmap_write(info->rtc_regmap, map[REG_RTC_AE1], 0); in max77686_rtc_stop_alarm()
504 ret = regmap_bulk_read(info->rtc_regmap, map[REG_ALARM1_SEC], in max77686_rtc_stop_alarm()
505 data, ARRAY_SIZE(data)); in max77686_rtc_stop_alarm()
507 dev_err(info->dev, "Fail to read alarm reg(%d)\n", ret); in max77686_rtc_stop_alarm()
508 goto out; in max77686_rtc_stop_alarm()
511 max77686_rtc_data_to_tm(data, &tm, info); in max77686_rtc_stop_alarm()
513 for (i = 0; i < ARRAY_SIZE(data); i++) in max77686_rtc_stop_alarm()
514 data[i] &= ~ALARM_ENABLE_MASK; in max77686_rtc_stop_alarm()
516 ret = regmap_bulk_write(info->rtc_regmap, map[REG_ALARM1_SEC], in max77686_rtc_stop_alarm()
517 data, ARRAY_SIZE(data)); in max77686_rtc_stop_alarm()
521 dev_err(info->dev, "Fail to write alarm reg(%d)\n", ret); in max77686_rtc_stop_alarm()
522 goto out; in max77686_rtc_stop_alarm()
526 out: in max77686_rtc_stop_alarm()
532 u8 data[RTC_NR_TIME]; in max77686_rtc_start_alarm() local
535 const unsigned int *map = info->drv_data->map; in max77686_rtc_start_alarm()
537 if (!mutex_is_locked(&info->lock)) in max77686_rtc_start_alarm()
538 dev_warn(info->dev, "%s: should have mutex locked\n", __func__); in max77686_rtc_start_alarm()
542 goto out; in max77686_rtc_start_alarm()
544 if (info->drv_data->alarm_enable_reg) { in max77686_rtc_start_alarm()
545 ret = regmap_write(info->rtc_regmap, map[REG_RTC_AE1], in max77686_rtc_start_alarm()
548 ret = regmap_bulk_read(info->rtc_regmap, map[REG_ALARM1_SEC], in max77686_rtc_start_alarm()
549 data, ARRAY_SIZE(data)); in max77686_rtc_start_alarm()
551 dev_err(info->dev, "Fail to read alarm reg(%d)\n", ret); in max77686_rtc_start_alarm()
552 goto out; in max77686_rtc_start_alarm()
555 max77686_rtc_data_to_tm(data, &tm, info); in max77686_rtc_start_alarm()
557 data[RTC_SEC] |= (1 << ALARM_ENABLE_SHIFT); in max77686_rtc_start_alarm()
558 data[RTC_MIN] |= (1 << ALARM_ENABLE_SHIFT); in max77686_rtc_start_alarm()
559 data[RTC_HOUR] |= (1 << ALARM_ENABLE_SHIFT); in max77686_rtc_start_alarm()
560 data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK; in max77686_rtc_start_alarm()
561 if (data[RTC_MONTH] & 0xf) in max77686_rtc_start_alarm()
562 data[RTC_MONTH] |= (1 << ALARM_ENABLE_SHIFT); in max77686_rtc_start_alarm()
563 if (data[RTC_YEAR] & info->drv_data->mask) in max77686_rtc_start_alarm()
564 data[RTC_YEAR] |= (1 << ALARM_ENABLE_SHIFT); in max77686_rtc_start_alarm()
565 if (data[RTC_DATE] & 0x1f) in max77686_rtc_start_alarm()
566 data[RTC_DATE] |= (1 << ALARM_ENABLE_SHIFT); in max77686_rtc_start_alarm()
568 ret = regmap_bulk_write(info->rtc_regmap, map[REG_ALARM1_SEC], in max77686_rtc_start_alarm()
569 data, ARRAY_SIZE(data)); in max77686_rtc_start_alarm()
573 dev_err(info->dev, "Fail to write alarm reg(%d)\n", ret); in max77686_rtc_start_alarm()
574 goto out; in max77686_rtc_start_alarm()
578 out: in max77686_rtc_start_alarm()
585 u8 data[RTC_NR_TIME]; in max77686_rtc_set_alarm() local
588 ret = max77686_rtc_tm_to_data(&alrm->time, data, info); in max77686_rtc_set_alarm()
592 mutex_lock(&info->lock); in max77686_rtc_set_alarm()
596 goto out; in max77686_rtc_set_alarm()
598 ret = regmap_bulk_write(info->rtc_regmap, in max77686_rtc_set_alarm()
599 info->drv_data->map[REG_ALARM1_SEC], in max77686_rtc_set_alarm()
600 data, ARRAY_SIZE(data)); in max77686_rtc_set_alarm()
603 dev_err(info->dev, "Fail to write alarm reg(%d)\n", ret); in max77686_rtc_set_alarm()
604 goto out; in max77686_rtc_set_alarm()
609 goto out; in max77686_rtc_set_alarm()
611 if (alrm->enabled) in max77686_rtc_set_alarm()
613 out: in max77686_rtc_set_alarm()
614 mutex_unlock(&info->lock); in max77686_rtc_set_alarm()
624 mutex_lock(&info->lock); in max77686_rtc_alarm_irq_enable()
629 mutex_unlock(&info->lock); in max77686_rtc_alarm_irq_enable()
634 static irqreturn_t max77686_rtc_alarm_irq(int irq, void *data) in max77686_rtc_alarm_irq() argument
636 struct max77686_rtc_info *info = data; in max77686_rtc_alarm_irq()
638 dev_dbg(info->dev, "RTC alarm IRQ: %d\n", irq); in max77686_rtc_alarm_irq()
640 rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF); in max77686_rtc_alarm_irq()
655 u8 data[2]; in max77686_rtc_init_reg() local
659 data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); in max77686_rtc_init_reg()
660 data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); in max77686_rtc_init_reg()
662 info->rtc_24hr_mode = 1; in max77686_rtc_init_reg()
664 ret = regmap_bulk_write(info->rtc_regmap, in max77686_rtc_init_reg()
665 info->drv_data->map[REG_RTC_CONTROLM], in max77686_rtc_init_reg()
666 data, ARRAY_SIZE(data)); in max77686_rtc_init_reg()
668 dev_err(info->dev, "Fail to write controlm reg(%d)\n", ret); in max77686_rtc_init_reg()
678 struct device *parent = info->dev->parent; in max77686_init_rtc_regmap()
682 if (info->drv_data->rtc_irq_from_platform) { in max77686_init_rtc_regmap()
683 struct platform_device *pdev = to_platform_device(info->dev); in max77686_init_rtc_regmap()
685 info->rtc_irq = platform_get_irq(pdev, 0); in max77686_init_rtc_regmap()
686 if (info->rtc_irq < 0) in max77686_init_rtc_regmap()
687 return info->rtc_irq; in max77686_init_rtc_regmap()
689 info->rtc_irq = parent_i2c->irq; in max77686_init_rtc_regmap()
692 info->regmap = dev_get_regmap(parent, NULL); in max77686_init_rtc_regmap()
693 if (!info->regmap) { in max77686_init_rtc_regmap()
694 dev_err(info->dev, "Failed to get rtc regmap\n"); in max77686_init_rtc_regmap()
695 return -ENODEV; in max77686_init_rtc_regmap()
698 if (info->drv_data->rtc_i2c_addr == MAX77686_INVALID_I2C_ADDR) { in max77686_init_rtc_regmap()
699 info->rtc_regmap = info->regmap; in max77686_init_rtc_regmap()
703 info->rtc = devm_i2c_new_dummy_device(info->dev, parent_i2c->adapter, in max77686_init_rtc_regmap()
704 info->drv_data->rtc_i2c_addr); in max77686_init_rtc_regmap()
705 if (IS_ERR(info->rtc)) { in max77686_init_rtc_regmap()
706 dev_err(info->dev, "Failed to allocate I2C device for RTC\n"); in max77686_init_rtc_regmap()
707 return PTR_ERR(info->rtc); in max77686_init_rtc_regmap()
710 info->rtc_regmap = devm_regmap_init_i2c(info->rtc, in max77686_init_rtc_regmap()
711 info->drv_data->regmap_config); in max77686_init_rtc_regmap()
712 if (IS_ERR(info->rtc_regmap)) { in max77686_init_rtc_regmap()
713 ret = PTR_ERR(info->rtc_regmap); in max77686_init_rtc_regmap()
714 dev_err(info->dev, "Failed to allocate RTC regmap: %d\n", ret); in max77686_init_rtc_regmap()
719 ret = regmap_add_irq_chip(info->rtc_regmap, info->rtc_irq, in max77686_init_rtc_regmap()
721 IRQF_SHARED, 0, info->drv_data->rtc_irq_chip, in max77686_init_rtc_regmap()
722 &info->rtc_irq_data); in max77686_init_rtc_regmap()
724 dev_err(info->dev, "Failed to add RTC irq chip: %d\n", ret); in max77686_init_rtc_regmap()
737 info = devm_kzalloc(&pdev->dev, sizeof(struct max77686_rtc_info), in max77686_rtc_probe()
740 return -ENOMEM; in max77686_rtc_probe()
742 mutex_init(&info->lock); in max77686_rtc_probe()
743 info->dev = &pdev->dev; in max77686_rtc_probe()
744 info->drv_data = (const struct max77686_rtc_driver_data *) in max77686_rtc_probe()
745 id->driver_data; in max77686_rtc_probe()
755 dev_err(&pdev->dev, "Failed to initialize RTC reg:%d\n", ret); in max77686_rtc_probe()
759 device_init_wakeup(&pdev->dev, 1); in max77686_rtc_probe()
761 info->rtc_dev = devm_rtc_device_register(&pdev->dev, id->name, in max77686_rtc_probe()
764 if (IS_ERR(info->rtc_dev)) { in max77686_rtc_probe()
765 ret = PTR_ERR(info->rtc_dev); in max77686_rtc_probe()
766 dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret); in max77686_rtc_probe()
768 ret = -EINVAL; in max77686_rtc_probe()
772 info->virq = regmap_irq_get_virq(info->rtc_irq_data, in max77686_rtc_probe()
774 if (info->virq <= 0) { in max77686_rtc_probe()
775 ret = -ENXIO; in max77686_rtc_probe()
779 ret = request_threaded_irq(info->virq, NULL, max77686_rtc_alarm_irq, 0, in max77686_rtc_probe()
780 "rtc-alarm1", info); in max77686_rtc_probe()
782 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", in max77686_rtc_probe()
783 info->virq, ret); in max77686_rtc_probe()
790 regmap_del_irq_chip(info->rtc_irq, info->rtc_irq_data); in max77686_rtc_probe()
799 free_irq(info->virq, info); in max77686_rtc_remove()
800 regmap_del_irq_chip(info->rtc_irq, info->rtc_irq_data); in max77686_rtc_remove()
814 ret = enable_irq_wake(info->virq); in max77686_rtc_suspend()
825 if (!info->drv_data->rtc_irq_from_platform) in max77686_rtc_suspend()
826 disable_irq(info->rtc_irq); in max77686_rtc_suspend()
835 if (!info->drv_data->rtc_irq_from_platform) in max77686_rtc_resume()
836 enable_irq(info->rtc_irq); in max77686_rtc_resume()
841 return disable_irq_wake(info->virq); in max77686_rtc_resume()
852 { "max77686-rtc", .driver_data = (kernel_ulong_t)&max77686_drv_data, },
853 { "max77802-rtc", .driver_data = (kernel_ulong_t)&max77802_drv_data, },
854 { "max77620-rtc", .driver_data = (kernel_ulong_t)&max77620_drv_data, },
861 .name = "max77686-rtc",