Lines Matching +full:mmp +full:- +full:rtc
6 * Based on rtc.c by Paul Gortmaker
15 * Converted to the RTC subsystem and Driver Model
27 #include <linux/rtc.h>
39 #define RTSR_ALE BIT(2) /* RTC alarm interrupt enable */
40 #define RTSR_HZ BIT(1) /* HZ rising-edge detected */
41 #define RTSR_AL BIT(0) /* RTC alarm detected */
43 #include "rtc-sa1100.h"
45 #define RTC_DEF_DIVIDER (32768 - 1)
53 struct rtc_device *rtc = info->rtc; in sa1100_rtc_interrupt() local
57 spin_lock(&info->lock); in sa1100_rtc_interrupt()
59 rtsr = readl_relaxed(info->rtsr); in sa1100_rtc_interrupt()
61 writel_relaxed(0, info->rtsr); in sa1100_rtc_interrupt()
68 writel_relaxed((RTSR_AL | RTSR_HZ) & (rtsr >> 2), info->rtsr); in sa1100_rtc_interrupt()
77 writel_relaxed(RTSR_AL | RTSR_HZ, info->rtsr); in sa1100_rtc_interrupt()
83 writel_relaxed(rtsr & (RTSR_ALE | RTSR_HZE), info->rtsr); in sa1100_rtc_interrupt()
91 rtc_update_irq(rtc, 1, events); in sa1100_rtc_interrupt()
93 spin_unlock(&info->lock); in sa1100_rtc_interrupt()
103 spin_lock_irq(&info->lock); in sa1100_rtc_alarm_irq_enable()
104 rtsr = readl_relaxed(info->rtsr); in sa1100_rtc_alarm_irq_enable()
109 writel_relaxed(rtsr, info->rtsr); in sa1100_rtc_alarm_irq_enable()
110 spin_unlock_irq(&info->lock); in sa1100_rtc_alarm_irq_enable()
118 rtc_time_to_tm(readl_relaxed(info->rcnr), tm); in sa1100_rtc_read_time()
130 writel_relaxed(time, info->rcnr); in sa1100_rtc_set_time()
139 rtsr = readl_relaxed(info->rtsr); in sa1100_rtc_read_alarm()
140 alrm->enabled = (rtsr & RTSR_ALE) ? 1 : 0; in sa1100_rtc_read_alarm()
141 alrm->pending = (rtsr & RTSR_AL) ? 1 : 0; in sa1100_rtc_read_alarm()
151 spin_lock_irq(&info->lock); in sa1100_rtc_set_alarm()
152 ret = rtc_tm_to_time(&alrm->time, &time); in sa1100_rtc_set_alarm()
155 writel_relaxed(readl_relaxed(info->rtsr) & in sa1100_rtc_set_alarm()
156 (RTSR_HZE | RTSR_ALE | RTSR_AL), info->rtsr); in sa1100_rtc_set_alarm()
157 writel_relaxed(time, info->rtar); in sa1100_rtc_set_alarm()
158 if (alrm->enabled) in sa1100_rtc_set_alarm()
159 writel_relaxed(readl_relaxed(info->rtsr) | RTSR_ALE, info->rtsr); in sa1100_rtc_set_alarm()
161 writel_relaxed(readl_relaxed(info->rtsr) & ~RTSR_ALE, info->rtsr); in sa1100_rtc_set_alarm()
163 spin_unlock_irq(&info->lock); in sa1100_rtc_set_alarm()
172 seq_printf(seq, "trim/divider\t\t: 0x%08x\n", readl_relaxed(info->rttr)); in sa1100_rtc_proc()
173 seq_printf(seq, "RTSR\t\t\t: 0x%08x\n", readl_relaxed(info->rtsr)); in sa1100_rtc_proc()
191 spin_lock_init(&info->lock); in sa1100_rtc_init()
193 info->clk = devm_clk_get(&pdev->dev, NULL); in sa1100_rtc_init()
194 if (IS_ERR(info->clk)) { in sa1100_rtc_init()
195 dev_err(&pdev->dev, "failed to find rtc clock source\n"); in sa1100_rtc_init()
196 return PTR_ERR(info->clk); in sa1100_rtc_init()
199 ret = clk_prepare_enable(info->clk); in sa1100_rtc_init()
209 if (readl_relaxed(info->rttr) == 0) { in sa1100_rtc_init()
210 writel_relaxed(RTC_DEF_DIVIDER + (RTC_DEF_TRIM << 16), info->rttr); in sa1100_rtc_init()
211 dev_warn(&pdev->dev, "warning: " in sa1100_rtc_init()
213 /* The current RTC value probably doesn't make sense either */ in sa1100_rtc_init()
214 writel_relaxed(0, info->rcnr); in sa1100_rtc_init()
217 info->rtc->ops = &sa1100_rtc_ops; in sa1100_rtc_init()
218 info->rtc->max_user_freq = RTC_FREQ; in sa1100_rtc_init()
220 ret = rtc_register_device(info->rtc); in sa1100_rtc_init()
222 clk_disable_unprepare(info->clk); in sa1100_rtc_init()
248 writel_relaxed(RTSR_AL | RTSR_HZ, info->rtsr); in sa1100_rtc_init()
262 irq_1hz = platform_get_irq_byname(pdev, "rtc 1Hz"); in sa1100_rtc_probe()
263 irq_alarm = platform_get_irq_byname(pdev, "rtc alarm"); in sa1100_rtc_probe()
265 return -ENODEV; in sa1100_rtc_probe()
267 info = devm_kzalloc(&pdev->dev, sizeof(struct sa1100_rtc), GFP_KERNEL); in sa1100_rtc_probe()
269 return -ENOMEM; in sa1100_rtc_probe()
270 info->irq_1hz = irq_1hz; in sa1100_rtc_probe()
271 info->irq_alarm = irq_alarm; in sa1100_rtc_probe()
273 info->rtc = devm_rtc_allocate_device(&pdev->dev); in sa1100_rtc_probe()
274 if (IS_ERR(info->rtc)) in sa1100_rtc_probe()
275 return PTR_ERR(info->rtc); in sa1100_rtc_probe()
277 ret = devm_request_irq(&pdev->dev, irq_1hz, sa1100_rtc_interrupt, 0, in sa1100_rtc_probe()
278 "rtc 1Hz", &pdev->dev); in sa1100_rtc_probe()
280 dev_err(&pdev->dev, "IRQ %d already in use.\n", irq_1hz); in sa1100_rtc_probe()
283 ret = devm_request_irq(&pdev->dev, irq_alarm, sa1100_rtc_interrupt, 0, in sa1100_rtc_probe()
284 "rtc Alrm", &pdev->dev); in sa1100_rtc_probe()
286 dev_err(&pdev->dev, "IRQ %d already in use.\n", irq_alarm); in sa1100_rtc_probe()
291 base = devm_ioremap_resource(&pdev->dev, iores); in sa1100_rtc_probe()
296 of_device_is_compatible(pdev->dev.of_node, "mrvl,sa1100-rtc")) { in sa1100_rtc_probe()
297 info->rcnr = base + 0x04; in sa1100_rtc_probe()
298 info->rtsr = base + 0x10; in sa1100_rtc_probe()
299 info->rtar = base + 0x00; in sa1100_rtc_probe()
300 info->rttr = base + 0x08; in sa1100_rtc_probe()
302 info->rcnr = base + 0x0; in sa1100_rtc_probe()
303 info->rtsr = base + 0x8; in sa1100_rtc_probe()
304 info->rtar = base + 0x4; in sa1100_rtc_probe()
305 info->rttr = base + 0xc; in sa1100_rtc_probe()
309 device_init_wakeup(&pdev->dev, 1); in sa1100_rtc_probe()
319 spin_lock_irq(&info->lock); in sa1100_rtc_remove()
320 writel_relaxed(0, info->rtsr); in sa1100_rtc_remove()
321 spin_unlock_irq(&info->lock); in sa1100_rtc_remove()
322 clk_disable_unprepare(info->clk); in sa1100_rtc_remove()
333 enable_irq_wake(info->irq_alarm); in sa1100_rtc_suspend()
341 disable_irq_wake(info->irq_alarm); in sa1100_rtc_resume()
351 { .compatible = "mrvl,sa1100-rtc", },
352 { .compatible = "mrvl,mmp-rtc", },
362 .name = "sa1100-rtc",
371 MODULE_DESCRIPTION("SA11x0/PXA2xx Realtime Clock Driver (RTC)");
373 MODULE_ALIAS("platform:sa1100-rtc");