Lines Matching refs:rtcdrv
58 static u32 sirfsoc_rtc_readl(struct sirfsoc_rtc_drv *rtcdrv, u32 offset)
62 regmap_read(rtcdrv->regmap, rtcdrv->rtc_base + offset, &val);
66 static void sirfsoc_rtc_writel(struct sirfsoc_rtc_drv *rtcdrv,
69 regmap_write(rtcdrv->regmap, rtcdrv->rtc_base + offset, val);
76 struct sirfsoc_rtc_drv *rtcdrv;
78 rtcdrv = dev_get_drvdata(dev);
80 spin_lock_irq(&rtcdrv->lock);
82 rtc_count = sirfsoc_rtc_readl(rtcdrv, RTC_CN);
84 rtc_alarm = sirfsoc_rtc_readl(rtcdrv, RTC_ALARM0);
93 rtc_time64_to_tm((rtcdrv->overflow_rtc + 1)
97 rtc_time64_to_tm(rtcdrv->overflow_rtc
100 if (sirfsoc_rtc_readl(rtcdrv, RTC_STATUS) & SIRFSOC_RTC_AL0E)
103 spin_unlock_irq(&rtcdrv->lock);
112 struct sirfsoc_rtc_drv *rtcdrv;
113 rtcdrv = dev_get_drvdata(dev);
118 spin_lock_irq(&rtcdrv->lock);
120 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS);
129 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM0, rtc_alarm << RTC_SHIFT);
138 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, rtc_status_reg);
140 spin_unlock_irq(&rtcdrv->lock);
147 spin_lock_irq(&rtcdrv->lock);
149 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS);
158 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS,
162 spin_unlock_irq(&rtcdrv->lock);
172 struct sirfsoc_rtc_drv *rtcdrv;
173 rtcdrv = dev_get_drvdata(dev);
180 tmp_rtc = sirfsoc_rtc_readl(rtcdrv, RTC_CN);
182 } while (tmp_rtc != sirfsoc_rtc_readl(rtcdrv, RTC_CN));
184 rtc_time64_to_tm(rtcdrv->overflow_rtc << (BITS_PER_LONG - RTC_SHIFT)
193 struct sirfsoc_rtc_drv *rtcdrv;
194 rtcdrv = dev_get_drvdata(dev);
198 rtcdrv->overflow_rtc = rtc_time >> (BITS_PER_LONG - RTC_SHIFT);
200 sirfsoc_rtc_writel(rtcdrv, RTC_SW_VALUE, rtcdrv->overflow_rtc);
201 sirfsoc_rtc_writel(rtcdrv, RTC_CN, rtc_time << RTC_SHIFT);
210 struct sirfsoc_rtc_drv *rtcdrv;
212 rtcdrv = dev_get_drvdata(dev);
214 spin_lock_irq(&rtcdrv->lock);
216 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS);
222 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, rtc_status_reg);
224 spin_unlock_irq(&rtcdrv->lock);
240 struct sirfsoc_rtc_drv *rtcdrv = pdata;
244 spin_lock(&rtcdrv->lock);
246 rtc_status_reg = sirfsoc_rtc_readl(rtcdrv, RTC_STATUS);
263 sirfsoc_rtc_writel(rtcdrv, RTC_STATUS, rtc_status_reg);
265 spin_unlock(&rtcdrv->lock);
271 rtc_update_irq(rtcdrv->rtc, 1, events);
293 struct sirfsoc_rtc_drv *rtcdrv;
296 rtcdrv = devm_kzalloc(&pdev->dev,
298 if (rtcdrv == NULL)
301 spin_lock_init(&rtcdrv->lock);
303 err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base);
309 platform_set_drvdata(pdev, rtcdrv);
314 rtcdrv->regmap = devm_regmap_init_iobg(&pdev->dev,
316 if (IS_ERR(rtcdrv->regmap)) {
317 err = PTR_ERR(rtcdrv->regmap);
329 sirfsoc_rtc_writel(rtcdrv, RTC_DIV, rtc_div);
332 sirfsoc_rtc_writel(rtcdrv, RTC_CLOCK_SWITCH, SIRFSOC_RTC_CLK);
335 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM0, 0x0);
338 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM1, 0x0);
341 rtcdrv->overflow_rtc =
342 sirfsoc_rtc_readl(rtcdrv, RTC_SW_VALUE);
344 rtcdrv->rtc = devm_rtc_allocate_device(&pdev->dev);
345 if (IS_ERR(rtcdrv->rtc))
346 return PTR_ERR(rtcdrv->rtc);
348 rtcdrv->rtc->ops = &sirfsoc_rtc_ops;
349 rtcdrv->rtc->range_max = (1ULL << 60) - 1;
351 rtcdrv->irq = platform_get_irq(pdev, 0);
352 err = devm_request_irq(&pdev->dev, rtcdrv->irq, sirfsoc_rtc_irq_handler,
353 IRQF_SHARED, pdev->name, rtcdrv);
359 return rtc_register_device(rtcdrv->rtc);
365 struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev);
366 rtcdrv->overflow_rtc =
367 sirfsoc_rtc_readl(rtcdrv, RTC_SW_VALUE);
369 rtcdrv->saved_counter =
370 sirfsoc_rtc_readl(rtcdrv, RTC_CN);
371 rtcdrv->saved_overflow_rtc = rtcdrv->overflow_rtc;
372 if (device_may_wakeup(dev) && !enable_irq_wake(rtcdrv->irq))
373 rtcdrv->irq_wake = 1;
381 struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev);
387 if (SIRFSOC_RTC_CLK != sirfsoc_rtc_readl(rtcdrv, RTC_CLOCK_SWITCH)) {
390 sirfsoc_rtc_writel(rtcdrv, RTC_CLOCK_SWITCH, SIRFSOC_RTC_CLK);
398 sirfsoc_rtc_writel(rtcdrv, RTC_DIV, rtc_div);
401 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM0, 0x0);
404 sirfsoc_rtc_writel(rtcdrv, RTC_ALARM1, 0x0);
406 rtcdrv->overflow_rtc = rtcdrv->saved_overflow_rtc;
412 tmp = sirfsoc_rtc_readl(rtcdrv, RTC_CN);
413 if (tmp <= rtcdrv->saved_counter)
414 rtcdrv->overflow_rtc++;
419 sirfsoc_rtc_writel(rtcdrv, RTC_SW_VALUE, rtcdrv->overflow_rtc);
421 if (device_may_wakeup(dev) && rtcdrv->irq_wake) {
422 disable_irq_wake(rtcdrv->irq);
423 rtcdrv->irq_wake = 0;