Lines Matching refs:rtc

105 static int __sh_rtc_interrupt(struct sh_rtc *rtc)  in __sh_rtc_interrupt()  argument
109 tmp = readb(rtc->regbase + RCR1); in __sh_rtc_interrupt()
112 writeb(tmp, rtc->regbase + RCR1); in __sh_rtc_interrupt()
115 if (pending && rtc->periodic_freq & PF_OXS) in __sh_rtc_interrupt()
116 rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF); in __sh_rtc_interrupt()
121 static int __sh_rtc_alarm(struct sh_rtc *rtc) in __sh_rtc_alarm() argument
125 tmp = readb(rtc->regbase + RCR1); in __sh_rtc_alarm()
128 writeb(tmp, rtc->regbase + RCR1); in __sh_rtc_alarm()
131 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF); in __sh_rtc_alarm()
136 static int __sh_rtc_periodic(struct sh_rtc *rtc) in __sh_rtc_periodic() argument
138 struct rtc_device *rtc_dev = rtc->rtc_dev; in __sh_rtc_periodic()
142 tmp = readb(rtc->regbase + RCR2); in __sh_rtc_periodic()
145 writeb(tmp, rtc->regbase + RCR2); in __sh_rtc_periodic()
151 if ((rtc->periodic_freq & PF_HP) && (rtc->periodic_freq & PF_COUNT)) in __sh_rtc_periodic()
152 rtc->periodic_freq &= ~PF_COUNT; in __sh_rtc_periodic()
154 if (rtc->periodic_freq & PF_HP) in __sh_rtc_periodic()
155 rtc->periodic_freq |= PF_COUNT; in __sh_rtc_periodic()
156 if (rtc->periodic_freq & PF_KOU) { in __sh_rtc_periodic()
163 rtc_update_irq(rtc->rtc_dev, 1, RTC_PF | RTC_IRQF); in __sh_rtc_periodic()
171 struct sh_rtc *rtc = dev_id; in sh_rtc_interrupt() local
174 spin_lock(&rtc->lock); in sh_rtc_interrupt()
175 ret = __sh_rtc_interrupt(rtc); in sh_rtc_interrupt()
176 spin_unlock(&rtc->lock); in sh_rtc_interrupt()
183 struct sh_rtc *rtc = dev_id; in sh_rtc_alarm() local
186 spin_lock(&rtc->lock); in sh_rtc_alarm()
187 ret = __sh_rtc_alarm(rtc); in sh_rtc_alarm()
188 spin_unlock(&rtc->lock); in sh_rtc_alarm()
195 struct sh_rtc *rtc = dev_id; in sh_rtc_periodic() local
198 spin_lock(&rtc->lock); in sh_rtc_periodic()
199 ret = __sh_rtc_periodic(rtc); in sh_rtc_periodic()
200 spin_unlock(&rtc->lock); in sh_rtc_periodic()
207 struct sh_rtc *rtc = dev_id; in sh_rtc_shared() local
210 spin_lock(&rtc->lock); in sh_rtc_shared()
211 ret = __sh_rtc_interrupt(rtc); in sh_rtc_shared()
212 ret |= __sh_rtc_alarm(rtc); in sh_rtc_shared()
213 ret |= __sh_rtc_periodic(rtc); in sh_rtc_shared()
214 spin_unlock(&rtc->lock); in sh_rtc_shared()
221 struct sh_rtc *rtc = dev_get_drvdata(dev); in sh_rtc_irq_set_state() local
224 spin_lock_irq(&rtc->lock); in sh_rtc_irq_set_state()
226 tmp = readb(rtc->regbase + RCR2); in sh_rtc_irq_set_state()
229 rtc->periodic_freq |= PF_KOU; in sh_rtc_irq_set_state()
231 tmp |= (rtc->periodic_freq & ~PF_HP); /* Set PES2-0 */ in sh_rtc_irq_set_state()
233 rtc->periodic_freq &= ~PF_KOU; in sh_rtc_irq_set_state()
237 writeb(tmp, rtc->regbase + RCR2); in sh_rtc_irq_set_state()
239 spin_unlock_irq(&rtc->lock); in sh_rtc_irq_set_state()
246 struct sh_rtc *rtc = dev_get_drvdata(dev); in sh_rtc_irq_set_freq() local
249 spin_lock_irq(&rtc->lock); in sh_rtc_irq_set_freq()
250 tmp = rtc->periodic_freq & PF_MASK; in sh_rtc_irq_set_freq()
254 rtc->periodic_freq = 0x00; in sh_rtc_irq_set_freq()
257 rtc->periodic_freq = 0x60; in sh_rtc_irq_set_freq()
260 rtc->periodic_freq = 0x50; in sh_rtc_irq_set_freq()
263 rtc->periodic_freq = 0x40; in sh_rtc_irq_set_freq()
266 rtc->periodic_freq = 0x30 | PF_HP; in sh_rtc_irq_set_freq()
269 rtc->periodic_freq = 0x30; in sh_rtc_irq_set_freq()
272 rtc->periodic_freq = 0x20 | PF_HP; in sh_rtc_irq_set_freq()
275 rtc->periodic_freq = 0x20; in sh_rtc_irq_set_freq()
278 rtc->periodic_freq = 0x10 | PF_HP; in sh_rtc_irq_set_freq()
281 rtc->periodic_freq = 0x10; in sh_rtc_irq_set_freq()
288 rtc->periodic_freq |= tmp; in sh_rtc_irq_set_freq()
290 spin_unlock_irq(&rtc->lock); in sh_rtc_irq_set_freq()
296 struct sh_rtc *rtc = dev_get_drvdata(dev); in sh_rtc_setaie() local
299 spin_lock_irq(&rtc->lock); in sh_rtc_setaie()
301 tmp = readb(rtc->regbase + RCR1); in sh_rtc_setaie()
308 writeb(tmp, rtc->regbase + RCR1); in sh_rtc_setaie()
310 spin_unlock_irq(&rtc->lock); in sh_rtc_setaie()
315 struct sh_rtc *rtc = dev_get_drvdata(dev); in sh_rtc_proc() local
318 tmp = readb(rtc->regbase + RCR1); in sh_rtc_proc()
321 tmp = readb(rtc->regbase + RCR2); in sh_rtc_proc()
330 struct sh_rtc *rtc = dev_get_drvdata(dev); in sh_rtc_setcie() local
333 spin_lock_irq(&rtc->lock); in sh_rtc_setcie()
335 tmp = readb(rtc->regbase + RCR1); in sh_rtc_setcie()
342 writeb(tmp, rtc->regbase + RCR1); in sh_rtc_setcie()
344 spin_unlock_irq(&rtc->lock); in sh_rtc_setcie()
356 struct sh_rtc *rtc = platform_get_drvdata(pdev); in sh_rtc_read_time() local
362 spin_lock_irq(&rtc->lock); in sh_rtc_read_time()
364 tmp = readb(rtc->regbase + RCR1); in sh_rtc_read_time()
367 writeb(tmp, rtc->regbase + RCR1); in sh_rtc_read_time()
369 sec128 = readb(rtc->regbase + R64CNT); in sh_rtc_read_time()
371 tm->tm_sec = bcd2bin(readb(rtc->regbase + RSECCNT)); in sh_rtc_read_time()
372 tm->tm_min = bcd2bin(readb(rtc->regbase + RMINCNT)); in sh_rtc_read_time()
373 tm->tm_hour = bcd2bin(readb(rtc->regbase + RHRCNT)); in sh_rtc_read_time()
374 tm->tm_wday = bcd2bin(readb(rtc->regbase + RWKCNT)); in sh_rtc_read_time()
375 tm->tm_mday = bcd2bin(readb(rtc->regbase + RDAYCNT)); in sh_rtc_read_time()
376 tm->tm_mon = bcd2bin(readb(rtc->regbase + RMONCNT)) - 1; in sh_rtc_read_time()
378 if (rtc->capabilities & RTC_CAP_4_DIGIT_YEAR) { in sh_rtc_read_time()
379 yr = readw(rtc->regbase + RYRCNT); in sh_rtc_read_time()
383 yr = readb(rtc->regbase + RYRCNT); in sh_rtc_read_time()
389 sec2 = readb(rtc->regbase + R64CNT); in sh_rtc_read_time()
390 cf_bit = readb(rtc->regbase + RCR1) & RCR1_CF; in sh_rtc_read_time()
392 spin_unlock_irq(&rtc->lock); in sh_rtc_read_time()
401 if (!(rtc->periodic_freq & PF_OXS)) in sh_rtc_read_time()
416 struct sh_rtc *rtc = platform_get_drvdata(pdev); in sh_rtc_set_time() local
420 spin_lock_irq(&rtc->lock); in sh_rtc_set_time()
423 tmp = readb(rtc->regbase + RCR2); in sh_rtc_set_time()
426 writeb(tmp, rtc->regbase + RCR2); in sh_rtc_set_time()
428 writeb(bin2bcd(tm->tm_sec), rtc->regbase + RSECCNT); in sh_rtc_set_time()
429 writeb(bin2bcd(tm->tm_min), rtc->regbase + RMINCNT); in sh_rtc_set_time()
430 writeb(bin2bcd(tm->tm_hour), rtc->regbase + RHRCNT); in sh_rtc_set_time()
431 writeb(bin2bcd(tm->tm_wday), rtc->regbase + RWKCNT); in sh_rtc_set_time()
432 writeb(bin2bcd(tm->tm_mday), rtc->regbase + RDAYCNT); in sh_rtc_set_time()
433 writeb(bin2bcd(tm->tm_mon + 1), rtc->regbase + RMONCNT); in sh_rtc_set_time()
435 if (rtc->capabilities & RTC_CAP_4_DIGIT_YEAR) { in sh_rtc_set_time()
438 writew(year, rtc->regbase + RYRCNT); in sh_rtc_set_time()
441 writeb(bin2bcd(year), rtc->regbase + RYRCNT); in sh_rtc_set_time()
445 tmp = readb(rtc->regbase + RCR2); in sh_rtc_set_time()
448 writeb(tmp, rtc->regbase + RCR2); in sh_rtc_set_time()
450 spin_unlock_irq(&rtc->lock); in sh_rtc_set_time()
455 static inline int sh_rtc_read_alarm_value(struct sh_rtc *rtc, int reg_off) in sh_rtc_read_alarm_value() argument
460 byte = readb(rtc->regbase + reg_off); in sh_rtc_read_alarm_value()
472 struct sh_rtc *rtc = platform_get_drvdata(pdev); in sh_rtc_read_alarm() local
475 spin_lock_irq(&rtc->lock); in sh_rtc_read_alarm()
477 tm->tm_sec = sh_rtc_read_alarm_value(rtc, RSECAR); in sh_rtc_read_alarm()
478 tm->tm_min = sh_rtc_read_alarm_value(rtc, RMINAR); in sh_rtc_read_alarm()
479 tm->tm_hour = sh_rtc_read_alarm_value(rtc, RHRAR); in sh_rtc_read_alarm()
480 tm->tm_wday = sh_rtc_read_alarm_value(rtc, RWKAR); in sh_rtc_read_alarm()
481 tm->tm_mday = sh_rtc_read_alarm_value(rtc, RDAYAR); in sh_rtc_read_alarm()
482 tm->tm_mon = sh_rtc_read_alarm_value(rtc, RMONAR); in sh_rtc_read_alarm()
487 wkalrm->enabled = (readb(rtc->regbase + RCR1) & RCR1_AIE) ? 1 : 0; in sh_rtc_read_alarm()
489 spin_unlock_irq(&rtc->lock); in sh_rtc_read_alarm()
494 static inline void sh_rtc_write_alarm_value(struct sh_rtc *rtc, in sh_rtc_write_alarm_value() argument
499 writeb(0, rtc->regbase + reg_off); in sh_rtc_write_alarm_value()
501 writeb(bin2bcd(value) | AR_ENB, rtc->regbase + reg_off); in sh_rtc_write_alarm_value()
542 struct sh_rtc *rtc = platform_get_drvdata(pdev); in sh_rtc_set_alarm() local
551 spin_lock_irq(&rtc->lock); in sh_rtc_set_alarm()
554 rcr1 = readb(rtc->regbase + RCR1); in sh_rtc_set_alarm()
556 writeb(rcr1, rtc->regbase + RCR1); in sh_rtc_set_alarm()
559 sh_rtc_write_alarm_value(rtc, tm->tm_sec, RSECAR); in sh_rtc_set_alarm()
560 sh_rtc_write_alarm_value(rtc, tm->tm_min, RMINAR); in sh_rtc_set_alarm()
561 sh_rtc_write_alarm_value(rtc, tm->tm_hour, RHRAR); in sh_rtc_set_alarm()
562 sh_rtc_write_alarm_value(rtc, tm->tm_wday, RWKAR); in sh_rtc_set_alarm()
563 sh_rtc_write_alarm_value(rtc, tm->tm_mday, RDAYAR); in sh_rtc_set_alarm()
567 sh_rtc_write_alarm_value(rtc, mon, RMONAR); in sh_rtc_set_alarm()
571 writeb(rcr1, rtc->regbase + RCR1); in sh_rtc_set_alarm()
574 spin_unlock_irq(&rtc->lock); in sh_rtc_set_alarm()
590 struct sh_rtc *rtc; in sh_rtc_probe() local
596 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); in sh_rtc_probe()
597 if (unlikely(!rtc)) in sh_rtc_probe()
600 spin_lock_init(&rtc->lock); in sh_rtc_probe()
609 rtc->periodic_irq = ret; in sh_rtc_probe()
610 rtc->carry_irq = platform_get_irq(pdev, 1); in sh_rtc_probe()
611 rtc->alarm_irq = platform_get_irq(pdev, 2); in sh_rtc_probe()
619 rtc->regsize = resource_size(res); in sh_rtc_probe()
621 rtc->res = devm_request_mem_region(&pdev->dev, res->start, in sh_rtc_probe()
622 rtc->regsize, pdev->name); in sh_rtc_probe()
623 if (unlikely(!rtc->res)) in sh_rtc_probe()
626 rtc->regbase = devm_ioremap_nocache(&pdev->dev, rtc->res->start, in sh_rtc_probe()
627 rtc->regsize); in sh_rtc_probe()
628 if (unlikely(!rtc->regbase)) in sh_rtc_probe()
638 rtc->clk = devm_clk_get(&pdev->dev, clk_name); in sh_rtc_probe()
639 if (IS_ERR(rtc->clk)) { in sh_rtc_probe()
646 rtc->clk = NULL; in sh_rtc_probe()
649 clk_enable(rtc->clk); in sh_rtc_probe()
651 rtc->capabilities = RTC_DEF_CAPABILITIES; in sh_rtc_probe()
660 rtc->capabilities |= pinfo->capabilities; in sh_rtc_probe()
663 if (rtc->carry_irq <= 0) { in sh_rtc_probe()
665 ret = devm_request_irq(&pdev->dev, rtc->periodic_irq, in sh_rtc_probe()
666 sh_rtc_shared, 0, "sh-rtc", rtc); in sh_rtc_probe()
670 rtc->periodic_irq); in sh_rtc_probe()
675 ret = devm_request_irq(&pdev->dev, rtc->periodic_irq, in sh_rtc_probe()
676 sh_rtc_periodic, 0, "sh-rtc period", rtc); in sh_rtc_probe()
680 ret, rtc->periodic_irq); in sh_rtc_probe()
684 ret = devm_request_irq(&pdev->dev, rtc->carry_irq, in sh_rtc_probe()
685 sh_rtc_interrupt, 0, "sh-rtc carry", rtc); in sh_rtc_probe()
689 ret, rtc->carry_irq); in sh_rtc_probe()
693 ret = devm_request_irq(&pdev->dev, rtc->alarm_irq, in sh_rtc_probe()
694 sh_rtc_alarm, 0, "sh-rtc alarm", rtc); in sh_rtc_probe()
698 ret, rtc->alarm_irq); in sh_rtc_probe()
703 platform_set_drvdata(pdev, rtc); in sh_rtc_probe()
711 rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, "sh", in sh_rtc_probe()
713 if (IS_ERR(rtc->rtc_dev)) { in sh_rtc_probe()
714 ret = PTR_ERR(rtc->rtc_dev); in sh_rtc_probe()
718 rtc->rtc_dev->max_user_freq = 256; in sh_rtc_probe()
721 if (rtc_read_time(rtc->rtc_dev, &r) < 0) { in sh_rtc_probe()
723 rtc_set_time(rtc->rtc_dev, &r); in sh_rtc_probe()
730 clk_disable(rtc->clk); in sh_rtc_probe()
737 struct sh_rtc *rtc = platform_get_drvdata(pdev); in sh_rtc_remove() local
744 clk_disable(rtc->clk); in sh_rtc_remove()
752 struct sh_rtc *rtc = platform_get_drvdata(pdev); in sh_rtc_set_irq_wake() local
754 irq_set_irq_wake(rtc->periodic_irq, enabled); in sh_rtc_set_irq_wake()
756 if (rtc->carry_irq > 0) { in sh_rtc_set_irq_wake()
757 irq_set_irq_wake(rtc->carry_irq, enabled); in sh_rtc_set_irq_wake()
758 irq_set_irq_wake(rtc->alarm_irq, enabled); in sh_rtc_set_irq_wake()