Lines Matching refs:rtc

104 	struct rtc_device	*rtc;  member
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_disable_ints(struct sprd_rtc *rtc) in sprd_rtc_disable_ints() argument
136 ret = regmap_update_bits(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_disable_ints()
141 return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR, in sprd_rtc_disable_ints()
145 static int sprd_rtc_lock_alarm(struct sprd_rtc *rtc, bool lock) in sprd_rtc_lock_alarm() argument
150 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_SPG_VALUE, &val); in sprd_rtc_lock_alarm()
160 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_SPG_UPD, val); in sprd_rtc_lock_alarm()
165 ret = regmap_read_poll_timeout(rtc->regmap, in sprd_rtc_lock_alarm()
166 rtc->base + SPRD_RTC_INT_RAW_STS, val, in sprd_rtc_lock_alarm()
171 dev_err(rtc->dev, "failed to update SPG value:%d\n", ret); in sprd_rtc_lock_alarm()
178 static int sprd_rtc_get_secs(struct sprd_rtc *rtc, enum sprd_rtc_reg_types type, in sprd_rtc_get_secs() argument
208 ret = regmap_read(rtc->regmap, rtc->base + sec_reg, &val); in sprd_rtc_get_secs()
214 ret = regmap_read(rtc->regmap, rtc->base + min_reg, &val); in sprd_rtc_get_secs()
220 ret = regmap_read(rtc->regmap, rtc->base + hour_reg, &val); in sprd_rtc_get_secs()
226 ret = regmap_read(rtc->regmap, rtc->base + day_reg, &val); in sprd_rtc_get_secs()
235 static int sprd_rtc_set_secs(struct sprd_rtc *rtc, enum sprd_rtc_reg_types type, in sprd_rtc_set_secs() argument
275 ret = regmap_write(rtc->regmap, rtc->base + sec_reg, sec); in sprd_rtc_set_secs()
279 ret = regmap_write(rtc->regmap, rtc->base + min_reg, min); in sprd_rtc_set_secs()
283 ret = regmap_write(rtc->regmap, rtc->base + hour_reg, hour); in sprd_rtc_set_secs()
287 ret = regmap_write(rtc->regmap, rtc->base + day_reg, day); in sprd_rtc_set_secs()
300 ret = regmap_read_poll_timeout(rtc->regmap, in sprd_rtc_set_secs()
301 rtc->base + SPRD_RTC_INT_RAW_STS, val, in sprd_rtc_set_secs()
306 dev_err(rtc->dev, "set time/alarm values timeout\n"); in sprd_rtc_set_secs()
310 return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR, in sprd_rtc_set_secs()
316 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_read_aux_alarm() local
321 ret = sprd_rtc_get_secs(rtc, SPRD_RTC_AUX_ALARM, &secs); in sprd_rtc_read_aux_alarm()
327 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, &val); in sprd_rtc_read_aux_alarm()
333 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_RAW_STS, &val); in sprd_rtc_read_aux_alarm()
343 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_set_aux_alarm() local
348 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR, in sprd_rtc_set_aux_alarm()
353 ret = sprd_rtc_set_secs(rtc, SPRD_RTC_AUX_ALARM, secs); in sprd_rtc_set_aux_alarm()
358 ret = regmap_update_bits(rtc->regmap, in sprd_rtc_set_aux_alarm()
359 rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_set_aux_alarm()
363 ret = regmap_update_bits(rtc->regmap, in sprd_rtc_set_aux_alarm()
364 rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_set_aux_alarm()
373 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_read_time() local
377 if (!rtc->valid) { in sprd_rtc_read_time()
382 ret = sprd_rtc_get_secs(rtc, SPRD_RTC_TIME, &secs); in sprd_rtc_read_time()
392 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_set_time() local
396 ret = sprd_rtc_set_secs(rtc, SPRD_RTC_TIME, secs); in sprd_rtc_set_time()
400 if (!rtc->valid) { in sprd_rtc_set_time()
402 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_PWR_CTRL, in sprd_rtc_set_time()
411 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_PWR_CTRL, in sprd_rtc_set_time()
416 rtc->valid = true; in sprd_rtc_set_time()
424 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_read_alarm() local
433 if (rtc->rtc && rtc->rtc->aie_timer.enabled == 0) in sprd_rtc_read_alarm()
436 ret = sprd_rtc_get_secs(rtc, SPRD_RTC_ALARM, &secs); in sprd_rtc_read_alarm()
442 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, &val); in sprd_rtc_read_alarm()
448 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_RAW_STS, &val); in sprd_rtc_read_alarm()
458 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_set_alarm() local
461 rtc_ktime_to_tm(rtc->rtc->aie_timer.node.expires); in sprd_rtc_set_alarm()
477 if (!rtc->rtc->aie_timer.enabled || rtc_tm_sub(&aie_time, &alrm->time)) in sprd_rtc_set_alarm()
481 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR, in sprd_rtc_set_alarm()
486 ret = sprd_rtc_set_secs(rtc, SPRD_RTC_ALARM, secs); in sprd_rtc_set_alarm()
491 ret = regmap_update_bits(rtc->regmap, in sprd_rtc_set_alarm()
492 rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_set_alarm()
499 ret = sprd_rtc_lock_alarm(rtc, false); in sprd_rtc_set_alarm()
501 regmap_update_bits(rtc->regmap, in sprd_rtc_set_alarm()
502 rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_set_alarm()
509 ret = sprd_rtc_lock_alarm(rtc, true); in sprd_rtc_set_alarm()
517 struct sprd_rtc *rtc = dev_get_drvdata(dev); in sprd_rtc_alarm_irq_enable() local
521 ret = regmap_update_bits(rtc->regmap, in sprd_rtc_alarm_irq_enable()
522 rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_alarm_irq_enable()
528 ret = sprd_rtc_lock_alarm(rtc, false); in sprd_rtc_alarm_irq_enable()
530 regmap_update_bits(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, in sprd_rtc_alarm_irq_enable()
533 ret = sprd_rtc_lock_alarm(rtc, true); in sprd_rtc_alarm_irq_enable()
549 struct sprd_rtc *rtc = dev_id; in sprd_rtc_handler() local
552 ret = sprd_rtc_clear_alarm_ints(rtc); in sprd_rtc_handler()
556 rtc_update_irq(rtc->rtc, 1, RTC_AF | RTC_IRQF); in sprd_rtc_handler()
560 static int sprd_rtc_check_power_down(struct sprd_rtc *rtc) in sprd_rtc_check_power_down() argument
565 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_PWR_STS, &val); in sprd_rtc_check_power_down()
574 rtc->valid = val == SPRD_RTC_POWER_RESET_VALUE ? false : true; in sprd_rtc_check_power_down()
581 struct sprd_rtc *rtc; in sprd_rtc_probe() local
584 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); in sprd_rtc_probe()
585 if (!rtc) in sprd_rtc_probe()
588 rtc->regmap = dev_get_regmap(pdev->dev.parent, NULL); in sprd_rtc_probe()
589 if (!rtc->regmap) in sprd_rtc_probe()
592 ret = of_property_read_u32(node, "reg", &rtc->base); in sprd_rtc_probe()
598 rtc->irq = platform_get_irq(pdev, 0); in sprd_rtc_probe()
599 if (rtc->irq < 0) { in sprd_rtc_probe()
601 return rtc->irq; in sprd_rtc_probe()
604 rtc->rtc = devm_rtc_allocate_device(&pdev->dev); in sprd_rtc_probe()
605 if (IS_ERR(rtc->rtc)) in sprd_rtc_probe()
606 return PTR_ERR(rtc->rtc); in sprd_rtc_probe()
608 rtc->dev = &pdev->dev; in sprd_rtc_probe()
609 platform_set_drvdata(pdev, rtc); in sprd_rtc_probe()
612 ret = sprd_rtc_disable_ints(rtc); in sprd_rtc_probe()
619 ret = sprd_rtc_check_power_down(rtc); in sprd_rtc_probe()
625 ret = devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL, in sprd_rtc_probe()
628 pdev->name, rtc); in sprd_rtc_probe()
634 rtc->rtc->ops = &sprd_rtc_ops; in sprd_rtc_probe()
635 rtc->rtc->range_min = 0; in sprd_rtc_probe()
636 rtc->rtc->range_max = 5662310399LL; in sprd_rtc_probe()
637 ret = rtc_register_device(rtc->rtc); in sprd_rtc_probe()