Lines Matching full:rtc

14 #include <linux/rtc.h>
104 struct rtc_device *rtc; member
113 * The Spreadtrum RTC controller has 3 groups registers, including time, normal
114 * alarm and auxiliary alarm. The time group registers are used to set RTC time,
126 static int sprd_rtc_clear_alarm_ints(struct sprd_rtc *rtc) in sprd_rtc_clear_alarm_ints() argument
128 return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR, in sprd_rtc_clear_alarm_ints()
132 static int sprd_rtc_lock_alarm(struct sprd_rtc *rtc, bool lock) in sprd_rtc_lock_alarm() argument
137 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_SPG_VALUE, &val); in sprd_rtc_lock_alarm()
147 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_SPG_UPD, val); in sprd_rtc_lock_alarm()
152 ret = regmap_read_poll_timeout(rtc->regmap, in sprd_rtc_lock_alarm()
153 rtc->base + SPRD_RTC_INT_RAW_STS, val, in sprd_rtc_lock_alarm()
158 dev_err(rtc->dev, "failed to update SPG value:%d\n", ret); in sprd_rtc_lock_alarm()
162 return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR, in sprd_rtc_lock_alarm()
166 static int sprd_rtc_get_secs(struct sprd_rtc *rtc, enum sprd_rtc_reg_types type, in sprd_rtc_get_secs() argument
196 ret = regmap_read(rtc->regmap, rtc->base + sec_reg, &val); in sprd_rtc_get_secs()
202 ret = regmap_read(rtc->regmap, rtc->base + min_reg, &val); in sprd_rtc_get_secs()
208 ret = regmap_read(rtc->regmap, rtc->base + hour_reg, &val); in sprd_rtc_get_secs()
214 ret = regmap_read(rtc->regmap, rtc->base + day_reg, &val); in sprd_rtc_get_secs()
223 static int sprd_rtc_set_secs(struct sprd_rtc *rtc, enum sprd_rtc_reg_types type, in sprd_rtc_set_secs() argument
230 /* convert seconds to RTC time format */ in sprd_rtc_set_secs()
263 ret = regmap_write(rtc->regmap, rtc->base + sec_reg, sec); in sprd_rtc_set_secs()
267 ret = regmap_write(rtc->regmap, rtc->base + min_reg, min); in sprd_rtc_set_secs()
271 ret = regmap_write(rtc->regmap, rtc->base + hour_reg, hour); in sprd_rtc_set_secs()
275 ret = regmap_write(rtc->regmap, rtc->base + day_reg, day); in sprd_rtc_set_secs()
288 ret = regmap_read_poll_timeout(rtc->regmap, in sprd_rtc_set_secs()
289 rtc->base + SPRD_RTC_INT_RAW_STS, val, in sprd_rtc_set_secs()
294 dev_err(rtc->dev, "set time/alarm values timeout\n"); in sprd_rtc_set_secs()
298 return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR, in sprd_rtc_set_secs()
304 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_read_aux_alarm() local
309 ret = sprd_rtc_get_secs(rtc, SPRD_RTC_AUX_ALARM, &secs); in sprd_rtc_read_aux_alarm()
315 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, &val); in sprd_rtc_read_aux_alarm()
321 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_RAW_STS, &val); in sprd_rtc_read_aux_alarm()
331 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_set_aux_alarm() local
336 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR, in sprd_rtc_set_aux_alarm()
341 ret = sprd_rtc_set_secs(rtc, SPRD_RTC_AUX_ALARM, secs); in sprd_rtc_set_aux_alarm()
346 ret = regmap_update_bits(rtc->regmap, in sprd_rtc_set_aux_alarm()
347 rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_set_aux_alarm()
351 ret = regmap_update_bits(rtc->regmap, in sprd_rtc_set_aux_alarm()
352 rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_set_aux_alarm()
361 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_read_time() local
365 if (!rtc->valid) { in sprd_rtc_read_time()
366 dev_warn(dev, "RTC values are invalid\n"); in sprd_rtc_read_time()
370 ret = sprd_rtc_get_secs(rtc, SPRD_RTC_TIME, &secs); in sprd_rtc_read_time()
380 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_set_time() local
384 ret = sprd_rtc_set_secs(rtc, SPRD_RTC_TIME, secs); in sprd_rtc_set_time()
388 if (!rtc->valid) { in sprd_rtc_set_time()
389 /* Clear RTC power status firstly */ in sprd_rtc_set_time()
390 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_PWR_CTRL, in sprd_rtc_set_time()
396 * Set RTC power status to indicate now RTC has valid time in sprd_rtc_set_time()
399 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_PWR_CTRL, in sprd_rtc_set_time()
404 rtc->valid = true; in sprd_rtc_set_time()
412 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_read_alarm() local
418 * Before RTC device is registered, it will check to see if there is an in sprd_rtc_read_alarm()
419 * alarm already set in RTC hardware, and we always read the normal in sprd_rtc_read_alarm()
425 if (rtc->rtc && rtc->rtc->registered && rtc->rtc->aie_timer.enabled == 0) in sprd_rtc_read_alarm()
428 ret = sprd_rtc_get_secs(rtc, SPRD_RTC_ALARM, &secs); in sprd_rtc_read_alarm()
434 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, &val); in sprd_rtc_read_alarm()
440 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_RAW_STS, &val); in sprd_rtc_read_alarm()
450 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_set_alarm() local
453 rtc_ktime_to_tm(rtc->rtc->aie_timer.node.expires); in sprd_rtc_set_alarm()
469 if (!rtc->rtc->aie_timer.enabled || rtc_tm_sub(&aie_time, &alrm->time)) in sprd_rtc_set_alarm()
473 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR, in sprd_rtc_set_alarm()
478 ret = sprd_rtc_set_secs(rtc, SPRD_RTC_ALARM, secs); in sprd_rtc_set_alarm()
483 ret = regmap_update_bits(rtc->regmap, in sprd_rtc_set_alarm()
484 rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_set_alarm()
491 ret = sprd_rtc_lock_alarm(rtc, false); in sprd_rtc_set_alarm()
493 regmap_update_bits(rtc->regmap, in sprd_rtc_set_alarm()
494 rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_set_alarm()
501 ret = sprd_rtc_lock_alarm(rtc, true); in sprd_rtc_set_alarm()
509 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_alarm_irq_enable() local
513 ret = regmap_update_bits(rtc->regmap, in sprd_rtc_alarm_irq_enable()
514 rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_alarm_irq_enable()
520 ret = sprd_rtc_lock_alarm(rtc, false); in sprd_rtc_alarm_irq_enable()
522 regmap_update_bits(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_alarm_irq_enable()
525 ret = sprd_rtc_lock_alarm(rtc, true); in sprd_rtc_alarm_irq_enable()
541 struct sprd_rtc *rtc = dev_id; in sprd_rtc_handler() local
544 ret = sprd_rtc_clear_alarm_ints(rtc); in sprd_rtc_handler()
548 rtc_update_irq(rtc->rtc, 1, RTC_AF | RTC_IRQF); in sprd_rtc_handler()
552 static int sprd_rtc_check_power_down(struct sprd_rtc *rtc) in sprd_rtc_check_power_down() argument
557 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_PWR_STS, &val); in sprd_rtc_check_power_down()
562 * If the RTC power status value is SPRD_RTC_POWER_RESET_VALUE, which in sprd_rtc_check_power_down()
563 * means the RTC has been powered down, so the RTC time values are in sprd_rtc_check_power_down()
566 rtc->valid = val == SPRD_RTC_POWER_RESET_VALUE ? false : true; in sprd_rtc_check_power_down()
570 static int sprd_rtc_check_alarm_int(struct sprd_rtc *rtc) in sprd_rtc_check_alarm_int() argument
575 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_SPG_VALUE, &val); in sprd_rtc_check_alarm_int()
586 * so we should enable the alarm interrupt to help RTC core to see if in sprd_rtc_check_alarm_int()
587 * there is an alarm already set in RTC hardware. in sprd_rtc_check_alarm_int()
592 return regmap_update_bits(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_check_alarm_int()
599 struct sprd_rtc *rtc; in sprd_rtc_probe() local
602 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); in sprd_rtc_probe()
603 if (!rtc) in sprd_rtc_probe()
606 rtc->regmap = dev_get_regmap(pdev->dev.parent, NULL); in sprd_rtc_probe()
607 if (!rtc->regmap) in sprd_rtc_probe()
610 ret = of_property_read_u32(node, "reg", &rtc->base); in sprd_rtc_probe()
612 dev_err(&pdev->dev, "failed to get RTC base address\n"); in sprd_rtc_probe()
616 rtc->irq = platform_get_irq(pdev, 0); in sprd_rtc_probe()
617 if (rtc->irq < 0) in sprd_rtc_probe()
618 return rtc->irq; in sprd_rtc_probe()
620 rtc->rtc = devm_rtc_allocate_device(&pdev->dev); in sprd_rtc_probe()
621 if (IS_ERR(rtc->rtc)) in sprd_rtc_probe()
622 return PTR_ERR(rtc->rtc); in sprd_rtc_probe()
624 rtc->dev = &pdev->dev; in sprd_rtc_probe()
625 platform_set_drvdata(pdev, rtc); in sprd_rtc_probe()
628 ret = sprd_rtc_check_alarm_int(rtc); in sprd_rtc_probe()
630 dev_err(&pdev->dev, "failed to check RTC alarm interrupt\n"); in sprd_rtc_probe()
634 /* check if RTC time values are valid */ in sprd_rtc_probe()
635 ret = sprd_rtc_check_power_down(rtc); in sprd_rtc_probe()
637 dev_err(&pdev->dev, "failed to check RTC time values\n"); in sprd_rtc_probe()
641 ret = devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL, in sprd_rtc_probe()
644 pdev->name, rtc); in sprd_rtc_probe()
646 dev_err(&pdev->dev, "failed to request RTC irq\n"); in sprd_rtc_probe()
652 rtc->rtc->ops = &sprd_rtc_ops; in sprd_rtc_probe()
653 rtc->rtc->range_min = 0; in sprd_rtc_probe()
654 rtc->rtc->range_max = 5662310399LL; in sprd_rtc_probe()
655 ret = rtc_register_device(rtc->rtc); in sprd_rtc_probe()
665 { .compatible = "sprd,sc2731-rtc", },
672 .name = "sprd-rtc",
680 MODULE_DESCRIPTION("Spreadtrum RTC Device Driver");