Lines Matching refs:rk_timer_rtc
61 struct rk_timer_rtc { struct
73 static inline u64 tick_to_sec(struct rk_timer_rtc *rk_timer_rtc, u64 tick) in tick_to_sec() argument
75 do_div(tick, rk_timer_rtc->freq); in tick_to_sec()
79 static inline u64 ms_to_tick(struct rk_timer_rtc *rk_timer_rtc, int ms) in ms_to_tick() argument
81 return ms * rk_timer_rtc->freq / 1000; in ms_to_tick()
84 static inline u64 tick_to_time64(struct rk_timer_rtc *rk_timer_rtc, u64 tick) in tick_to_time64() argument
86 return tick_to_sec(rk_timer_rtc, tick) + rk_timer_rtc->timebase; in tick_to_time64()
89 static inline u64 time64_to_tick(struct rk_timer_rtc *rk_timer_rtc, u64 time) in time64_to_tick() argument
91 return (time - rk_timer_rtc->timebase) * rk_timer_rtc->freq; in time64_to_tick()
94 static inline int rk_timer_rtc_write64(struct rk_timer_rtc *rk_timer_rtc, in rk_timer_rtc_write64() argument
97 return regmap_bulk_write(rk_timer_rtc->regmap, reg, &val, 2); in rk_timer_rtc_write64()
100 static inline int rk_timer_rtc_read64(struct rk_timer_rtc *rk_timer_rtc, in rk_timer_rtc_read64() argument
107 ret = regmap_read(rk_timer_rtc->regmap, reg + 4, &val_hi); in rk_timer_rtc_read64()
111 ret = regmap_read(rk_timer_rtc->regmap, reg, &val_lo); in rk_timer_rtc_read64()
115 ret = regmap_read(rk_timer_rtc->regmap, reg + 4, &tmp_hi); in rk_timer_rtc_read64()
125 static inline int rk_timer_rtc_irq_clear(struct rk_timer_rtc *rk_timer_rtc) in rk_timer_rtc_irq_clear() argument
127 return regmap_write(rk_timer_rtc->regmap, TIMER_INT_STATUS, 1); in rk_timer_rtc_irq_clear()
130 static inline int rk_timer_rtc_irq_enable(struct rk_timer_rtc *rk_timer_rtc, in rk_timer_rtc_irq_enable() argument
135 rk_timer_rtc_irq_clear(rk_timer_rtc); in rk_timer_rtc_irq_enable()
137 return regmap_update_bits(rk_timer_rtc->regmap, in rk_timer_rtc_irq_enable()
138 rk_timer_rtc->data->ctrl_reg_offset, in rk_timer_rtc_irq_enable()
143 static int rk_timer_rtc_reset(struct rk_timer_rtc *rk_timer_rtc) in rk_timer_rtc_reset() argument
147 ret = regmap_write(rk_timer_rtc->regmap, in rk_timer_rtc_reset()
148 rk_timer_rtc->data->ctrl_reg_offset, 0); in rk_timer_rtc_reset()
153 ret = rk_timer_rtc_write64(rk_timer_rtc, TIMER_LOAD_COUNT0, UINT64_MAX); in rk_timer_rtc_reset()
158 rk_timer_rtc_irq_clear(rk_timer_rtc); in rk_timer_rtc_reset()
161 return regmap_write(rk_timer_rtc->regmap, in rk_timer_rtc_reset()
162 rk_timer_rtc->data->ctrl_reg_offset, in rk_timer_rtc_reset()
169 struct rk_timer_rtc *rk_timer_rtc = dev_get_drvdata(dev); in rk_timer_rtc_read_time() local
173 ret = rk_timer_rtc_read64(rk_timer_rtc, TIMER_CURRENT_VALUE0, &tick); in rk_timer_rtc_read_time()
177 rtc_time64_to_tm(tick_to_time64(rk_timer_rtc, tick), tm); in rk_timer_rtc_read_time()
188 struct rk_timer_rtc *rk_timer_rtc = dev_get_drvdata(dev); in rk_timer_rtc_set_time() local
199 rk_timer_rtc->timebase = rtc_tm_to_time64(tm); in rk_timer_rtc_set_time()
201 dev_dbg(dev, "Setting new timebase:%lld\n", rk_timer_rtc->timebase); in rk_timer_rtc_set_time()
204 ret = rk_timer_rtc_reset(rk_timer_rtc); in rk_timer_rtc_set_time()
211 rtc_update_irq(rk_timer_rtc->rtc, 1, RTC_IRQF | RTC_AF); in rk_timer_rtc_set_time()
218 struct rk_timer_rtc *rk_timer_rtc = dev_get_drvdata(dev); in rk_timer_rtc_read_alarm() local
222 ret = rk_timer_rtc_read64(rk_timer_rtc, TIMER_LOAD_COUNT0, &tick); in rk_timer_rtc_read_alarm()
226 rtc_time64_to_tm(tick_to_time64(rk_timer_rtc, tick), &alrm->time); in rk_timer_rtc_read_alarm()
238 struct rk_timer_rtc *rk_timer_rtc = dev_get_drvdata(dev); in rk_timer_rtc_set_alarm() local
251 rk_timer_rtc->alarm_irq_enabled = false; in rk_timer_rtc_set_alarm()
253 alarm_tick = time64_to_tick(rk_timer_rtc, in rk_timer_rtc_set_alarm()
256 ret = rk_timer_rtc_read64(rk_timer_rtc, TIMER_CURRENT_VALUE0, in rk_timer_rtc_set_alarm()
262 alarm_threshold_tick = ms_to_tick(rk_timer_rtc, in rk_timer_rtc_set_alarm()
271 ret = rk_timer_rtc_write64(rk_timer_rtc, TIMER_LOAD_COUNT0, alarm_tick); in rk_timer_rtc_set_alarm()
276 rk_timer_rtc->alarm_irq_enabled = alrm->enabled; in rk_timer_rtc_set_alarm()
284 struct rk_timer_rtc *rk_timer_rtc = dev_get_drvdata(dev); in rk_timer_rtc_alarm_irq_enable() local
287 rk_timer_rtc->alarm_irq_enabled = enabled; in rk_timer_rtc_alarm_irq_enable()
295 struct rk_timer_rtc *rk_timer_rtc = dev_get_drvdata(dev); in rk_timer_rtc_alarm_irq() local
299 rk_timer_rtc->alarm_irq_enabled); in rk_timer_rtc_alarm_irq()
302 ret = rk_timer_rtc_write64(rk_timer_rtc, TIMER_LOAD_COUNT0, UINT64_MAX); in rk_timer_rtc_alarm_irq()
306 ret = regmap_write(rk_timer_rtc->regmap, TIMER_INT_STATUS, 1); in rk_timer_rtc_alarm_irq()
311 if (rk_timer_rtc->alarm_irq_enabled) in rk_timer_rtc_alarm_irq()
312 rtc_update_irq(rk_timer_rtc->rtc, 1, RTC_IRQF | RTC_AF); in rk_timer_rtc_alarm_irq()
338 struct rk_timer_rtc *rk_timer_rtc; in rk_timer_rtc_probe() local
343 rk_timer_rtc = devm_kzalloc(dev, sizeof(*rk_timer_rtc), GFP_KERNEL); in rk_timer_rtc_probe()
344 if (!rk_timer_rtc) in rk_timer_rtc_probe()
348 rk_timer_rtc->data = match->data; in rk_timer_rtc_probe()
350 platform_set_drvdata(pdev, rk_timer_rtc); in rk_timer_rtc_probe()
359 rk_timer_rtc->regmap = devm_regmap_init_mmio(dev, base, in rk_timer_rtc_probe()
361 if (IS_ERR(rk_timer_rtc->regmap)) { in rk_timer_rtc_probe()
362 ret = PTR_ERR(rk_timer_rtc->regmap); in rk_timer_rtc_probe()
367 rk_timer_rtc->irq = platform_get_irq(pdev, 0); in rk_timer_rtc_probe()
368 if (rk_timer_rtc->irq < 0) { in rk_timer_rtc_probe()
369 ret = rk_timer_rtc->irq; in rk_timer_rtc_probe()
374 ret = devm_request_irq(dev, rk_timer_rtc->irq, rk_timer_rtc_alarm_irq, in rk_timer_rtc_probe()
381 rk_timer_rtc->pclk = devm_clk_get(dev, "pclk"); in rk_timer_rtc_probe()
382 if (IS_ERR(rk_timer_rtc->pclk)) { in rk_timer_rtc_probe()
383 ret = PTR_ERR(rk_timer_rtc->pclk); in rk_timer_rtc_probe()
388 ret = clk_prepare_enable(rk_timer_rtc->pclk); in rk_timer_rtc_probe()
394 rk_timer_rtc->clk = devm_clk_get(dev, "timer"); in rk_timer_rtc_probe()
395 if (IS_ERR(rk_timer_rtc->clk)) { in rk_timer_rtc_probe()
396 ret = PTR_ERR(rk_timer_rtc->clk); in rk_timer_rtc_probe()
401 ret = clk_prepare_enable(rk_timer_rtc->clk); in rk_timer_rtc_probe()
407 rk_timer_rtc->freq = clk_get_rate(rk_timer_rtc->clk); in rk_timer_rtc_probe()
408 dev_dbg(dev, "RTC timer freq:%d\n", rk_timer_rtc->freq); in rk_timer_rtc_probe()
410 ret = rk_timer_rtc_reset(rk_timer_rtc); in rk_timer_rtc_probe()
422 rk_timer_rtc->rtc = devm_rtc_device_register(dev, DRV_NAME, in rk_timer_rtc_probe()
425 if (IS_ERR(rk_timer_rtc->rtc)) { in rk_timer_rtc_probe()
426 ret = PTR_ERR(rk_timer_rtc->rtc); in rk_timer_rtc_probe()
435 rk_timer_rtc_irq_enable(rk_timer_rtc, false); in rk_timer_rtc_probe()
437 clk_disable_unprepare(rk_timer_rtc->clk); in rk_timer_rtc_probe()
439 clk_disable_unprepare(rk_timer_rtc->pclk); in rk_timer_rtc_probe()
445 struct rk_timer_rtc *rk_timer_rtc = dev_get_drvdata(&pdev->dev); in rk_timer_rtc_remove() local
448 rk_timer_rtc_irq_enable(rk_timer_rtc, false); in rk_timer_rtc_remove()
449 clk_disable_unprepare(rk_timer_rtc->clk); in rk_timer_rtc_remove()
450 clk_disable_unprepare(rk_timer_rtc->pclk); in rk_timer_rtc_remove()
458 struct rk_timer_rtc *rk_timer_rtc = dev_get_drvdata(dev); in rk_timer_rtc_suspend() local
461 enable_irq_wake(rk_timer_rtc->irq); in rk_timer_rtc_suspend()
468 struct rk_timer_rtc *rk_timer_rtc = dev_get_drvdata(dev); in rk_timer_rtc_resume() local
471 disable_irq_wake(rk_timer_rtc->irq); in rk_timer_rtc_resume()