Lines Matching refs:timer
44 static inline void brcmstb_waketmr_clear_alarm(struct brcmstb_waketmr *timer)
46 writel_relaxed(1, timer->base + BRCMSTB_WKTMR_EVENT);
47 (void)readl_relaxed(timer->base + BRCMSTB_WKTMR_EVENT);
50 static void brcmstb_waketmr_set_alarm(struct brcmstb_waketmr *timer,
53 brcmstb_waketmr_clear_alarm(timer);
56 writel_relaxed(timer->rate, timer->base + BRCMSTB_WKTMR_PRESCALER);
58 writel_relaxed(secs + 1, timer->base + BRCMSTB_WKTMR_ALARM);
63 struct brcmstb_waketmr *timer = data;
65 pm_wakeup_event(timer->dev, 0);
75 static void wktmr_read(struct brcmstb_waketmr *timer,
81 t->sec = readl_relaxed(timer->base + BRCMSTB_WKTMR_COUNTER);
82 tmp = readl_relaxed(timer->base + BRCMSTB_WKTMR_PRESCALER_VAL);
83 } while (tmp >= timer->rate);
85 t->pre = timer->rate - tmp;
88 static int brcmstb_waketmr_prepare_suspend(struct brcmstb_waketmr *timer)
90 struct device *dev = timer->dev;
94 ret = enable_irq_wake(timer->irq);
104 /* If enabled as a wakeup-source, arm the timer when powering off */
108 struct brcmstb_waketmr *timer;
110 timer = container_of(nb, struct brcmstb_waketmr, reboot_notifier);
112 /* Set timer for cold boot */
114 brcmstb_waketmr_prepare_suspend(timer);
122 struct brcmstb_waketmr *timer = dev_get_drvdata(dev);
125 wktmr_read(timer, &now);
135 struct brcmstb_waketmr *timer = dev_get_drvdata(dev);
140 writel_relaxed(sec, timer->base + BRCMSTB_WKTMR_COUNTER);
148 struct brcmstb_waketmr *timer = dev_get_drvdata(dev);
152 sec = readl_relaxed(timer->base + BRCMSTB_WKTMR_ALARM);
159 reg = readl_relaxed(timer->base + BRCMSTB_WKTMR_EVENT);
168 struct brcmstb_waketmr *timer = dev_get_drvdata(dev);
176 brcmstb_waketmr_set_alarm(timer, sec);
202 struct brcmstb_waketmr *timer;
205 timer = devm_kzalloc(dev, sizeof(*timer), GFP_KERNEL);
206 if (!timer)
209 platform_set_drvdata(pdev, timer);
210 timer->dev = dev;
212 timer->base = devm_platform_ioremap_resource(pdev, 0);
213 if (IS_ERR(timer->base))
214 return PTR_ERR(timer->base);
216 timer->rtc = devm_rtc_allocate_device(dev);
217 if (IS_ERR(timer->rtc))
218 return PTR_ERR(timer->rtc);
227 timer->irq = platform_get_irq(pdev, 0);
228 if (timer->irq < 0)
231 timer->clk = devm_clk_get(dev, NULL);
232 if (!IS_ERR(timer->clk)) {
233 ret = clk_prepare_enable(timer->clk);
236 timer->rate = clk_get_rate(timer->clk);
237 if (!timer->rate)
238 timer->rate = BRCMSTB_WKTMR_DEFAULT_FREQ;
240 timer->rate = BRCMSTB_WKTMR_DEFAULT_FREQ;
241 timer->clk = NULL;
244 ret = devm_request_irq(dev, timer->irq, brcmstb_waketmr_irq, 0,
245 "brcmstb-waketimer", timer);
249 timer->reboot_notifier.notifier_call = brcmstb_waketmr_reboot;
250 register_reboot_notifier(&timer->reboot_notifier);
252 timer->rtc->ops = &brcmstb_waketmr_ops;
253 timer->rtc->range_max = U32_MAX;
255 ret = rtc_register_device(timer->rtc);
259 dev_info(dev, "registered, with irq %d\n", timer->irq);
264 unregister_reboot_notifier(&timer->reboot_notifier);
267 if (timer->clk)
268 clk_disable_unprepare(timer->clk);
275 struct brcmstb_waketmr *timer = dev_get_drvdata(&pdev->dev);
277 unregister_reboot_notifier(&timer->reboot_notifier);
278 clk_disable_unprepare(timer->clk);
286 struct brcmstb_waketmr *timer = dev_get_drvdata(dev);
288 return brcmstb_waketmr_prepare_suspend(timer);
293 struct brcmstb_waketmr *timer = dev_get_drvdata(dev);
299 ret = disable_irq_wake(timer->irq);
301 brcmstb_waketmr_clear_alarm(timer);
329 MODULE_DESCRIPTION("Wake-up timer driver for STB chips");