hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/rtc/rtc-snvs.c
....@@ -7,8 +7,8 @@
77 #include <linux/kernel.h>
88 #include <linux/module.h>
99 #include <linux/of.h>
10
-#include <linux/of_device.h>
1110 #include <linux/platform_device.h>
11
+#include <linux/pm_wakeirq.h>
1212 #include <linux/rtc.h>
1313 #include <linux/clk.h>
1414 #include <linux/mfd/syscon.h>
....@@ -31,6 +31,14 @@
3131
3232 #define SNVS_LPPGDR_INIT 0x41736166
3333 #define CNTR_TO_SECS_SH 15
34
+
35
+/* The maximum RTC clock cycles that are allowed to pass between two
36
+ * consecutive clock counter register reads. If the values are corrupted a
37
+ * bigger difference is expected. The RTC frequency is 32kHz. With 320 cycles
38
+ * we end at 10ms which should be enough for most cases. If it once takes
39
+ * longer than expected we do a retry.
40
+ */
41
+#define MAX_RTC_READ_DIFF_CYCLES 320
3442
3543 struct snvs_rtc_data {
3644 struct rtc_device *rtc;
....@@ -56,6 +64,7 @@
5664 static u32 rtc_read_lp_counter(struct snvs_rtc_data *data)
5765 {
5866 u64 read1, read2;
67
+ s64 diff;
5968 unsigned int timeout = 100;
6069
6170 /* As expected, the registers might update between the read of the LSB
....@@ -66,7 +75,8 @@
6675 do {
6776 read2 = read1;
6877 read1 = rtc_read_lpsrt(data);
69
- } while (read1 != read2 && --timeout);
78
+ diff = read1 - read2;
79
+ } while (((diff < 0) || (diff > MAX_RTC_READ_DIFF_CYCLES)) && --timeout);
7080 if (!timeout)
7181 dev_err(&data->rtc->dev, "Timeout trying to get valid LPSRT Counter read\n");
7282
....@@ -78,13 +88,15 @@
7888 static int rtc_read_lp_counter_lsb(struct snvs_rtc_data *data, u32 *lsb)
7989 {
8090 u32 count1, count2;
91
+ s32 diff;
8192 unsigned int timeout = 100;
8293
8394 regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
8495 do {
8596 count2 = count1;
8697 regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
87
- } while (count1 != count2 && --timeout);
98
+ diff = count1 - count2;
99
+ } while (((diff < 0) || (diff > MAX_RTC_READ_DIFF_CYCLES)) && --timeout);
88100 if (!timeout) {
89101 dev_err(&data->rtc->dev, "Timeout trying to get valid LPSRT Counter read\n");
90102 return -ETIMEDOUT;
....@@ -148,9 +160,20 @@
148160 static int snvs_rtc_read_time(struct device *dev, struct rtc_time *tm)
149161 {
150162 struct snvs_rtc_data *data = dev_get_drvdata(dev);
151
- unsigned long time = rtc_read_lp_counter(data);
163
+ unsigned long time;
164
+ int ret;
152165
153
- rtc_time_to_tm(time, tm);
166
+ if (data->clk) {
167
+ ret = clk_enable(data->clk);
168
+ if (ret)
169
+ return ret;
170
+ }
171
+
172
+ time = rtc_read_lp_counter(data);
173
+ rtc_time64_to_tm(time, tm);
174
+
175
+ if (data->clk)
176
+ clk_disable(data->clk);
154177
155178 return 0;
156179 }
....@@ -158,10 +181,14 @@
158181 static int snvs_rtc_set_time(struct device *dev, struct rtc_time *tm)
159182 {
160183 struct snvs_rtc_data *data = dev_get_drvdata(dev);
161
- unsigned long time;
184
+ unsigned long time = rtc_tm_to_time64(tm);
162185 int ret;
163186
164
- rtc_tm_to_time(tm, &time);
187
+ if (data->clk) {
188
+ ret = clk_enable(data->clk);
189
+ if (ret)
190
+ return ret;
191
+ }
165192
166193 /* Disable RTC first */
167194 ret = snvs_rtc_enable(data, false);
....@@ -175,6 +202,9 @@
175202 /* Enable RTC again */
176203 ret = snvs_rtc_enable(data, true);
177204
205
+ if (data->clk)
206
+ clk_disable(data->clk);
207
+
178208 return ret;
179209 }
180210
....@@ -182,12 +212,22 @@
182212 {
183213 struct snvs_rtc_data *data = dev_get_drvdata(dev);
184214 u32 lptar, lpsr;
215
+ int ret;
216
+
217
+ if (data->clk) {
218
+ ret = clk_enable(data->clk);
219
+ if (ret)
220
+ return ret;
221
+ }
185222
186223 regmap_read(data->regmap, data->offset + SNVS_LPTAR, &lptar);
187
- rtc_time_to_tm(lptar, &alrm->time);
224
+ rtc_time64_to_tm(lptar, &alrm->time);
188225
189226 regmap_read(data->regmap, data->offset + SNVS_LPSR, &lpsr);
190227 alrm->pending = (lpsr & SNVS_LPSR_LPTA) ? 1 : 0;
228
+
229
+ if (data->clk)
230
+ clk_disable(data->clk);
191231
192232 return 0;
193233 }
....@@ -195,22 +235,37 @@
195235 static int snvs_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
196236 {
197237 struct snvs_rtc_data *data = dev_get_drvdata(dev);
238
+ int ret;
239
+
240
+ if (data->clk) {
241
+ ret = clk_enable(data->clk);
242
+ if (ret)
243
+ return ret;
244
+ }
198245
199246 regmap_update_bits(data->regmap, data->offset + SNVS_LPCR,
200247 (SNVS_LPCR_LPTA_EN | SNVS_LPCR_LPWUI_EN),
201248 enable ? (SNVS_LPCR_LPTA_EN | SNVS_LPCR_LPWUI_EN) : 0);
202249
203
- return rtc_write_sync_lp(data);
250
+ ret = rtc_write_sync_lp(data);
251
+
252
+ if (data->clk)
253
+ clk_disable(data->clk);
254
+
255
+ return ret;
204256 }
205257
206258 static int snvs_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
207259 {
208260 struct snvs_rtc_data *data = dev_get_drvdata(dev);
209
- struct rtc_time *alrm_tm = &alrm->time;
210
- unsigned long time;
261
+ unsigned long time = rtc_tm_to_time64(&alrm->time);
211262 int ret;
212263
213
- rtc_tm_to_time(alrm_tm, &time);
264
+ if (data->clk) {
265
+ ret = clk_enable(data->clk);
266
+ if (ret)
267
+ return ret;
268
+ }
214269
215270 regmap_update_bits(data->regmap, data->offset + SNVS_LPCR, SNVS_LPCR_LPTA_EN, 0);
216271 ret = rtc_write_sync_lp(data);
....@@ -220,6 +275,9 @@
220275
221276 /* Clear alarm interrupt status bit */
222277 regmap_write(data->regmap, data->offset + SNVS_LPSR, SNVS_LPSR_LPTA);
278
+
279
+ if (data->clk)
280
+ clk_disable(data->clk);
223281
224282 return snvs_rtc_alarm_irq_enable(dev, alrm->enabled);
225283 }
....@@ -239,6 +297,9 @@
239297 u32 lpsr;
240298 u32 events = 0;
241299
300
+ if (data->clk)
301
+ clk_enable(data->clk);
302
+
242303 regmap_read(data->regmap, data->offset + SNVS_LPSR, &lpsr);
243304
244305 if (lpsr & SNVS_LPSR_LPTA) {
....@@ -253,6 +314,9 @@
253314 /* clear interrupt status */
254315 regmap_write(data->regmap, data->offset + SNVS_LPSR, lpsr);
255316
317
+ if (data->clk)
318
+ clk_disable(data->clk);
319
+
256320 return events ? IRQ_HANDLED : IRQ_NONE;
257321 }
258322
....@@ -262,10 +326,15 @@
262326 .reg_stride = 4,
263327 };
264328
329
+static void snvs_rtc_action(void *data)
330
+{
331
+ if (data)
332
+ clk_disable_unprepare(data);
333
+}
334
+
265335 static int snvs_rtc_probe(struct platform_device *pdev)
266336 {
267337 struct snvs_rtc_data *data;
268
- struct resource *res;
269338 int ret;
270339 void __iomem *mmio;
271340
....@@ -281,9 +350,8 @@
281350
282351 if (IS_ERR(data->regmap)) {
283352 dev_warn(&pdev->dev, "snvs rtc: you use old dts file, please update it\n");
284
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
285353
286
- mmio = devm_ioremap_resource(&pdev->dev, res);
354
+ mmio = devm_platform_ioremap_resource(pdev, 0);
287355 if (IS_ERR(mmio))
288356 return PTR_ERR(mmio);
289357
....@@ -314,6 +382,10 @@
314382 }
315383 }
316384
385
+ ret = devm_add_action_or_reset(&pdev->dev, snvs_rtc_action, data->clk);
386
+ if (ret)
387
+ return ret;
388
+
317389 platform_set_drvdata(pdev, data);
318390
319391 /* Initialize glitch detect */
....@@ -326,90 +398,51 @@
326398 ret = snvs_rtc_enable(data, true);
327399 if (ret) {
328400 dev_err(&pdev->dev, "failed to enable rtc %d\n", ret);
329
- goto error_rtc_device_register;
401
+ return ret;
330402 }
331403
332404 device_init_wakeup(&pdev->dev, true);
405
+ ret = dev_pm_set_wake_irq(&pdev->dev, data->irq);
406
+ if (ret)
407
+ dev_err(&pdev->dev, "failed to enable irq wake\n");
333408
334409 ret = devm_request_irq(&pdev->dev, data->irq, snvs_rtc_irq_handler,
335410 IRQF_SHARED, "rtc alarm", &pdev->dev);
336411 if (ret) {
337412 dev_err(&pdev->dev, "failed to request irq %d: %d\n",
338413 data->irq, ret);
339
- goto error_rtc_device_register;
414
+ return ret;
340415 }
341416
342417 data->rtc->ops = &snvs_rtc_ops;
343
- ret = rtc_register_device(data->rtc);
344
- if (ret) {
345
- dev_err(&pdev->dev, "failed to register rtc: %d\n", ret);
346
- goto error_rtc_device_register;
347
- }
418
+ data->rtc->range_max = U32_MAX;
348419
349
- return 0;
350
-
351
-error_rtc_device_register:
352
- if (data->clk)
353
- clk_disable_unprepare(data->clk);
354
-
355
- return ret;
420
+ return rtc_register_device(data->rtc);
356421 }
357422
358
-#ifdef CONFIG_PM_SLEEP
359
-static int snvs_rtc_suspend(struct device *dev)
360
-{
361
- struct snvs_rtc_data *data = dev_get_drvdata(dev);
362
-
363
- if (device_may_wakeup(dev))
364
- return enable_irq_wake(data->irq);
365
-
366
- return 0;
367
-}
368
-
369
-static int snvs_rtc_suspend_noirq(struct device *dev)
423
+static int __maybe_unused snvs_rtc_suspend_noirq(struct device *dev)
370424 {
371425 struct snvs_rtc_data *data = dev_get_drvdata(dev);
372426
373427 if (data->clk)
374
- clk_disable_unprepare(data->clk);
428
+ clk_disable(data->clk);
375429
376430 return 0;
377431 }
378432
379
-static int snvs_rtc_resume(struct device *dev)
380
-{
381
- struct snvs_rtc_data *data = dev_get_drvdata(dev);
382
-
383
- if (device_may_wakeup(dev))
384
- return disable_irq_wake(data->irq);
385
-
386
- return 0;
387
-}
388
-
389
-static int snvs_rtc_resume_noirq(struct device *dev)
433
+static int __maybe_unused snvs_rtc_resume_noirq(struct device *dev)
390434 {
391435 struct snvs_rtc_data *data = dev_get_drvdata(dev);
392436
393437 if (data->clk)
394
- return clk_prepare_enable(data->clk);
438
+ return clk_enable(data->clk);
395439
396440 return 0;
397441 }
398442
399443 static const struct dev_pm_ops snvs_rtc_pm_ops = {
400
- .suspend = snvs_rtc_suspend,
401
- .suspend_noirq = snvs_rtc_suspend_noirq,
402
- .resume = snvs_rtc_resume,
403
- .resume_noirq = snvs_rtc_resume_noirq,
444
+ SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(snvs_rtc_suspend_noirq, snvs_rtc_resume_noirq)
404445 };
405
-
406
-#define SNVS_RTC_PM_OPS (&snvs_rtc_pm_ops)
407
-
408
-#else
409
-
410
-#define SNVS_RTC_PM_OPS NULL
411
-
412
-#endif
413446
414447 static const struct of_device_id snvs_dt_ids[] = {
415448 { .compatible = "fsl,sec-v4.0-mon-rtc-lp", },
....@@ -420,7 +453,7 @@
420453 static struct platform_driver snvs_rtc_driver = {
421454 .driver = {
422455 .name = "snvs_rtc",
423
- .pm = SNVS_RTC_PM_OPS,
456
+ .pm = &snvs_rtc_pm_ops,
424457 .of_match_table = snvs_dt_ids,
425458 },
426459 .probe = snvs_rtc_probe,