14 #include <linux/kernel.h>
15 #include <linux/module.h>
19 #include <linux/rtc.h>
22 #define SNVS_LPCR 0x04
23 #define SNVS_LPSR 0x18
24 #define SNVS_LPSRTCMR 0x1c
25 #define SNVS_LPSRTCLR 0x20
26 #define SNVS_LPTAR 0x24
27 #define SNVS_LPPGDR 0x30
29 #define SNVS_LPCR_SRTC_ENV (1 << 0)
30 #define SNVS_LPCR_LPTA_EN (1 << 1)
31 #define SNVS_LPCR_LPWUI_EN (1 << 3)
32 #define SNVS_LPSR_LPTA (1 << 0)
34 #define SNVS_LPPGDR_INIT 0x41736166
35 #define CNTR_TO_SECS_SH 15
44 static u32 rtc_read_lp_counter(
void __iomem *ioaddr)
56 }
while (read1 != read2);
62 static void rtc_write_sync_lp(
void __iomem *ioaddr)
68 for (i = 0; i < 3; i++) {
72 }
while (count1 != count2);
79 }
while (count2 != count3);
80 }
while (count3 == count1);
99 spin_unlock_irqrestore(&data->
lock, flags);
122 unsigned long time = rtc_read_lp_counter(data->
ioaddr);
137 snvs_rtc_enable(data,
false);
144 snvs_rtc_enable(data,
true);
163 static int snvs_rtc_alarm_irq_enable(
struct device *dev,
unsigned int enable)
178 spin_unlock_irqrestore(&data->
lock, flags);
180 rtc_write_sync_lp(data->
ioaddr);
202 spin_unlock_irqrestore(&data->
lock, flags);
209 return snvs_rtc_alarm_irq_enable(dev, alrm->
enabled);
213 .read_time = snvs_rtc_read_time,
214 .set_time = snvs_rtc_set_time,
215 .read_alarm = snvs_rtc_read_alarm,
216 .set_alarm = snvs_rtc_set_alarm,
217 .alarm_irq_enable = snvs_rtc_alarm_irq_enable,
233 snvs_rtc_alarm_irq_enable(dev, 0);
263 platform_set_drvdata(pdev, data);
274 snvs_rtc_enable(data,
true);
278 ret = devm_request_irq(&pdev->
dev, data->
irq, snvs_rtc_irq_handler,
281 dev_err(&pdev->
dev,
"failed to request irq %d: %d\n",
288 if (IS_ERR(data->
rtc)) {
289 ret = PTR_ERR(data->
rtc);
290 dev_err(&pdev->
dev,
"failed to register rtc: %d\n", ret);
306 #ifdef CONFIG_PM_SLEEP
307 static int snvs_rtc_suspend(
struct device *dev)
311 if (device_may_wakeup(dev))
312 enable_irq_wake(data->
irq);
317 static int snvs_rtc_resume(
struct device *dev)
321 if (device_may_wakeup(dev))
322 disable_irq_wake(data->
irq);
331 { .compatible =
"fsl,sec-v4.0-mon-rtc-lp", },
340 .pm = &snvs_rtc_pm_ops,
341 .of_match_table = snvs_dt_ids,
343 .probe = snvs_rtc_probe,