Lines Matching +full:pic32mzda +full:- +full:clk
1 // SPDX-License-Identifier: GPL-2.0+
15 #include <linux/clk.h>
19 #include <asm/mach-pic32/pic32.h>
59 struct clk *clk; member
70 spin_lock_irqsave(&pdata->alarm_lock, flags); in pic32_rtc_alarm_clk_enable()
72 if (!pdata->alarm_clk_enabled) { in pic32_rtc_alarm_clk_enable()
73 clk_enable(pdata->clk); in pic32_rtc_alarm_clk_enable()
74 pdata->alarm_clk_enabled = true; in pic32_rtc_alarm_clk_enable()
77 if (pdata->alarm_clk_enabled) { in pic32_rtc_alarm_clk_enable()
78 clk_disable(pdata->clk); in pic32_rtc_alarm_clk_enable()
79 pdata->alarm_clk_enabled = false; in pic32_rtc_alarm_clk_enable()
82 spin_unlock_irqrestore(&pdata->alarm_lock, flags); in pic32_rtc_alarm_clk_enable()
89 clk_enable(pdata->clk); in pic32_rtc_alarmirq()
90 rtc_update_irq(pdata->rtc, 1, RTC_AF | RTC_IRQF); in pic32_rtc_alarmirq()
91 clk_disable(pdata->clk); in pic32_rtc_alarmirq()
101 void __iomem *base = pdata->reg_base; in pic32_rtc_setaie()
103 clk_enable(pdata->clk); in pic32_rtc_setaie()
109 clk_disable(pdata->clk); in pic32_rtc_setaie()
119 void __iomem *base = pdata->reg_base; in pic32_rtc_setfreq()
121 clk_enable(pdata->clk); in pic32_rtc_setfreq()
127 clk_disable(pdata->clk); in pic32_rtc_setfreq()
135 void __iomem *base = pdata->reg_base; in pic32_rtc_gettime()
138 clk_enable(pdata->clk); in pic32_rtc_gettime()
141 rtc_tm->tm_hour = readb(base + PIC32_RTCHOUR); in pic32_rtc_gettime()
142 rtc_tm->tm_min = readb(base + PIC32_RTCMIN); in pic32_rtc_gettime()
143 rtc_tm->tm_mon = readb(base + PIC32_RTCMON); in pic32_rtc_gettime()
144 rtc_tm->tm_mday = readb(base + PIC32_RTCDAY); in pic32_rtc_gettime()
145 rtc_tm->tm_year = readb(base + PIC32_RTCYEAR); in pic32_rtc_gettime()
146 rtc_tm->tm_sec = readb(base + PIC32_RTCSEC); in pic32_rtc_gettime()
149 * The only way to work out whether the system was mid-update in pic32_rtc_gettime()
151 * is zero, then we re-try the entire read. in pic32_rtc_gettime()
154 } while (rtc_tm->tm_sec == 0 && tries < 2); in pic32_rtc_gettime()
156 rtc_tm->tm_sec = bcd2bin(rtc_tm->tm_sec); in pic32_rtc_gettime()
157 rtc_tm->tm_min = bcd2bin(rtc_tm->tm_min); in pic32_rtc_gettime()
158 rtc_tm->tm_hour = bcd2bin(rtc_tm->tm_hour); in pic32_rtc_gettime()
159 rtc_tm->tm_mday = bcd2bin(rtc_tm->tm_mday); in pic32_rtc_gettime()
160 rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon) - 1; in pic32_rtc_gettime()
161 rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year); in pic32_rtc_gettime()
163 rtc_tm->tm_year += 100; in pic32_rtc_gettime()
167 clk_disable(pdata->clk); in pic32_rtc_gettime()
174 void __iomem *base = pdata->reg_base; in pic32_rtc_settime()
178 clk_enable(pdata->clk); in pic32_rtc_settime()
179 writeb(bin2bcd(tm->tm_sec), base + PIC32_RTCSEC); in pic32_rtc_settime()
180 writeb(bin2bcd(tm->tm_min), base + PIC32_RTCMIN); in pic32_rtc_settime()
181 writeb(bin2bcd(tm->tm_hour), base + PIC32_RTCHOUR); in pic32_rtc_settime()
182 writeb(bin2bcd(tm->tm_mday), base + PIC32_RTCDAY); in pic32_rtc_settime()
183 writeb(bin2bcd(tm->tm_mon + 1), base + PIC32_RTCMON); in pic32_rtc_settime()
184 writeb(bin2bcd(tm->tm_year - 100), base + PIC32_RTCYEAR); in pic32_rtc_settime()
185 clk_disable(pdata->clk); in pic32_rtc_settime()
193 struct rtc_time *alm_tm = &alrm->time; in pic32_rtc_getalarm()
194 void __iomem *base = pdata->reg_base; in pic32_rtc_getalarm()
197 clk_enable(pdata->clk); in pic32_rtc_getalarm()
198 alm_tm->tm_sec = readb(base + PIC32_ALRMSEC); in pic32_rtc_getalarm()
199 alm_tm->tm_min = readb(base + PIC32_ALRMMIN); in pic32_rtc_getalarm()
200 alm_tm->tm_hour = readb(base + PIC32_ALRMHOUR); in pic32_rtc_getalarm()
201 alm_tm->tm_mon = readb(base + PIC32_ALRMMON); in pic32_rtc_getalarm()
202 alm_tm->tm_mday = readb(base + PIC32_ALRMDAY); in pic32_rtc_getalarm()
203 alm_tm->tm_year = readb(base + PIC32_ALRMYEAR); in pic32_rtc_getalarm()
207 alrm->enabled = (alm_en & PIC32_RTCALRM_ALRMEN) ? 1 : 0; in pic32_rtc_getalarm()
211 alm_tm->tm_sec = bcd2bin(alm_tm->tm_sec); in pic32_rtc_getalarm()
212 alm_tm->tm_min = bcd2bin(alm_tm->tm_min); in pic32_rtc_getalarm()
213 alm_tm->tm_hour = bcd2bin(alm_tm->tm_hour); in pic32_rtc_getalarm()
214 alm_tm->tm_mday = bcd2bin(alm_tm->tm_mday); in pic32_rtc_getalarm()
215 alm_tm->tm_mon = bcd2bin(alm_tm->tm_mon) - 1; in pic32_rtc_getalarm()
216 alm_tm->tm_year = bcd2bin(alm_tm->tm_year); in pic32_rtc_getalarm()
218 clk_disable(pdata->clk); in pic32_rtc_getalarm()
225 struct rtc_time *tm = &alrm->time; in pic32_rtc_setalarm()
226 void __iomem *base = pdata->reg_base; in pic32_rtc_setalarm()
228 clk_enable(pdata->clk); in pic32_rtc_setalarm()
229 dev_dbg(dev, "setalarm: %d, %ptR\n", alrm->enabled, tm); in pic32_rtc_setalarm()
234 pic32_rtc_setaie(dev, alrm->enabled); in pic32_rtc_setalarm()
236 clk_disable(pdata->clk); in pic32_rtc_setalarm()
243 void __iomem *base = pdata->reg_base; in pic32_rtc_proc()
246 clk_enable(pdata->clk); in pic32_rtc_proc()
252 clk_disable(pdata->clk); in pic32_rtc_proc()
267 void __iomem *base = pdata->reg_base; in pic32_rtc_enable()
272 clk_enable(pdata->clk); in pic32_rtc_enable()
284 clk_disable(pdata->clk); in pic32_rtc_enable()
291 pic32_rtc_setaie(&pdev->dev, 0); in pic32_rtc_remove()
292 clk_unprepare(pdata->clk); in pic32_rtc_remove()
293 pdata->clk = NULL; in pic32_rtc_remove()
301 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); in pic32_rtc_probe()
303 return -ENOMEM; in pic32_rtc_probe()
307 pdata->alarm_irq = platform_get_irq(pdev, 0); in pic32_rtc_probe()
308 if (pdata->alarm_irq < 0) in pic32_rtc_probe()
309 return pdata->alarm_irq; in pic32_rtc_probe()
311 pdata->reg_base = devm_platform_ioremap_resource(pdev, 0); in pic32_rtc_probe()
312 if (IS_ERR(pdata->reg_base)) in pic32_rtc_probe()
313 return PTR_ERR(pdata->reg_base); in pic32_rtc_probe()
315 pdata->clk = devm_clk_get(&pdev->dev, NULL); in pic32_rtc_probe()
316 if (IS_ERR(pdata->clk)) { in pic32_rtc_probe()
317 dev_err(&pdev->dev, "failed to find rtc clock source\n"); in pic32_rtc_probe()
318 ret = PTR_ERR(pdata->clk); in pic32_rtc_probe()
319 pdata->clk = NULL; in pic32_rtc_probe()
323 spin_lock_init(&pdata->alarm_lock); in pic32_rtc_probe()
325 pdata->rtc = devm_rtc_allocate_device(&pdev->dev); in pic32_rtc_probe()
326 if (IS_ERR(pdata->rtc)) in pic32_rtc_probe()
327 return PTR_ERR(pdata->rtc); in pic32_rtc_probe()
329 clk_prepare_enable(pdata->clk); in pic32_rtc_probe()
333 device_init_wakeup(&pdev->dev, true); in pic32_rtc_probe()
335 pdata->rtc->ops = &pic32_rtcops; in pic32_rtc_probe()
336 pdata->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in pic32_rtc_probe()
337 pdata->rtc->range_max = RTC_TIMESTAMP_END_2099; in pic32_rtc_probe()
339 ret = devm_rtc_register_device(pdata->rtc); in pic32_rtc_probe()
343 pdata->rtc->max_user_freq = 128; in pic32_rtc_probe()
345 pic32_rtc_setfreq(&pdev->dev, 1); in pic32_rtc_probe()
346 ret = devm_request_irq(&pdev->dev, pdata->alarm_irq, in pic32_rtc_probe()
348 dev_name(&pdev->dev), pdata); in pic32_rtc_probe()
350 dev_err(&pdev->dev, in pic32_rtc_probe()
351 "IRQ %d error %d\n", pdata->alarm_irq, ret); in pic32_rtc_probe()
355 clk_disable(pdata->clk); in pic32_rtc_probe()
361 clk_disable_unprepare(pdata->clk); in pic32_rtc_probe()
367 { .compatible = "microchip,pic32mzda-rtc" },
376 .name = "pic32-rtc",