Lines Matching refs:rtcdrv

58 static u32 sirfsoc_rtc_readl(struct sirfsoc_rtc_drv *rtcdrv, u32 offset)  in sirfsoc_rtc_readl()  argument
62 regmap_read(rtcdrv->regmap, rtcdrv->rtc_base + offset, &val); in sirfsoc_rtc_readl()
66 static void sirfsoc_rtc_writel(struct sirfsoc_rtc_drv *rtcdrv, in sirfsoc_rtc_writel() argument
69 regmap_write(rtcdrv->regmap, rtcdrv->rtc_base + offset, val); in sirfsoc_rtc_writel()
76 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_read_alarm() local
78 rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_read_alarm()
80 spin_lock_irq(&rtcdrv->lock); in sirfsoc_rtc_read_alarm()
82 rtc_count = sirfsoc_rtc_readl(rtcdrv, RTC_CN); in sirfsoc_rtc_read_alarm()
84 rtc_alarm = sirfsoc_rtc_readl(rtcdrv, RTC_ALARM0); in sirfsoc_rtc_read_alarm()
93 rtc_time_to_tm((rtcdrv->overflow_rtc + 1) in sirfsoc_rtc_read_alarm()
97 rtc_time_to_tm(rtcdrv->overflow_rtc in sirfsoc_rtc_read_alarm()
100 if (sirfsoc_rtc_readl(rtcdrv, RTC_STATUS) & SIRFSOC_RTC_AL0E) in sirfsoc_rtc_read_alarm()
103 spin_unlock_irq(&rtcdrv->lock); in sirfsoc_rtc_read_alarm()
112 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_set_alarm() local
113 rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_set_alarm()
118 spin_lock_irq(&rtcdrv->lock); in sirfsoc_rtc_set_alarm()
120 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS); in sirfsoc_rtc_set_alarm()
129 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM0, rtc_alarm << RTC_SHIFT); in sirfsoc_rtc_set_alarm()
138 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, rtc_status_reg); in sirfsoc_rtc_set_alarm()
140 spin_unlock_irq(&rtcdrv->lock); in sirfsoc_rtc_set_alarm()
147 spin_lock_irq(&rtcdrv->lock); in sirfsoc_rtc_set_alarm()
149 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS); in sirfsoc_rtc_set_alarm()
158 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, in sirfsoc_rtc_set_alarm()
162 spin_unlock_irq(&rtcdrv->lock); in sirfsoc_rtc_set_alarm()
172 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_read_time() local
173 rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_read_time()
180 tmp_rtc = sirfsoc_rtc_readl(rtcdrv, RTC_CN); in sirfsoc_rtc_read_time()
182 } while (tmp_rtc != sirfsoc_rtc_readl(rtcdrv, RTC_CN)); in sirfsoc_rtc_read_time()
184 rtc_time_to_tm(rtcdrv->overflow_rtc << (BITS_PER_LONG - RTC_SHIFT) | in sirfsoc_rtc_read_time()
193 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_set_time() local
194 rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_set_time()
198 rtcdrv->overflow_rtc = rtc_time >> (BITS_PER_LONG - RTC_SHIFT); in sirfsoc_rtc_set_time()
200 sirfsoc_rtc_writel(rtcdrv, RTC_SW_VALUE, rtcdrv->overflow_rtc); in sirfsoc_rtc_set_time()
201 sirfsoc_rtc_writel(rtcdrv, RTC_CN, rtc_time << RTC_SHIFT); in sirfsoc_rtc_set_time()
210 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_alarm_irq_enable() local
212 rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_alarm_irq_enable()
214 spin_lock_irq(&rtcdrv->lock); in sirfsoc_rtc_alarm_irq_enable()
216 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS); in sirfsoc_rtc_alarm_irq_enable()
222 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, rtc_status_reg); in sirfsoc_rtc_alarm_irq_enable()
224 spin_unlock_irq(&rtcdrv->lock); in sirfsoc_rtc_alarm_irq_enable()
240 struct sirfsoc_rtc_drv *rtcdrv = pdata; in sirfsoc_rtc_irq_handler() local
244 spin_lock(&rtcdrv->lock); in sirfsoc_rtc_irq_handler()
246 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS); in sirfsoc_rtc_irq_handler()
263 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, rtc_status_reg); in sirfsoc_rtc_irq_handler()
265 spin_unlock(&rtcdrv->lock); in sirfsoc_rtc_irq_handler()
271 rtc_update_irq(rtcdrv->rtc, 1, events); in sirfsoc_rtc_irq_handler()
293 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_probe() local
296 rtcdrv = devm_kzalloc(&pdev->dev, in sirfsoc_rtc_probe()
298 if (rtcdrv == NULL) in sirfsoc_rtc_probe()
301 spin_lock_init(&rtcdrv->lock); in sirfsoc_rtc_probe()
303 err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base); in sirfsoc_rtc_probe()
309 platform_set_drvdata(pdev, rtcdrv); in sirfsoc_rtc_probe()
314 rtcdrv->regmap = devm_regmap_init_iobg(&pdev->dev, in sirfsoc_rtc_probe()
316 if (IS_ERR(rtcdrv->regmap)) { in sirfsoc_rtc_probe()
317 err = PTR_ERR(rtcdrv->regmap); in sirfsoc_rtc_probe()
329 sirfsoc_rtc_writel(rtcdrv, RTC_DIV, rtc_div); in sirfsoc_rtc_probe()
332 sirfsoc_rtc_writel(rtcdrv, RTC_CLOCK_SWITCH, SIRFSOC_RTC_CLK); in sirfsoc_rtc_probe()
335 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM0, 0x0); in sirfsoc_rtc_probe()
338 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM1, 0x0); in sirfsoc_rtc_probe()
341 rtcdrv->overflow_rtc = in sirfsoc_rtc_probe()
342 sirfsoc_rtc_readl(rtcdrv, RTC_SW_VALUE); in sirfsoc_rtc_probe()
344 rtcdrv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, in sirfsoc_rtc_probe()
346 if (IS_ERR(rtcdrv->rtc)) { in sirfsoc_rtc_probe()
347 err = PTR_ERR(rtcdrv->rtc); in sirfsoc_rtc_probe()
352 rtcdrv->irq = platform_get_irq(pdev, 0); in sirfsoc_rtc_probe()
355 rtcdrv->irq, in sirfsoc_rtc_probe()
359 rtcdrv); in sirfsoc_rtc_probe()
378 struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_suspend() local
379 rtcdrv->overflow_rtc = in sirfsoc_rtc_suspend()
380 sirfsoc_rtc_readl(rtcdrv, RTC_SW_VALUE); in sirfsoc_rtc_suspend()
382 rtcdrv->saved_counter = in sirfsoc_rtc_suspend()
383 sirfsoc_rtc_readl(rtcdrv, RTC_CN); in sirfsoc_rtc_suspend()
384 rtcdrv->saved_overflow_rtc = rtcdrv->overflow_rtc; in sirfsoc_rtc_suspend()
385 if (device_may_wakeup(dev) && !enable_irq_wake(rtcdrv->irq)) in sirfsoc_rtc_suspend()
386 rtcdrv->irq_wake = 1; in sirfsoc_rtc_suspend()
394 struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_resume() local
400 if (SIRFSOC_RTC_CLK != sirfsoc_rtc_readl(rtcdrv, RTC_CLOCK_SWITCH)) { in sirfsoc_rtc_resume()
403 sirfsoc_rtc_writel(rtcdrv, RTC_CLOCK_SWITCH, SIRFSOC_RTC_CLK); in sirfsoc_rtc_resume()
411 sirfsoc_rtc_writel(rtcdrv, RTC_DIV, rtc_div); in sirfsoc_rtc_resume()
414 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM0, 0x0); in sirfsoc_rtc_resume()
417 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM1, 0x0); in sirfsoc_rtc_resume()
419 rtcdrv->overflow_rtc = rtcdrv->saved_overflow_rtc; in sirfsoc_rtc_resume()
425 tmp = sirfsoc_rtc_readl(rtcdrv, RTC_CN); in sirfsoc_rtc_resume()
426 if (tmp <= rtcdrv->saved_counter) in sirfsoc_rtc_resume()
427 rtcdrv->overflow_rtc++; in sirfsoc_rtc_resume()
432 sirfsoc_rtc_writel(rtcdrv, RTC_SW_VALUE, rtcdrv->overflow_rtc); in sirfsoc_rtc_resume()
434 if (device_may_wakeup(dev) && rtcdrv->irq_wake) { in sirfsoc_rtc_resume()
435 disable_irq_wake(rtcdrv->irq); in sirfsoc_rtc_resume()
436 rtcdrv->irq_wake = 0; in sirfsoc_rtc_resume()