Lines Matching +full:asm9260 +full:- +full:rtc
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2016 Oleksij Rempel <linux@rempel-privat.de>
12 #include <linux/rtc.h>
109 struct rtc_device *rtc; member
119 rtc_lock(priv->rtc); in asm9260_rtc_irq()
120 isr = ioread32(priv->iobase + HW_CIIR); in asm9260_rtc_irq()
122 rtc_unlock(priv->rtc); in asm9260_rtc_irq()
126 iowrite32(0, priv->iobase + HW_CIIR); in asm9260_rtc_irq()
127 rtc_unlock(priv->rtc); in asm9260_rtc_irq()
131 rtc_update_irq(priv->rtc, 1, events); in asm9260_rtc_irq()
141 ctime0 = ioread32(priv->iobase + HW_CTIME0); in asm9260_rtc_read_time()
142 ctime1 = ioread32(priv->iobase + HW_CTIME1); in asm9260_rtc_read_time()
143 ctime2 = ioread32(priv->iobase + HW_CTIME2); in asm9260_rtc_read_time()
145 if (ctime1 != ioread32(priv->iobase + HW_CTIME1)) { in asm9260_rtc_read_time()
150 ctime0 = ioread32(priv->iobase + HW_CTIME0); in asm9260_rtc_read_time()
151 ctime1 = ioread32(priv->iobase + HW_CTIME1); in asm9260_rtc_read_time()
152 ctime2 = ioread32(priv->iobase + HW_CTIME2); in asm9260_rtc_read_time()
155 tm->tm_sec = (ctime0 >> BM_CTIME0_SEC_S) & BM_CTIME0_SEC_M; in asm9260_rtc_read_time()
156 tm->tm_min = (ctime0 >> BM_CTIME0_MIN_S) & BM_CTIME0_MIN_M; in asm9260_rtc_read_time()
157 tm->tm_hour = (ctime0 >> BM_CTIME0_HOUR_S) & BM_CTIME0_HOUR_M; in asm9260_rtc_read_time()
158 tm->tm_wday = (ctime0 >> BM_CTIME0_DOW_S) & BM_CTIME0_DOW_M; in asm9260_rtc_read_time()
160 tm->tm_mday = (ctime1 >> BM_CTIME1_DOM_S) & BM_CTIME1_DOM_M; in asm9260_rtc_read_time()
161 tm->tm_mon = (ctime1 >> BM_CTIME1_MON_S) & BM_CTIME1_MON_M; in asm9260_rtc_read_time()
162 tm->tm_year = (ctime1 >> BM_CTIME1_YEAR_S) & BM_CTIME1_YEAR_M; in asm9260_rtc_read_time()
164 tm->tm_yday = (ctime2 >> BM_CTIME2_DOY_S) & BM_CTIME2_DOY_M; in asm9260_rtc_read_time()
177 iowrite32(0, priv->iobase + HW_SEC); in asm9260_rtc_set_time()
179 iowrite32(tm->tm_year, priv->iobase + HW_YEAR); in asm9260_rtc_set_time()
180 iowrite32(tm->tm_mon, priv->iobase + HW_MONTH); in asm9260_rtc_set_time()
181 iowrite32(tm->tm_mday, priv->iobase + HW_DOM); in asm9260_rtc_set_time()
182 iowrite32(tm->tm_wday, priv->iobase + HW_DOW); in asm9260_rtc_set_time()
183 iowrite32(tm->tm_yday, priv->iobase + HW_DOY); in asm9260_rtc_set_time()
184 iowrite32(tm->tm_hour, priv->iobase + HW_HOUR); in asm9260_rtc_set_time()
185 iowrite32(tm->tm_min, priv->iobase + HW_MIN); in asm9260_rtc_set_time()
186 iowrite32(tm->tm_sec, priv->iobase + HW_SEC); in asm9260_rtc_set_time()
195 alrm->time.tm_year = ioread32(priv->iobase + HW_ALYEAR); in asm9260_rtc_read_alarm()
196 alrm->time.tm_mon = ioread32(priv->iobase + HW_ALMON); in asm9260_rtc_read_alarm()
197 alrm->time.tm_mday = ioread32(priv->iobase + HW_ALDOM); in asm9260_rtc_read_alarm()
198 alrm->time.tm_wday = ioread32(priv->iobase + HW_ALDOW); in asm9260_rtc_read_alarm()
199 alrm->time.tm_yday = ioread32(priv->iobase + HW_ALDOY); in asm9260_rtc_read_alarm()
200 alrm->time.tm_hour = ioread32(priv->iobase + HW_ALHOUR); in asm9260_rtc_read_alarm()
201 alrm->time.tm_min = ioread32(priv->iobase + HW_ALMIN); in asm9260_rtc_read_alarm()
202 alrm->time.tm_sec = ioread32(priv->iobase + HW_ALSEC); in asm9260_rtc_read_alarm()
204 alrm->enabled = ioread32(priv->iobase + HW_AMR) ? 1 : 0; in asm9260_rtc_read_alarm()
205 alrm->pending = ioread32(priv->iobase + HW_CIIR) ? 1 : 0; in asm9260_rtc_read_alarm()
207 return rtc_valid_tm(&alrm->time); in asm9260_rtc_read_alarm()
214 iowrite32(alrm->time.tm_year, priv->iobase + HW_ALYEAR); in asm9260_rtc_set_alarm()
215 iowrite32(alrm->time.tm_mon, priv->iobase + HW_ALMON); in asm9260_rtc_set_alarm()
216 iowrite32(alrm->time.tm_mday, priv->iobase + HW_ALDOM); in asm9260_rtc_set_alarm()
217 iowrite32(alrm->time.tm_wday, priv->iobase + HW_ALDOW); in asm9260_rtc_set_alarm()
218 iowrite32(alrm->time.tm_yday, priv->iobase + HW_ALDOY); in asm9260_rtc_set_alarm()
219 iowrite32(alrm->time.tm_hour, priv->iobase + HW_ALHOUR); in asm9260_rtc_set_alarm()
220 iowrite32(alrm->time.tm_min, priv->iobase + HW_ALMIN); in asm9260_rtc_set_alarm()
221 iowrite32(alrm->time.tm_sec, priv->iobase + HW_ALSEC); in asm9260_rtc_set_alarm()
223 iowrite32(alrm->enabled ? 0 : BM_AMR_OFF, priv->iobase + HW_AMR); in asm9260_rtc_set_alarm()
232 iowrite32(enabled ? 0 : BM_AMR_OFF, priv->iobase + HW_AMR); in asm9260_alarm_irq_enable()
247 struct device *dev = &pdev->dev; in asm9260_rtc_probe()
253 return -ENOMEM; in asm9260_rtc_probe()
255 priv->dev = &pdev->dev; in asm9260_rtc_probe()
262 priv->iobase = devm_platform_ioremap_resource(pdev, 0); in asm9260_rtc_probe()
263 if (IS_ERR(priv->iobase)) in asm9260_rtc_probe()
264 return PTR_ERR(priv->iobase); in asm9260_rtc_probe()
266 priv->clk = devm_clk_get(dev, "ahb"); in asm9260_rtc_probe()
267 if (IS_ERR(priv->clk)) in asm9260_rtc_probe()
268 return PTR_ERR(priv->clk); in asm9260_rtc_probe()
270 ret = clk_prepare_enable(priv->clk); in asm9260_rtc_probe()
276 ccr = ioread32(priv->iobase + HW_CCR); in asm9260_rtc_probe()
279 iowrite32(BM_CTCRST, priv->iobase + HW_CCR); in asm9260_rtc_probe()
283 iowrite32(BM_CLKEN | ccr, priv->iobase + HW_CCR); in asm9260_rtc_probe()
284 iowrite32(0, priv->iobase + HW_CIIR); in asm9260_rtc_probe()
285 iowrite32(BM_AMR_OFF, priv->iobase + HW_AMR); in asm9260_rtc_probe()
287 priv->rtc = devm_rtc_device_register(dev, dev_name(dev), in asm9260_rtc_probe()
289 if (IS_ERR(priv->rtc)) { in asm9260_rtc_probe()
290 ret = PTR_ERR(priv->rtc); in asm9260_rtc_probe()
291 dev_err(dev, "Failed to register RTC device: %d\n", ret); in asm9260_rtc_probe()
307 clk_disable_unprepare(priv->clk); in asm9260_rtc_probe()
316 iowrite32(BM_AMR_OFF, priv->iobase + HW_AMR); in asm9260_rtc_remove()
317 clk_disable_unprepare(priv->clk); in asm9260_rtc_remove()
321 { .compatible = "alphascale,asm9260-rtc", },
330 .name = "asm9260-rtc",
337 MODULE_AUTHOR("Oleksij Rempel <linux@rempel-privat.de>");
338 MODULE_DESCRIPTION("Alphascale asm9260 SoC Realtime Clock Driver (RTC)");