Lines Matching refs:rtcdrv

59 static u32 sirfsoc_rtc_readl(struct sirfsoc_rtc_drv *rtcdrv, u32 offset)  in sirfsoc_rtc_readl()  argument
63 regmap_read(rtcdrv->regmap, rtcdrv->rtc_base + offset, &val); in sirfsoc_rtc_readl()
67 static void sirfsoc_rtc_writel(struct sirfsoc_rtc_drv *rtcdrv, in sirfsoc_rtc_writel() argument
70 regmap_write(rtcdrv->regmap, rtcdrv->rtc_base + offset, val); in sirfsoc_rtc_writel()
77 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_read_alarm() local
79 rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_read_alarm()
81 spin_lock_irq(&rtcdrv->lock); in sirfsoc_rtc_read_alarm()
83 rtc_count = sirfsoc_rtc_readl(rtcdrv, RTC_CN); in sirfsoc_rtc_read_alarm()
85 rtc_alarm = sirfsoc_rtc_readl(rtcdrv, RTC_ALARM0); in sirfsoc_rtc_read_alarm()
94 rtc_time_to_tm((rtcdrv->overflow_rtc + 1) in sirfsoc_rtc_read_alarm()
98 rtc_time_to_tm(rtcdrv->overflow_rtc in sirfsoc_rtc_read_alarm()
101 if (sirfsoc_rtc_readl(rtcdrv, RTC_STATUS) & SIRFSOC_RTC_AL0E) in sirfsoc_rtc_read_alarm()
104 spin_unlock_irq(&rtcdrv->lock); in sirfsoc_rtc_read_alarm()
113 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_set_alarm() local
114 rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_set_alarm()
119 spin_lock_irq(&rtcdrv->lock); in sirfsoc_rtc_set_alarm()
121 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS); in sirfsoc_rtc_set_alarm()
130 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM0, rtc_alarm << RTC_SHIFT); in sirfsoc_rtc_set_alarm()
139 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, rtc_status_reg); in sirfsoc_rtc_set_alarm()
141 spin_unlock_irq(&rtcdrv->lock); in sirfsoc_rtc_set_alarm()
148 spin_lock_irq(&rtcdrv->lock); in sirfsoc_rtc_set_alarm()
150 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS); in sirfsoc_rtc_set_alarm()
159 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, in sirfsoc_rtc_set_alarm()
163 spin_unlock_irq(&rtcdrv->lock); in sirfsoc_rtc_set_alarm()
173 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_read_time() local
174 rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_read_time()
181 tmp_rtc = sirfsoc_rtc_readl(rtcdrv, RTC_CN); in sirfsoc_rtc_read_time()
183 } while (tmp_rtc != sirfsoc_rtc_readl(rtcdrv, RTC_CN)); in sirfsoc_rtc_read_time()
185 rtc_time_to_tm(rtcdrv->overflow_rtc << (BITS_PER_LONG - RTC_SHIFT) | in sirfsoc_rtc_read_time()
194 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_set_time() local
195 rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_set_time()
199 rtcdrv->overflow_rtc = rtc_time >> (BITS_PER_LONG - RTC_SHIFT); in sirfsoc_rtc_set_time()
201 sirfsoc_rtc_writel(rtcdrv, RTC_SW_VALUE, rtcdrv->overflow_rtc); in sirfsoc_rtc_set_time()
202 sirfsoc_rtc_writel(rtcdrv, RTC_CN, rtc_time << RTC_SHIFT); in sirfsoc_rtc_set_time()
228 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_alarm_irq_enable() local
230 rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_alarm_irq_enable()
232 spin_lock_irq(&rtcdrv->lock); in sirfsoc_rtc_alarm_irq_enable()
234 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS); in sirfsoc_rtc_alarm_irq_enable()
240 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, rtc_status_reg); in sirfsoc_rtc_alarm_irq_enable()
242 spin_unlock_irq(&rtcdrv->lock); in sirfsoc_rtc_alarm_irq_enable()
259 struct sirfsoc_rtc_drv *rtcdrv = pdata; in sirfsoc_rtc_irq_handler() local
263 spin_lock(&rtcdrv->lock); in sirfsoc_rtc_irq_handler()
265 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS); in sirfsoc_rtc_irq_handler()
282 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, rtc_status_reg); in sirfsoc_rtc_irq_handler()
284 spin_unlock(&rtcdrv->lock); in sirfsoc_rtc_irq_handler()
290 rtc_update_irq(rtcdrv->rtc, 1, events); in sirfsoc_rtc_irq_handler()
312 struct sirfsoc_rtc_drv *rtcdrv; in sirfsoc_rtc_probe() local
315 rtcdrv = devm_kzalloc(&pdev->dev, in sirfsoc_rtc_probe()
317 if (rtcdrv == NULL) in sirfsoc_rtc_probe()
320 spin_lock_init(&rtcdrv->lock); in sirfsoc_rtc_probe()
322 err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base); in sirfsoc_rtc_probe()
328 platform_set_drvdata(pdev, rtcdrv); in sirfsoc_rtc_probe()
333 rtcdrv->regmap = devm_regmap_init_iobg(&pdev->dev, in sirfsoc_rtc_probe()
335 if (IS_ERR(rtcdrv->regmap)) { in sirfsoc_rtc_probe()
336 err = PTR_ERR(rtcdrv->regmap); in sirfsoc_rtc_probe()
348 sirfsoc_rtc_writel(rtcdrv, RTC_DIV, rtc_div); in sirfsoc_rtc_probe()
351 sirfsoc_rtc_writel(rtcdrv, RTC_CLOCK_SWITCH, SIRFSOC_RTC_CLK); in sirfsoc_rtc_probe()
354 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM0, 0x0); in sirfsoc_rtc_probe()
357 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM1, 0x0); in sirfsoc_rtc_probe()
360 rtcdrv->overflow_rtc = in sirfsoc_rtc_probe()
361 sirfsoc_rtc_readl(rtcdrv, RTC_SW_VALUE); in sirfsoc_rtc_probe()
363 rtcdrv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, in sirfsoc_rtc_probe()
365 if (IS_ERR(rtcdrv->rtc)) { in sirfsoc_rtc_probe()
366 err = PTR_ERR(rtcdrv->rtc); in sirfsoc_rtc_probe()
371 rtcdrv->irq = platform_get_irq(pdev, 0); in sirfsoc_rtc_probe()
374 rtcdrv->irq, in sirfsoc_rtc_probe()
378 rtcdrv); in sirfsoc_rtc_probe()
397 struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_suspend() local
398 rtcdrv->overflow_rtc = in sirfsoc_rtc_suspend()
399 sirfsoc_rtc_readl(rtcdrv, RTC_SW_VALUE); in sirfsoc_rtc_suspend()
401 rtcdrv->saved_counter = in sirfsoc_rtc_suspend()
402 sirfsoc_rtc_readl(rtcdrv, RTC_CN); in sirfsoc_rtc_suspend()
403 rtcdrv->saved_overflow_rtc = rtcdrv->overflow_rtc; in sirfsoc_rtc_suspend()
404 if (device_may_wakeup(dev) && !enable_irq_wake(rtcdrv->irq)) in sirfsoc_rtc_suspend()
405 rtcdrv->irq_wake = 1; in sirfsoc_rtc_suspend()
413 struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev); in sirfsoc_rtc_resume() local
419 if (SIRFSOC_RTC_CLK != sirfsoc_rtc_readl(rtcdrv, RTC_CLOCK_SWITCH)) { in sirfsoc_rtc_resume()
422 sirfsoc_rtc_writel(rtcdrv, RTC_CLOCK_SWITCH, SIRFSOC_RTC_CLK); in sirfsoc_rtc_resume()
430 sirfsoc_rtc_writel(rtcdrv, RTC_DIV, rtc_div); in sirfsoc_rtc_resume()
433 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM0, 0x0); in sirfsoc_rtc_resume()
436 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM1, 0x0); in sirfsoc_rtc_resume()
438 rtcdrv->overflow_rtc = rtcdrv->saved_overflow_rtc; in sirfsoc_rtc_resume()
444 tmp = sirfsoc_rtc_readl(rtcdrv, RTC_CN); in sirfsoc_rtc_resume()
445 if (tmp <= rtcdrv->saved_counter) in sirfsoc_rtc_resume()
446 rtcdrv->overflow_rtc++; in sirfsoc_rtc_resume()
451 sirfsoc_rtc_writel(rtcdrv, RTC_SW_VALUE, rtcdrv->overflow_rtc); in sirfsoc_rtc_resume()
453 if (device_may_wakeup(dev) && rtcdrv->irq_wake) { in sirfsoc_rtc_resume()
454 disable_irq_wake(rtcdrv->irq); in sirfsoc_rtc_resume()
455 rtcdrv->irq_wake = 0; in sirfsoc_rtc_resume()