Lines Matching refs:rtc
57 static void st_rtc_set_hw_alarm(struct st_rtc *rtc, in st_rtc_set_hw_alarm() argument
62 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_set_hw_alarm()
64 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_set_hw_alarm()
66 writel_relaxed(msb, rtc->ioaddr + LPC_LPA_MSB_OFF); in st_rtc_set_hw_alarm()
67 writel_relaxed(lsb, rtc->ioaddr + LPC_LPA_LSB_OFF); in st_rtc_set_hw_alarm()
68 writel_relaxed(1, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_set_hw_alarm()
70 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_set_hw_alarm()
72 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_set_hw_alarm()
77 struct st_rtc *rtc = (struct st_rtc *)data; in st_rtc_handler() local
79 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF); in st_rtc_handler()
86 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_read_time() local
91 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_read_time()
94 lpt_msb = readl_relaxed(rtc->ioaddr + LPC_LPT_MSB_OFF); in st_rtc_read_time()
95 lpt_lsb = readl_relaxed(rtc->ioaddr + LPC_LPT_LSB_OFF); in st_rtc_read_time()
96 } while (readl_relaxed(rtc->ioaddr + LPC_LPT_MSB_OFF) != lpt_msb); in st_rtc_read_time()
98 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_read_time()
101 do_div(lpt, rtc->clkrate); in st_rtc_read_time()
109 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_set_time() local
118 lpt = (unsigned long long)secs * rtc->clkrate; in st_rtc_set_time()
120 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_set_time()
122 writel_relaxed(lpt >> 32, rtc->ioaddr + LPC_LPT_MSB_OFF); in st_rtc_set_time()
123 writel_relaxed(lpt, rtc->ioaddr + LPC_LPT_LSB_OFF); in st_rtc_set_time()
124 writel_relaxed(1, rtc->ioaddr + LPC_LPT_START_OFF); in st_rtc_set_time()
126 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_set_time()
133 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_read_alarm() local
136 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_read_alarm()
138 memcpy(wkalrm, &rtc->alarm, sizeof(struct rtc_wkalrm)); in st_rtc_read_alarm()
140 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_read_alarm()
147 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_alarm_irq_enable() local
149 if (enabled && !rtc->irq_enabled) { in st_rtc_alarm_irq_enable()
150 enable_irq(rtc->irq); in st_rtc_alarm_irq_enable()
151 rtc->irq_enabled = true; in st_rtc_alarm_irq_enable()
152 } else if (!enabled && rtc->irq_enabled) { in st_rtc_alarm_irq_enable()
153 disable_irq(rtc->irq); in st_rtc_alarm_irq_enable()
154 rtc->irq_enabled = false; in st_rtc_alarm_irq_enable()
162 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_set_alarm() local
176 memcpy(&rtc->alarm, t, sizeof(struct rtc_wkalrm)); in st_rtc_set_alarm()
180 lpa = (unsigned long long)alarm_secs * rtc->clkrate; in st_rtc_set_alarm()
182 st_rtc_set_hw_alarm(rtc, lpa >> 32, lpa); in st_rtc_set_alarm()
199 struct st_rtc *rtc; in st_rtc_probe() local
215 rtc = devm_kzalloc(&pdev->dev, sizeof(struct st_rtc), GFP_KERNEL); in st_rtc_probe()
216 if (!rtc) in st_rtc_probe()
219 spin_lock_init(&rtc->lock); in st_rtc_probe()
222 rtc->ioaddr = devm_ioremap_resource(&pdev->dev, res); in st_rtc_probe()
223 if (IS_ERR(rtc->ioaddr)) in st_rtc_probe()
224 return PTR_ERR(rtc->ioaddr); in st_rtc_probe()
226 rtc->irq = irq_of_parse_and_map(np, 0); in st_rtc_probe()
227 if (!rtc->irq) { in st_rtc_probe()
232 ret = devm_request_irq(&pdev->dev, rtc->irq, st_rtc_handler, 0, in st_rtc_probe()
233 pdev->name, rtc); in st_rtc_probe()
235 dev_err(&pdev->dev, "Failed to request irq %i\n", rtc->irq); in st_rtc_probe()
239 enable_irq_wake(rtc->irq); in st_rtc_probe()
240 disable_irq(rtc->irq); in st_rtc_probe()
242 rtc->clk = clk_get(&pdev->dev, NULL); in st_rtc_probe()
243 if (IS_ERR(rtc->clk)) { in st_rtc_probe()
245 return PTR_ERR(rtc->clk); in st_rtc_probe()
248 clk_prepare_enable(rtc->clk); in st_rtc_probe()
250 rtc->clkrate = clk_get_rate(rtc->clk); in st_rtc_probe()
251 if (!rtc->clkrate) { in st_rtc_probe()
258 platform_set_drvdata(pdev, rtc); in st_rtc_probe()
275 rtc->rtc_dev = rtc_device_register("st-lpc-rtc", &pdev->dev, in st_rtc_probe()
277 if (IS_ERR(rtc->rtc_dev)) { in st_rtc_probe()
278 clk_disable_unprepare(rtc->clk); in st_rtc_probe()
279 return PTR_ERR(rtc->rtc_dev); in st_rtc_probe()
287 struct st_rtc *rtc = platform_get_drvdata(pdev); in st_rtc_remove() local
289 if (likely(rtc->rtc_dev)) in st_rtc_remove()
290 rtc_device_unregister(rtc->rtc_dev); in st_rtc_remove()
298 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_suspend() local
303 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_suspend()
304 writel_relaxed(0, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_suspend()
305 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_suspend()
312 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_resume() local
314 rtc_alarm_irq_enable(rtc->rtc_dev, 0); in st_rtc_resume()
320 memset(&rtc->alarm, 0, sizeof(struct rtc_wkalrm)); in st_rtc_resume()
322 writel_relaxed(0, rtc->ioaddr + LPC_LPA_MSB_OFF); in st_rtc_resume()
323 writel_relaxed(0, rtc->ioaddr + LPC_LPA_LSB_OFF); in st_rtc_resume()
324 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_resume()
325 writel_relaxed(1, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_resume()
326 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_resume()