Lines Matching +full:mmp +full:- +full:rtc

1 // SPDX-License-Identifier: GPL-2.0-or-later
7 * Based on rtc.c by Paul Gortmaker
16 * Converted to the RTC subsystem and Driver Model
23 #include <linux/rtc.h>
35 #define RTSR_ALE BIT(2) /* RTC alarm interrupt enable */
36 #define RTSR_HZ BIT(1) /* HZ rising-edge detected */
37 #define RTSR_AL BIT(0) /* RTC alarm detected */
39 #include "rtc-sa1100.h"
41 #define RTC_DEF_DIVIDER (32768 - 1)
49 struct rtc_device *rtc = info->rtc; in sa1100_rtc_interrupt() local
53 spin_lock(&info->lock); in sa1100_rtc_interrupt()
55 rtsr = readl_relaxed(info->rtsr); in sa1100_rtc_interrupt()
57 writel_relaxed(0, info->rtsr); in sa1100_rtc_interrupt()
64 writel_relaxed((RTSR_AL | RTSR_HZ) & (rtsr >> 2), info->rtsr); in sa1100_rtc_interrupt()
73 writel_relaxed(RTSR_AL | RTSR_HZ, info->rtsr); in sa1100_rtc_interrupt()
79 writel_relaxed(rtsr & (RTSR_ALE | RTSR_HZE), info->rtsr); in sa1100_rtc_interrupt()
87 rtc_update_irq(rtc, 1, events); in sa1100_rtc_interrupt()
89 spin_unlock(&info->lock); in sa1100_rtc_interrupt()
99 spin_lock_irq(&info->lock); in sa1100_rtc_alarm_irq_enable()
100 rtsr = readl_relaxed(info->rtsr); in sa1100_rtc_alarm_irq_enable()
105 writel_relaxed(rtsr, info->rtsr); in sa1100_rtc_alarm_irq_enable()
106 spin_unlock_irq(&info->lock); in sa1100_rtc_alarm_irq_enable()
114 rtc_time64_to_tm(readl_relaxed(info->rcnr), tm); in sa1100_rtc_read_time()
122 writel_relaxed(rtc_tm_to_time64(tm), info->rcnr); in sa1100_rtc_set_time()
132 rtsr = readl_relaxed(info->rtsr); in sa1100_rtc_read_alarm()
133 alrm->enabled = (rtsr & RTSR_ALE) ? 1 : 0; in sa1100_rtc_read_alarm()
134 alrm->pending = (rtsr & RTSR_AL) ? 1 : 0; in sa1100_rtc_read_alarm()
142 spin_lock_irq(&info->lock); in sa1100_rtc_set_alarm()
143 writel_relaxed(readl_relaxed(info->rtsr) & in sa1100_rtc_set_alarm()
144 (RTSR_HZE | RTSR_ALE | RTSR_AL), info->rtsr); in sa1100_rtc_set_alarm()
145 writel_relaxed(rtc_tm_to_time64(&alrm->time), info->rtar); in sa1100_rtc_set_alarm()
146 if (alrm->enabled) in sa1100_rtc_set_alarm()
147 writel_relaxed(readl_relaxed(info->rtsr) | RTSR_ALE, info->rtsr); in sa1100_rtc_set_alarm()
149 writel_relaxed(readl_relaxed(info->rtsr) & ~RTSR_ALE, info->rtsr); in sa1100_rtc_set_alarm()
150 spin_unlock_irq(&info->lock); in sa1100_rtc_set_alarm()
159 seq_printf(seq, "trim/divider\t\t: 0x%08x\n", readl_relaxed(info->rttr)); in sa1100_rtc_proc()
160 seq_printf(seq, "RTSR\t\t\t: 0x%08x\n", readl_relaxed(info->rtsr)); in sa1100_rtc_proc()
178 spin_lock_init(&info->lock); in sa1100_rtc_init()
180 info->clk = devm_clk_get(&pdev->dev, NULL); in sa1100_rtc_init()
181 if (IS_ERR(info->clk)) { in sa1100_rtc_init()
182 dev_err(&pdev->dev, "failed to find rtc clock source\n"); in sa1100_rtc_init()
183 return PTR_ERR(info->clk); in sa1100_rtc_init()
186 ret = clk_prepare_enable(info->clk); in sa1100_rtc_init()
196 if (readl_relaxed(info->rttr) == 0) { in sa1100_rtc_init()
197 writel_relaxed(RTC_DEF_DIVIDER + (RTC_DEF_TRIM << 16), info->rttr); in sa1100_rtc_init()
198 dev_warn(&pdev->dev, "warning: " in sa1100_rtc_init()
200 /* The current RTC value probably doesn't make sense either */ in sa1100_rtc_init()
201 writel_relaxed(0, info->rcnr); in sa1100_rtc_init()
204 info->rtc->ops = &sa1100_rtc_ops; in sa1100_rtc_init()
205 info->rtc->max_user_freq = RTC_FREQ; in sa1100_rtc_init()
206 info->rtc->range_max = U32_MAX; in sa1100_rtc_init()
208 ret = devm_rtc_register_device(info->rtc); in sa1100_rtc_init()
210 clk_disable_unprepare(info->clk); in sa1100_rtc_init()
236 writel_relaxed(RTSR_AL | RTSR_HZ, info->rtsr); in sa1100_rtc_init()
249 irq_1hz = platform_get_irq_byname(pdev, "rtc 1Hz"); in sa1100_rtc_probe()
250 irq_alarm = platform_get_irq_byname(pdev, "rtc alarm"); in sa1100_rtc_probe()
252 return -ENODEV; in sa1100_rtc_probe()
254 info = devm_kzalloc(&pdev->dev, sizeof(struct sa1100_rtc), GFP_KERNEL); in sa1100_rtc_probe()
256 return -ENOMEM; in sa1100_rtc_probe()
257 info->irq_1hz = irq_1hz; in sa1100_rtc_probe()
258 info->irq_alarm = irq_alarm; in sa1100_rtc_probe()
260 info->rtc = devm_rtc_allocate_device(&pdev->dev); in sa1100_rtc_probe()
261 if (IS_ERR(info->rtc)) in sa1100_rtc_probe()
262 return PTR_ERR(info->rtc); in sa1100_rtc_probe()
264 ret = devm_request_irq(&pdev->dev, irq_1hz, sa1100_rtc_interrupt, 0, in sa1100_rtc_probe()
265 "rtc 1Hz", &pdev->dev); in sa1100_rtc_probe()
267 dev_err(&pdev->dev, "IRQ %d already in use.\n", irq_1hz); in sa1100_rtc_probe()
270 ret = devm_request_irq(&pdev->dev, irq_alarm, sa1100_rtc_interrupt, 0, in sa1100_rtc_probe()
271 "rtc Alrm", &pdev->dev); in sa1100_rtc_probe()
273 dev_err(&pdev->dev, "IRQ %d already in use.\n", irq_alarm); in sa1100_rtc_probe()
282 of_device_is_compatible(pdev->dev.of_node, "mrvl,sa1100-rtc")) { in sa1100_rtc_probe()
283 info->rcnr = base + 0x04; in sa1100_rtc_probe()
284 info->rtsr = base + 0x10; in sa1100_rtc_probe()
285 info->rtar = base + 0x00; in sa1100_rtc_probe()
286 info->rttr = base + 0x08; in sa1100_rtc_probe()
288 info->rcnr = base + 0x0; in sa1100_rtc_probe()
289 info->rtsr = base + 0x8; in sa1100_rtc_probe()
290 info->rtar = base + 0x4; in sa1100_rtc_probe()
291 info->rttr = base + 0xc; in sa1100_rtc_probe()
295 device_init_wakeup(&pdev->dev, 1); in sa1100_rtc_probe()
305 spin_lock_irq(&info->lock); in sa1100_rtc_remove()
306 writel_relaxed(0, info->rtsr); in sa1100_rtc_remove()
307 spin_unlock_irq(&info->lock); in sa1100_rtc_remove()
308 clk_disable_unprepare(info->clk); in sa1100_rtc_remove()
317 enable_irq_wake(info->irq_alarm); in sa1100_rtc_suspend()
325 disable_irq_wake(info->irq_alarm); in sa1100_rtc_resume()
335 { .compatible = "mrvl,sa1100-rtc", },
336 { .compatible = "mrvl,mmp-rtc", },
346 .name = "sa1100-rtc",
355 MODULE_DESCRIPTION("SA11x0/PXA2xx Realtime Clock Driver (RTC)");
357 MODULE_ALIAS("platform:sa1100-rtc");