Lines Matching refs:info
59 void (*irq_handler) (struct s3c_rtc *info, int mask);
60 void (*set_freq) (struct s3c_rtc *info, int freq);
61 void (*enable_tick) (struct s3c_rtc *info, struct seq_file *seq);
62 void (*select_tick_clk) (struct s3c_rtc *info);
63 void (*save_tick_cnt) (struct s3c_rtc *info);
64 void (*restore_tick_cnt) (struct s3c_rtc *info);
65 void (*enable) (struct s3c_rtc *info);
66 void (*disable) (struct s3c_rtc *info);
69 static int s3c_rtc_enable_clk(struct s3c_rtc *info)
73 ret = clk_enable(info->rtc_clk);
77 if (info->data->needs_src_clk) {
78 ret = clk_enable(info->rtc_src_clk);
80 clk_disable(info->rtc_clk);
87 static void s3c_rtc_disable_clk(struct s3c_rtc *info)
89 if (info->data->needs_src_clk)
90 clk_disable(info->rtc_src_clk);
91 clk_disable(info->rtc_clk);
97 struct s3c_rtc *info = (struct s3c_rtc *)id;
99 if (info->data->irq_handler)
100 info->data->irq_handler(info, S3C2410_INTP_TIC);
107 struct s3c_rtc *info = (struct s3c_rtc *)id;
109 if (info->data->irq_handler)
110 info->data->irq_handler(info, S3C2410_INTP_ALM);
118 struct s3c_rtc *info = dev_get_drvdata(dev);
123 dev_dbg(info->dev, "%s: aie=%d\n", __func__, enabled);
125 ret = s3c_rtc_enable_clk(info);
129 tmp = readb(info->base + S3C2410_RTCALM) & ~S3C2410_RTCALM_ALMEN;
134 writeb(tmp, info->base + S3C2410_RTCALM);
136 spin_lock_irqsave(&info->alarm_lock, flags);
138 if (info->alarm_enabled && !enabled)
139 s3c_rtc_disable_clk(info);
140 else if (!info->alarm_enabled && enabled)
141 ret = s3c_rtc_enable_clk(info);
143 info->alarm_enabled = enabled;
144 spin_unlock_irqrestore(&info->alarm_lock, flags);
146 s3c_rtc_disable_clk(info);
152 static int s3c_rtc_setfreq(struct s3c_rtc *info, int freq)
159 ret = s3c_rtc_enable_clk(info);
162 spin_lock_irq(&info->pie_lock);
164 if (info->data->set_freq)
165 info->data->set_freq(info, freq);
167 spin_unlock_irq(&info->pie_lock);
168 s3c_rtc_disable_clk(info);
176 struct s3c_rtc *info = dev_get_drvdata(dev);
180 ret = s3c_rtc_enable_clk(info);
185 rtc_tm->tm_min = readb(info->base + S3C2410_RTCMIN);
186 rtc_tm->tm_hour = readb(info->base + S3C2410_RTCHOUR);
187 rtc_tm->tm_mday = readb(info->base + S3C2410_RTCDATE);
188 rtc_tm->tm_mon = readb(info->base + S3C2410_RTCMON);
189 rtc_tm->tm_year = readb(info->base + S3C2410_RTCYEAR);
190 rtc_tm->tm_sec = readb(info->base + S3C2410_RTCSEC);
209 s3c_rtc_disable_clk(info);
220 struct s3c_rtc *info = dev_get_drvdata(dev);
233 ret = s3c_rtc_enable_clk(info);
237 writeb(bin2bcd(tm->tm_sec), info->base + S3C2410_RTCSEC);
238 writeb(bin2bcd(tm->tm_min), info->base + S3C2410_RTCMIN);
239 writeb(bin2bcd(tm->tm_hour), info->base + S3C2410_RTCHOUR);
240 writeb(bin2bcd(tm->tm_mday), info->base + S3C2410_RTCDATE);
241 writeb(bin2bcd(tm->tm_mon + 1), info->base + S3C2410_RTCMON);
242 writeb(bin2bcd(year), info->base + S3C2410_RTCYEAR);
244 s3c_rtc_disable_clk(info);
251 struct s3c_rtc *info = dev_get_drvdata(dev);
256 ret = s3c_rtc_enable_clk(info);
260 alm_tm->tm_sec = readb(info->base + S3C2410_ALMSEC);
261 alm_tm->tm_min = readb(info->base + S3C2410_ALMMIN);
262 alm_tm->tm_hour = readb(info->base + S3C2410_ALMHOUR);
263 alm_tm->tm_mon = readb(info->base + S3C2410_ALMMON);
264 alm_tm->tm_mday = readb(info->base + S3C2410_ALMDATE);
265 alm_tm->tm_year = readb(info->base + S3C2410_ALMYEAR);
267 alm_en = readb(info->base + S3C2410_RTCALM);
269 s3c_rtc_disable_clk(info);
301 struct s3c_rtc *info = dev_get_drvdata(dev);
308 ret = s3c_rtc_enable_clk(info);
312 alrm_en = readb(info->base + S3C2410_RTCALM) & S3C2410_RTCALM_ALMEN;
313 writeb(0x00, info->base + S3C2410_RTCALM);
317 writeb(bin2bcd(tm->tm_sec), info->base + S3C2410_ALMSEC);
322 writeb(bin2bcd(tm->tm_min), info->base + S3C2410_ALMMIN);
327 writeb(bin2bcd(tm->tm_hour), info->base + S3C2410_ALMHOUR);
332 writeb(bin2bcd(tm->tm_mon + 1), info->base + S3C2410_ALMMON);
337 writeb(bin2bcd(tm->tm_mday), info->base + S3C2410_ALMDATE);
342 writeb(alrm_en, info->base + S3C2410_RTCALM);
346 s3c_rtc_disable_clk(info);
353 struct s3c_rtc *info = dev_get_drvdata(dev);
356 ret = s3c_rtc_enable_clk(info);
360 if (info->data->enable_tick)
361 info->data->enable_tick(info, seq);
363 s3c_rtc_disable_clk(info);
377 static void s3c24xx_rtc_enable(struct s3c_rtc *info)
381 con = readw(info->base + S3C2410_RTCCON);
384 dev_info(info->dev, "rtc disabled, re-enabling\n");
386 tmp = readw(info->base + S3C2410_RTCCON);
387 writew(tmp | S3C2410_RTCCON_RTCEN, info->base + S3C2410_RTCCON);
391 dev_info(info->dev, "removing RTCCON_CNTSEL\n");
393 tmp = readw(info->base + S3C2410_RTCCON);
395 info->base + S3C2410_RTCCON);
399 dev_info(info->dev, "removing RTCCON_CLKRST\n");
401 tmp = readw(info->base + S3C2410_RTCCON);
403 info->base + S3C2410_RTCCON);
407 static void s3c24xx_rtc_disable(struct s3c_rtc *info)
411 con = readw(info->base + S3C2410_RTCCON);
413 writew(con, info->base + S3C2410_RTCCON);
415 con = readb(info->base + S3C2410_TICNT);
417 writeb(con, info->base + S3C2410_TICNT);
420 static void s3c6410_rtc_disable(struct s3c_rtc *info)
424 con = readw(info->base + S3C2410_RTCCON);
427 writew(con, info->base + S3C2410_RTCCON);
432 struct s3c_rtc *info = platform_get_drvdata(pdev);
434 s3c_rtc_setaie(info->dev, 0);
436 if (info->data->needs_src_clk)
437 clk_unprepare(info->rtc_src_clk);
438 clk_unprepare(info->rtc_clk);
445 struct s3c_rtc *info = NULL;
449 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
450 if (!info)
454 info->irq_tick = platform_get_irq(pdev, 1);
455 if (info->irq_tick < 0)
456 return info->irq_tick;
458 info->dev = &pdev->dev;
459 info->data = of_device_get_match_data(&pdev->dev);
460 if (!info->data) {
464 spin_lock_init(&info->pie_lock);
465 spin_lock_init(&info->alarm_lock);
467 platform_set_drvdata(pdev, info);
469 info->irq_alarm = platform_get_irq(pdev, 0);
470 if (info->irq_alarm < 0)
471 return info->irq_alarm;
474 info->irq_tick, info->irq_alarm);
477 info->base = devm_platform_ioremap_resource(pdev, 0);
478 if (IS_ERR(info->base))
479 return PTR_ERR(info->base);
481 info->rtc_clk = devm_clk_get(&pdev->dev, "rtc");
482 if (IS_ERR(info->rtc_clk)) {
483 ret = PTR_ERR(info->rtc_clk);
490 ret = clk_prepare_enable(info->rtc_clk);
494 if (info->data->needs_src_clk) {
495 info->rtc_src_clk = devm_clk_get(&pdev->dev, "rtc_src");
496 if (IS_ERR(info->rtc_src_clk)) {
497 ret = dev_err_probe(&pdev->dev, PTR_ERR(info->rtc_src_clk),
501 ret = clk_prepare_enable(info->rtc_src_clk);
507 if (info->data->enable)
508 info->data->enable(info);
511 readw(info->base + S3C2410_RTCCON));
530 info->rtc = devm_rtc_device_register(&pdev->dev, "s3c", &s3c_rtcops,
532 if (IS_ERR(info->rtc)) {
534 ret = PTR_ERR(info->rtc);
538 ret = devm_request_irq(&pdev->dev, info->irq_alarm, s3c_rtc_alarmirq,
539 0, "s3c2410-rtc alarm", info);
541 dev_err(&pdev->dev, "IRQ%d error %d\n", info->irq_alarm, ret);
545 ret = devm_request_irq(&pdev->dev, info->irq_tick, s3c_rtc_tickirq,
546 0, "s3c2410-rtc tick", info);
548 dev_err(&pdev->dev, "IRQ%d error %d\n", info->irq_tick, ret);
552 if (info->data->select_tick_clk)
553 info->data->select_tick_clk(info);
555 s3c_rtc_setfreq(info, 1);
557 s3c_rtc_disable_clk(info);
562 if (info->data->disable)
563 info->data->disable(info);
565 if (info->data->needs_src_clk)
566 clk_disable_unprepare(info->rtc_src_clk);
568 clk_disable_unprepare(info->rtc_clk);
577 struct s3c_rtc *info = dev_get_drvdata(dev);
580 ret = s3c_rtc_enable_clk(info);
585 if (info->data->save_tick_cnt)
586 info->data->save_tick_cnt(info);
588 if (info->data->disable)
589 info->data->disable(info);
591 if (device_may_wakeup(dev) && !info->wake_en) {
592 if (enable_irq_wake(info->irq_alarm) == 0)
593 info->wake_en = true;
603 struct s3c_rtc *info = dev_get_drvdata(dev);
605 if (info->data->enable)
606 info->data->enable(info);
608 if (info->data->restore_tick_cnt)
609 info->data->restore_tick_cnt(info);
611 s3c_rtc_disable_clk(info);
613 if (device_may_wakeup(dev) && info->wake_en) {
614 disable_irq_wake(info->irq_alarm);
615 info->wake_en = false;
623 static void s3c24xx_rtc_irq(struct s3c_rtc *info, int mask)
625 rtc_update_irq(info->rtc, 1, RTC_AF | RTC_IRQF);
628 static void s3c6410_rtc_irq(struct s3c_rtc *info, int mask)
630 rtc_update_irq(info->rtc, 1, RTC_AF | RTC_IRQF);
631 writeb(mask, info->base + S3C2410_INTP);
634 static void s3c2410_rtc_setfreq(struct s3c_rtc *info, int freq)
639 tmp = readb(info->base + S3C2410_TICNT);
642 val = (info->rtc->max_user_freq / freq) - 1;
645 writel(tmp, info->base + S3C2410_TICNT);
648 static void s3c2416_rtc_setfreq(struct s3c_rtc *info, int freq)
653 tmp = readb(info->base + S3C2410_TICNT);
656 val = (info->rtc->max_user_freq / freq) - 1;
659 writel(S3C2443_TICNT1_PART(val), info->base + S3C2443_TICNT1);
661 writel(S3C2416_TICNT2_PART(val), info->base + S3C2416_TICNT2);
663 writel(tmp, info->base + S3C2410_TICNT);
666 static void s3c2443_rtc_setfreq(struct s3c_rtc *info, int freq)
671 tmp = readb(info->base + S3C2410_TICNT);
674 val = (info->rtc->max_user_freq / freq) - 1;
677 writel(S3C2443_TICNT1_PART(val), info->base + S3C2443_TICNT1);
679 writel(tmp, info->base + S3C2410_TICNT);
682 static void s3c6410_rtc_setfreq(struct s3c_rtc *info, int freq)
686 val = (info->rtc->max_user_freq / freq) - 1;
687 writel(val, info->base + S3C2410_TICNT);
690 static void s3c24xx_rtc_enable_tick(struct s3c_rtc *info, struct seq_file *seq)
694 ticnt = readb(info->base + S3C2410_TICNT);
700 static void s3c2416_rtc_select_tick_clk(struct s3c_rtc *info)
704 con = readw(info->base + S3C2410_RTCCON);
706 writew(con, info->base + S3C2410_RTCCON);
709 static void s3c6410_rtc_enable_tick(struct s3c_rtc *info, struct seq_file *seq)
713 ticnt = readw(info->base + S3C2410_RTCCON);
719 static void s3c24xx_rtc_save_tick_cnt(struct s3c_rtc *info)
721 info->ticnt_save = readb(info->base + S3C2410_TICNT);
724 static void s3c24xx_rtc_restore_tick_cnt(struct s3c_rtc *info)
726 writeb(info->ticnt_save, info->base + S3C2410_TICNT);
729 static void s3c6410_rtc_save_tick_cnt(struct s3c_rtc *info)
731 info->ticnt_en_save = readw(info->base + S3C2410_RTCCON);
732 info->ticnt_en_save &= S3C64XX_RTCCON_TICEN;
733 info->ticnt_save = readl(info->base + S3C2410_TICNT);
736 static void s3c6410_rtc_restore_tick_cnt(struct s3c_rtc *info)
740 writel(info->ticnt_save, info->base + S3C2410_TICNT);
741 if (info->ticnt_en_save) {
742 con = readw(info->base + S3C2410_RTCCON);
743 writew(con | info->ticnt_en_save, info->base + S3C2410_RTCCON);