Lines Matching full:rtc

3  * rtc-st-lpc.c - ST's LPC RTC, powered by the Low Power Timer
23 #include <linux/rtc.h>
52 static void st_rtc_set_hw_alarm(struct st_rtc *rtc, in st_rtc_set_hw_alarm() argument
57 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_set_hw_alarm()
59 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_set_hw_alarm()
61 writel_relaxed(msb, rtc->ioaddr + LPC_LPA_MSB_OFF); in st_rtc_set_hw_alarm()
62 writel_relaxed(lsb, rtc->ioaddr + LPC_LPA_LSB_OFF); in st_rtc_set_hw_alarm()
63 writel_relaxed(1, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_set_hw_alarm()
65 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_set_hw_alarm()
67 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_set_hw_alarm()
72 struct st_rtc *rtc = (struct st_rtc *)data; in st_rtc_handler() local
74 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF); in st_rtc_handler()
81 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_read_time() local
86 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_read_time()
89 lpt_msb = readl_relaxed(rtc->ioaddr + LPC_LPT_MSB_OFF); in st_rtc_read_time()
90 lpt_lsb = readl_relaxed(rtc->ioaddr + LPC_LPT_LSB_OFF); in st_rtc_read_time()
91 } while (readl_relaxed(rtc->ioaddr + LPC_LPT_MSB_OFF) != lpt_msb); in st_rtc_read_time()
93 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_read_time()
96 do_div(lpt, rtc->clkrate); in st_rtc_read_time()
104 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_set_time() local
110 lpt = (unsigned long long)secs * rtc->clkrate; in st_rtc_set_time()
112 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_set_time()
114 writel_relaxed(lpt >> 32, rtc->ioaddr + LPC_LPT_MSB_OFF); in st_rtc_set_time()
115 writel_relaxed(lpt, rtc->ioaddr + LPC_LPT_LSB_OFF); in st_rtc_set_time()
116 writel_relaxed(1, rtc->ioaddr + LPC_LPT_START_OFF); in st_rtc_set_time()
118 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_set_time()
125 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_read_alarm() local
128 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_read_alarm()
130 memcpy(wkalrm, &rtc->alarm, sizeof(struct rtc_wkalrm)); in st_rtc_read_alarm()
132 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_read_alarm()
139 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_alarm_irq_enable() local
141 if (enabled && !rtc->irq_enabled) { in st_rtc_alarm_irq_enable()
142 enable_irq(rtc->irq); in st_rtc_alarm_irq_enable()
143 rtc->irq_enabled = true; in st_rtc_alarm_irq_enable()
144 } else if (!enabled && rtc->irq_enabled) { in st_rtc_alarm_irq_enable()
145 disable_irq(rtc->irq); in st_rtc_alarm_irq_enable()
146 rtc->irq_enabled = false; in st_rtc_alarm_irq_enable()
154 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_set_alarm() local
164 memcpy(&rtc->alarm, t, sizeof(struct rtc_wkalrm)); in st_rtc_set_alarm()
168 lpa = (unsigned long long)alarm_secs * rtc->clkrate; in st_rtc_set_alarm()
170 st_rtc_set_hw_alarm(rtc, lpa >> 32, lpa); in st_rtc_set_alarm()
187 struct st_rtc *rtc; in st_rtc_probe() local
197 /* LPC can either run as a Clocksource or in RTC or WDT mode */ in st_rtc_probe()
201 rtc = devm_kzalloc(&pdev->dev, sizeof(struct st_rtc), GFP_KERNEL); in st_rtc_probe()
202 if (!rtc) in st_rtc_probe()
205 rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); in st_rtc_probe()
206 if (IS_ERR(rtc->rtc_dev)) in st_rtc_probe()
207 return PTR_ERR(rtc->rtc_dev); in st_rtc_probe()
209 spin_lock_init(&rtc->lock); in st_rtc_probe()
211 rtc->ioaddr = devm_platform_ioremap_resource(pdev, 0); in st_rtc_probe()
212 if (IS_ERR(rtc->ioaddr)) in st_rtc_probe()
213 return PTR_ERR(rtc->ioaddr); in st_rtc_probe()
215 rtc->irq = irq_of_parse_and_map(np, 0); in st_rtc_probe()
216 if (!rtc->irq) { in st_rtc_probe()
221 ret = devm_request_irq(&pdev->dev, rtc->irq, st_rtc_handler, 0, in st_rtc_probe()
222 pdev->name, rtc); in st_rtc_probe()
224 dev_err(&pdev->dev, "Failed to request irq %i\n", rtc->irq); in st_rtc_probe()
228 enable_irq_wake(rtc->irq); in st_rtc_probe()
229 disable_irq(rtc->irq); in st_rtc_probe()
231 rtc->clk = devm_clk_get_enabled(&pdev->dev, NULL); in st_rtc_probe()
232 if (IS_ERR(rtc->clk)) in st_rtc_probe()
233 return dev_err_probe(&pdev->dev, PTR_ERR(rtc->clk), in st_rtc_probe()
236 rtc->clkrate = clk_get_rate(rtc->clk); in st_rtc_probe()
237 if (!rtc->clkrate) { in st_rtc_probe()
244 platform_set_drvdata(pdev, rtc); in st_rtc_probe()
246 rtc->rtc_dev->ops = &st_rtc_ops; in st_rtc_probe()
247 rtc->rtc_dev->range_max = U64_MAX; in st_rtc_probe()
248 do_div(rtc->rtc_dev->range_max, rtc->clkrate); in st_rtc_probe()
250 ret = devm_rtc_register_device(rtc->rtc_dev); in st_rtc_probe()
260 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_suspend() local
265 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_suspend()
266 writel_relaxed(0, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_suspend()
267 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_suspend()
274 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_resume() local
276 rtc_alarm_irq_enable(rtc->rtc_dev, 0); in st_rtc_resume()
279 * clean 'rtc->alarm' to allow a new in st_rtc_resume()
280 * .set_alarm to the upper RTC layer in st_rtc_resume()
282 memset(&rtc->alarm, 0, sizeof(struct rtc_wkalrm)); in st_rtc_resume()
284 writel_relaxed(0, rtc->ioaddr + LPC_LPA_MSB_OFF); in st_rtc_resume()
285 writel_relaxed(0, rtc->ioaddr + LPC_LPA_LSB_OFF); in st_rtc_resume()
286 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_resume()
287 writel_relaxed(1, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_resume()
288 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_resume()
304 .name = "st-lpc-rtc",
313 MODULE_DESCRIPTION("STMicroelectronics LPC RTC driver");