Lines Matching defs:rtc

9  * Based on the old arch/sh/kernel/cpu/rtc.c by:
18 #include <linux/rtc.h>
29 #include <asm/rtc.h>
38 #define DRV_NAME "sh-rtc"
106 unsigned long capabilities; /* See asm/rtc.h for cap bits */
110 static int __sh_rtc_interrupt(struct sh_rtc *rtc)
114 tmp = readb(rtc->regbase + RCR1);
117 writeb(tmp, rtc->regbase + RCR1);
120 if (pending && rtc->periodic_freq & PF_OXS)
121 rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF);
126 static int __sh_rtc_alarm(struct sh_rtc *rtc)
130 tmp = readb(rtc->regbase + RCR1);
133 writeb(tmp, rtc->regbase + RCR1);
136 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF);
141 static int __sh_rtc_periodic(struct sh_rtc *rtc)
145 tmp = readb(rtc->regbase + RCR2);
148 writeb(tmp, rtc->regbase + RCR2);
154 if ((rtc->periodic_freq & PF_HP) && (rtc->periodic_freq & PF_COUNT))
155 rtc->periodic_freq &= ~PF_COUNT;
157 if (rtc->periodic_freq & PF_HP)
158 rtc->periodic_freq |= PF_COUNT;
159 rtc_update_irq(rtc->rtc_dev, 1, RTC_PF | RTC_IRQF);
167 struct sh_rtc *rtc = dev_id;
170 spin_lock(&rtc->lock);
171 ret = __sh_rtc_interrupt(rtc);
172 spin_unlock(&rtc->lock);
179 struct sh_rtc *rtc = dev_id;
182 spin_lock(&rtc->lock);
183 ret = __sh_rtc_alarm(rtc);
184 spin_unlock(&rtc->lock);
191 struct sh_rtc *rtc = dev_id;
194 spin_lock(&rtc->lock);
195 ret = __sh_rtc_periodic(rtc);
196 spin_unlock(&rtc->lock);
203 struct sh_rtc *rtc = dev_id;
206 spin_lock(&rtc->lock);
207 ret = __sh_rtc_interrupt(rtc);
208 ret |= __sh_rtc_alarm(rtc);
209 ret |= __sh_rtc_periodic(rtc);
210 spin_unlock(&rtc->lock);
217 struct sh_rtc *rtc = dev_get_drvdata(dev);
220 spin_lock_irq(&rtc->lock);
222 tmp = readb(rtc->regbase + RCR1);
229 writeb(tmp, rtc->regbase + RCR1);
231 spin_unlock_irq(&rtc->lock);
236 struct sh_rtc *rtc = dev_get_drvdata(dev);
239 tmp = readb(rtc->regbase + RCR1);
242 tmp = readb(rtc->regbase + RCR2);
251 struct sh_rtc *rtc = dev_get_drvdata(dev);
254 spin_lock_irq(&rtc->lock);
256 tmp = readb(rtc->regbase + RCR1);
263 writeb(tmp, rtc->regbase + RCR1);
265 spin_unlock_irq(&rtc->lock);
276 struct sh_rtc *rtc = dev_get_drvdata(dev);
279 if (!(readb(rtc->regbase + RCR2) & RCR2_RTCEN))
285 spin_lock_irq(&rtc->lock);
287 tmp = readb(rtc->regbase + RCR1);
290 writeb(tmp, rtc->regbase + RCR1);
292 sec128 = readb(rtc->regbase + R64CNT);
294 tm->tm_sec = bcd2bin(readb(rtc->regbase + RSECCNT));
295 tm->tm_min = bcd2bin(readb(rtc->regbase + RMINCNT));
296 tm->tm_hour = bcd2bin(readb(rtc->regbase + RHRCNT));
297 tm->tm_wday = bcd2bin(readb(rtc->regbase + RWKCNT));
298 tm->tm_mday = bcd2bin(readb(rtc->regbase + RDAYCNT));
299 tm->tm_mon = bcd2bin(readb(rtc->regbase + RMONCNT)) - 1;
301 if (rtc->capabilities & RTC_CAP_4_DIGIT_YEAR) {
302 yr = readw(rtc->regbase + RYRCNT);
306 yr = readb(rtc->regbase + RYRCNT);
312 sec2 = readb(rtc->regbase + R64CNT);
313 cf_bit = readb(rtc->regbase + RCR1) & RCR1_CF;
315 spin_unlock_irq(&rtc->lock);
324 if (!(rtc->periodic_freq & PF_OXS))
338 struct sh_rtc *rtc = dev_get_drvdata(dev);
342 spin_lock_irq(&rtc->lock);
345 tmp = readb(rtc->regbase + RCR2);
348 writeb(tmp, rtc->regbase + RCR2);
350 writeb(bin2bcd(tm->tm_sec), rtc->regbase + RSECCNT);
351 writeb(bin2bcd(tm->tm_min), rtc->regbase + RMINCNT);
352 writeb(bin2bcd(tm->tm_hour), rtc->regbase + RHRCNT);
353 writeb(bin2bcd(tm->tm_wday), rtc->regbase + RWKCNT);
354 writeb(bin2bcd(tm->tm_mday), rtc->regbase + RDAYCNT);
355 writeb(bin2bcd(tm->tm_mon + 1), rtc->regbase + RMONCNT);
357 if (rtc->capabilities & RTC_CAP_4_DIGIT_YEAR) {
360 writew(year, rtc->regbase + RYRCNT);
363 writeb(bin2bcd(year), rtc->regbase + RYRCNT);
367 tmp = readb(rtc->regbase + RCR2);
370 writeb(tmp, rtc->regbase + RCR2);
372 spin_unlock_irq(&rtc->lock);
377 static inline int sh_rtc_read_alarm_value(struct sh_rtc *rtc, int reg_off)
382 byte = readb(rtc->regbase + reg_off);
393 struct sh_rtc *rtc = dev_get_drvdata(dev);
396 spin_lock_irq(&rtc->lock);
398 tm->tm_sec = sh_rtc_read_alarm_value(rtc, RSECAR);
399 tm->tm_min = sh_rtc_read_alarm_value(rtc, RMINAR);
400 tm->tm_hour = sh_rtc_read_alarm_value(rtc, RHRAR);
401 tm->tm_wday = sh_rtc_read_alarm_value(rtc, RWKAR);
402 tm->tm_mday = sh_rtc_read_alarm_value(rtc, RDAYAR);
403 tm->tm_mon = sh_rtc_read_alarm_value(rtc, RMONAR);
407 wkalrm->enabled = (readb(rtc->regbase + RCR1) & RCR1_AIE) ? 1 : 0;
409 spin_unlock_irq(&rtc->lock);
414 static inline void sh_rtc_write_alarm_value(struct sh_rtc *rtc,
419 writeb(0, rtc->regbase + reg_off);
421 writeb(bin2bcd(value) | AR_ENB, rtc->regbase + reg_off);
426 struct sh_rtc *rtc = dev_get_drvdata(dev);
431 spin_lock_irq(&rtc->lock);
434 rcr1 = readb(rtc->regbase + RCR1);
436 writeb(rcr1, rtc->regbase + RCR1);
439 sh_rtc_write_alarm_value(rtc, tm->tm_sec, RSECAR);
440 sh_rtc_write_alarm_value(rtc, tm->tm_min, RMINAR);
441 sh_rtc_write_alarm_value(rtc, tm->tm_hour, RHRAR);
442 sh_rtc_write_alarm_value(rtc, tm->tm_wday, RWKAR);
443 sh_rtc_write_alarm_value(rtc, tm->tm_mday, RDAYAR);
447 sh_rtc_write_alarm_value(rtc, mon, RMONAR);
451 writeb(rcr1, rtc->regbase + RCR1);
454 spin_unlock_irq(&rtc->lock);
470 struct sh_rtc *rtc;
475 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
476 if (unlikely(!rtc))
479 spin_lock_init(&rtc->lock);
488 rtc->periodic_irq = ret;
489 rtc->carry_irq = platform_get_irq(pdev, 1);
490 rtc->alarm_irq = platform_get_irq(pdev, 2);
500 rtc->regsize = resource_size(res);
502 rtc->res = devm_request_mem_region(&pdev->dev, res->start,
503 rtc->regsize, pdev->name);
504 if (unlikely(!rtc->res))
507 rtc->regbase = devm_ioremap(&pdev->dev, rtc->res->start, rtc->regsize);
508 if (unlikely(!rtc->regbase))
517 snprintf(clk_name, sizeof(clk_name), "rtc%d", clk_id);
521 rtc->clk = devm_clk_get(&pdev->dev, clk_name);
522 if (IS_ERR(rtc->clk)) {
524 * No error handling for rtc->clk intentionally, not all
529 rtc->clk = NULL;
532 rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev);
533 if (IS_ERR(rtc->rtc_dev))
534 return PTR_ERR(rtc->rtc_dev);
536 clk_enable(rtc->clk);
538 rtc->capabilities = RTC_DEF_CAPABILITIES;
549 rtc->capabilities |= pinfo->capabilities;
553 if (rtc->carry_irq <= 0) {
555 ret = devm_request_irq(&pdev->dev, rtc->periodic_irq,
556 sh_rtc_shared, 0, "sh-rtc", rtc);
560 rtc->periodic_irq);
565 ret = devm_request_irq(&pdev->dev, rtc->periodic_irq,
566 sh_rtc_periodic, 0, "sh-rtc period", rtc);
570 ret, rtc->periodic_irq);
574 ret = devm_request_irq(&pdev->dev, rtc->carry_irq,
575 sh_rtc_interrupt, 0, "sh-rtc carry", rtc);
579 ret, rtc->carry_irq);
583 ret = devm_request_irq(&pdev->dev, rtc->alarm_irq,
584 sh_rtc_alarm, 0, "sh-rtc alarm", rtc);
588 ret, rtc->alarm_irq);
593 platform_set_drvdata(pdev, rtc);
599 rtc->rtc_dev->ops = &sh_rtc_ops;
600 rtc->rtc_dev->max_user_freq = 256;
602 if (rtc->capabilities & RTC_CAP_4_DIGIT_YEAR) {
603 rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_1900;
604 rtc->rtc_dev->range_max = RTC_TIMESTAMP_END_9999;
606 rtc->rtc_dev->range_min = mktime64(1999, 1, 1, 0, 0, 0);
607 rtc->rtc_dev->range_max = mktime64(2098, 12, 31, 23, 59, 59);
610 ret = rtc_register_device(rtc->rtc_dev);
618 clk_disable(rtc->clk);
625 struct sh_rtc *rtc = platform_get_drvdata(pdev);
630 clk_disable(rtc->clk);
637 struct sh_rtc *rtc = dev_get_drvdata(dev);
639 irq_set_irq_wake(rtc->periodic_irq, enabled);
641 if (rtc->carry_irq > 0) {
642 irq_set_irq_wake(rtc->carry_irq, enabled);
643 irq_set_irq_wake(rtc->alarm_irq, enabled);
666 { .compatible = "renesas,sh-rtc", },