Lines Matching +full:mt2712 +full:- +full:rtc
1 // SPDX-License-Identifier: GPL-2.0
15 #include <linux/rtc.h>
78 struct rtc_device *rtc; member
87 return readl(mt2712_rtc->base + reg); in mt2712_readl()
93 writel(val, mt2712_rtc->base + reg); in mt2712_writel()
107 dev_err(&mt2712_rtc->rtc->dev, in mt2712_rtc_write_trigger()
131 rtc_update_irq(mt2712_rtc->rtc, 1, RTC_IRQF | RTC_AF); in rtc_irq_handler_thread()
141 tm->tm_sec = mt2712_readl(mt2712_rtc, MT2712_TC_SEC) in __mt2712_rtc_read_time()
143 tm->tm_min = mt2712_readl(mt2712_rtc, MT2712_TC_MIN) in __mt2712_rtc_read_time()
145 tm->tm_hour = mt2712_readl(mt2712_rtc, MT2712_TC_HOU) in __mt2712_rtc_read_time()
147 tm->tm_mday = mt2712_readl(mt2712_rtc, MT2712_TC_DOM) in __mt2712_rtc_read_time()
149 tm->tm_mon = (mt2712_readl(mt2712_rtc, MT2712_TC_MTH) - 1) in __mt2712_rtc_read_time()
151 tm->tm_year = (mt2712_readl(mt2712_rtc, MT2712_TC_YEA) + 100) in __mt2712_rtc_read_time()
162 if (mt2712_rtc->powerlost) in mt2712_rtc_read_time()
163 return -EINVAL; in mt2712_rtc_read_time()
167 } while (sec < tm->tm_sec); /* SEC has carried */ in mt2712_rtc_read_time()
176 mt2712_writel(mt2712_rtc, MT2712_TC_SEC, tm->tm_sec & MT2712_SEC_MASK); in mt2712_rtc_set_time()
177 mt2712_writel(mt2712_rtc, MT2712_TC_MIN, tm->tm_min & MT2712_MIN_MASK); in mt2712_rtc_set_time()
178 mt2712_writel(mt2712_rtc, MT2712_TC_HOU, tm->tm_hour & MT2712_HOU_MASK); in mt2712_rtc_set_time()
179 mt2712_writel(mt2712_rtc, MT2712_TC_DOM, tm->tm_mday & MT2712_DOM_MASK); in mt2712_rtc_set_time()
181 (tm->tm_mon + 1) & MT2712_MTH_MASK); in mt2712_rtc_set_time()
183 (tm->tm_year - 100) & MT2712_YEA_MASK); in mt2712_rtc_set_time()
187 if (mt2712_rtc->powerlost) in mt2712_rtc_set_time()
188 mt2712_rtc->powerlost = false; in mt2712_rtc_set_time()
196 struct rtc_time *tm = &alm->time; in mt2712_rtc_read_alarm()
200 alm->enabled = !!(irqen & MT2712_IRQ_EN_AL); in mt2712_rtc_read_alarm()
202 tm->tm_sec = mt2712_readl(mt2712_rtc, MT2712_AL_SEC) & MT2712_SEC_MASK; in mt2712_rtc_read_alarm()
203 tm->tm_min = mt2712_readl(mt2712_rtc, MT2712_AL_MIN) & MT2712_MIN_MASK; in mt2712_rtc_read_alarm()
204 tm->tm_hour = mt2712_readl(mt2712_rtc, MT2712_AL_HOU) & MT2712_HOU_MASK; in mt2712_rtc_read_alarm()
205 tm->tm_mday = mt2712_readl(mt2712_rtc, MT2712_AL_DOM) & MT2712_DOM_MASK; in mt2712_rtc_read_alarm()
206 tm->tm_mon = (mt2712_readl(mt2712_rtc, MT2712_AL_MTH) - 1) in mt2712_rtc_read_alarm()
208 tm->tm_year = (mt2712_readl(mt2712_rtc, MT2712_AL_YEA) + 100) in mt2712_rtc_read_alarm()
234 struct rtc_time *tm = &alm->time; in mt2712_rtc_set_alarm()
236 dev_dbg(&mt2712_rtc->rtc->dev, "set al time: %ptR, alm en: %d\n", in mt2712_rtc_set_alarm()
237 tm, alm->enabled); in mt2712_rtc_set_alarm()
241 & ~(MT2712_SEC_MASK)) | (tm->tm_sec & MT2712_SEC_MASK)); in mt2712_rtc_set_alarm()
244 & ~(MT2712_MIN_MASK)) | (tm->tm_min & MT2712_MIN_MASK)); in mt2712_rtc_set_alarm()
247 & ~(MT2712_HOU_MASK)) | (tm->tm_hour & MT2712_HOU_MASK)); in mt2712_rtc_set_alarm()
250 & ~(MT2712_DOM_MASK)) | (tm->tm_mday & MT2712_DOM_MASK)); in mt2712_rtc_set_alarm()
254 | ((tm->tm_mon + 1) & MT2712_MTH_MASK)); in mt2712_rtc_set_alarm()
258 | ((tm->tm_year - 100) & MT2712_YEA_MASK)); in mt2712_rtc_set_alarm()
264 mt2712_rtc_alarm_irq_enable(dev, alm->enabled); in mt2712_rtc_set_alarm()
269 /* Init RTC register */
288 mt2712_rtc->powerlost = true; in mt2712_rtc_hw_init()
289 dev_dbg(&mt2712_rtc->rtc->dev, in mt2712_rtc_hw_init()
292 mt2712_rtc->powerlost = false; in mt2712_rtc_hw_init()
295 /* RTC need POWERKEY1/2 match, then goto normal work mode */ in mt2712_rtc_hw_init()
316 mt2712_rtc = devm_kzalloc(&pdev->dev, in mt2712_rtc_probe()
319 return -ENOMEM; in mt2712_rtc_probe()
321 mt2712_rtc->base = devm_platform_ioremap_resource(pdev, 0); in mt2712_rtc_probe()
322 if (IS_ERR(mt2712_rtc->base)) in mt2712_rtc_probe()
323 return PTR_ERR(mt2712_rtc->base); in mt2712_rtc_probe()
325 /* rtc hw init */ in mt2712_rtc_probe()
328 mt2712_rtc->irq = platform_get_irq(pdev, 0); in mt2712_rtc_probe()
329 if (mt2712_rtc->irq < 0) in mt2712_rtc_probe()
330 return mt2712_rtc->irq; in mt2712_rtc_probe()
334 mt2712_rtc->rtc = devm_rtc_allocate_device(&pdev->dev); in mt2712_rtc_probe()
335 if (IS_ERR(mt2712_rtc->rtc)) in mt2712_rtc_probe()
336 return PTR_ERR(mt2712_rtc->rtc); in mt2712_rtc_probe()
338 ret = devm_request_threaded_irq(&pdev->dev, mt2712_rtc->irq, NULL, in mt2712_rtc_probe()
341 dev_name(&mt2712_rtc->rtc->dev), in mt2712_rtc_probe()
344 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", in mt2712_rtc_probe()
345 mt2712_rtc->irq, ret); in mt2712_rtc_probe()
349 device_init_wakeup(&pdev->dev, true); in mt2712_rtc_probe()
351 mt2712_rtc->rtc->ops = &mt2712_rtc_ops; in mt2712_rtc_probe()
352 mt2712_rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in mt2712_rtc_probe()
353 mt2712_rtc->rtc->range_max = MT2712_RTC_TIMESTAMP_END_2127; in mt2712_rtc_probe()
355 return devm_rtc_register_device(mt2712_rtc->rtc); in mt2712_rtc_probe()
365 wake_status = enable_irq_wake(mt2712_rtc->irq); in mt2712_rtc_suspend()
367 mt2712_rtc->irq_wake_enabled = true; in mt2712_rtc_suspend()
378 if (device_may_wakeup(dev) && mt2712_rtc->irq_wake_enabled) { in mt2712_rtc_resume()
379 wake_status = disable_irq_wake(mt2712_rtc->irq); in mt2712_rtc_resume()
381 mt2712_rtc->irq_wake_enabled = false; in mt2712_rtc_resume()
392 { .compatible = "mediatek,mt2712-rtc", },
400 .name = "mt2712-rtc",
411 MODULE_DESCRIPTION("MediaTek MT2712 SoC based RTC Driver");