Lines Matching +full:wakeup +full:- +full:rtc +full:- +full:timer
1 // SPDX-License-Identifier: GPL-2.0+
14 #include <linux/rtc.h>
36 struct rtc_device *rtc; member
52 regmap_read(bbnsm->regmap, BBNSM_RTC_MS, &rtc_msb); in bbnsm_read_counter()
54 regmap_read(bbnsm->regmap, BBNSM_RTC_LS, &rtc_lsb); in bbnsm_read_counter()
57 } while (tmp != time && --timeout); in bbnsm_read_counter()
68 regmap_read(bbnsm->regmap, BBNSM_CTRL, &val); in bbnsm_rtc_read_time()
70 return -EINVAL; in bbnsm_rtc_read_time()
83 /* disable the RTC first */ in bbnsm_rtc_set_time()
84 regmap_update_bits(bbnsm->regmap, BBNSM_CTRL, RTC_EN_MSK, 0); in bbnsm_rtc_set_time()
86 /* write the 32bit sec time to 47 bit timer counter, leaving 15 LSBs blank */ in bbnsm_rtc_set_time()
87 regmap_write(bbnsm->regmap, BBNSM_RTC_LS, time << CNTR_TO_SECS_SH); in bbnsm_rtc_set_time()
88 regmap_write(bbnsm->regmap, BBNSM_RTC_MS, time >> (32 - CNTR_TO_SECS_SH)); in bbnsm_rtc_set_time()
90 /* Enable the RTC again */ in bbnsm_rtc_set_time()
91 regmap_update_bits(bbnsm->regmap, BBNSM_CTRL, RTC_EN_MSK, RTC_EN); in bbnsm_rtc_set_time()
101 regmap_read(bbnsm->regmap, BBNSM_TA, &bbnsm_ta); in bbnsm_rtc_read_alarm()
102 rtc_time64_to_tm(bbnsm_ta, &alrm->time); in bbnsm_rtc_read_alarm()
104 regmap_read(bbnsm->regmap, BBNSM_EVENTS, &bbnsm_events); in bbnsm_rtc_read_alarm()
105 alrm->pending = (bbnsm_events & BBNSM_EVENT_TA) ? 1 : 0; in bbnsm_rtc_read_alarm()
115 regmap_update_bits(bbnsm->regmap, BBNSM_CTRL, TA_EN_MSK, enable ? TA_EN : TA_DIS); in bbnsm_rtc_alarm_irq_enable()
117 regmap_update_bits(bbnsm->regmap, BBNSM_INT_EN, TA_EN_MSK, enable ? TA_EN : TA_DIS); in bbnsm_rtc_alarm_irq_enable()
125 unsigned long time = rtc_tm_to_time64(&alrm->time); in bbnsm_rtc_set_alarm()
128 regmap_update_bits(bbnsm->regmap, BBNSM_CTRL, TA_EN, TA_EN); in bbnsm_rtc_set_alarm()
131 regmap_write(bbnsm->regmap, BBNSM_TA, time); in bbnsm_rtc_set_alarm()
133 return bbnsm_rtc_alarm_irq_enable(dev, alrm->enabled); in bbnsm_rtc_set_alarm()
150 regmap_read(bbnsm->regmap, BBNSM_EVENTS, &val); in bbnsm_rtc_irq_handler()
154 regmap_write_bits(bbnsm->regmap, BBNSM_EVENTS, TA_EN_MSK, BBNSM_EVENT_TA); in bbnsm_rtc_irq_handler()
155 rtc_update_irq(bbnsm->rtc, 1, RTC_AF | RTC_IRQF); in bbnsm_rtc_irq_handler()
165 struct device_node *np = pdev->dev.of_node; in bbnsm_rtc_probe()
169 bbnsm = devm_kzalloc(&pdev->dev, sizeof(*bbnsm), GFP_KERNEL); in bbnsm_rtc_probe()
171 return -ENOMEM; in bbnsm_rtc_probe()
173 bbnsm->rtc = devm_rtc_allocate_device(&pdev->dev); in bbnsm_rtc_probe()
174 if (IS_ERR(bbnsm->rtc)) in bbnsm_rtc_probe()
175 return PTR_ERR(bbnsm->rtc); in bbnsm_rtc_probe()
177 bbnsm->regmap = syscon_node_to_regmap(np->parent); in bbnsm_rtc_probe()
178 if (IS_ERR(bbnsm->regmap)) { in bbnsm_rtc_probe()
179 dev_dbg(&pdev->dev, "bbnsm get regmap failed\n"); in bbnsm_rtc_probe()
180 return PTR_ERR(bbnsm->regmap); in bbnsm_rtc_probe()
183 bbnsm->irq = platform_get_irq(pdev, 0); in bbnsm_rtc_probe()
184 if (bbnsm->irq < 0) in bbnsm_rtc_probe()
185 return bbnsm->irq; in bbnsm_rtc_probe()
190 regmap_write(bbnsm->regmap, BBNSM_EVENTS, 0x7A); in bbnsm_rtc_probe()
192 ret = devm_device_init_wakeup(&pdev->dev); in bbnsm_rtc_probe()
194 dev_err(&pdev->dev, "failed to init wakeup, %d\n", ret); in bbnsm_rtc_probe()
196 ret = devm_pm_set_wake_irq(&pdev->dev, bbnsm->irq); in bbnsm_rtc_probe()
198 dev_err(&pdev->dev, "failed to set wake irq, %d\n", ret); in bbnsm_rtc_probe()
200 ret = devm_request_irq(&pdev->dev, bbnsm->irq, bbnsm_rtc_irq_handler, in bbnsm_rtc_probe()
201 IRQF_SHARED, "rtc alarm", &pdev->dev); in bbnsm_rtc_probe()
203 dev_err(&pdev->dev, "failed to request irq %d: %d\n", in bbnsm_rtc_probe()
204 bbnsm->irq, ret); in bbnsm_rtc_probe()
208 bbnsm->rtc->ops = &bbnsm_rtc_ops; in bbnsm_rtc_probe()
209 bbnsm->rtc->range_max = U32_MAX; in bbnsm_rtc_probe()
211 return devm_rtc_register_device(bbnsm->rtc); in bbnsm_rtc_probe()
215 { .compatible = "nxp,imx93-bbnsm-rtc" },
230 MODULE_DESCRIPTION("NXP BBNSM RTC Driver");