hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/rtc/rtc-mpc5121.c
....@@ -1,13 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Real-time clock driver for MPC5121
34 *
45 * Copyright 2007, Domen Puncer <domen.puncer@telargo.com>
56 * Copyright 2008, Freescale Semiconductor, Inc. All rights reserved.
67 * Copyright 2011, Dmitry Eremin-Solenikov
7
- *
8
- * This program is free software; you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License version 2 as
10
- * published by the Free Software Foundation.
118 */
129
1310 #include <linux/init.h>
....@@ -114,7 +111,7 @@
114111 */
115112 now = in_be32(&regs->actual_time) + in_be32(&regs->target_time);
116113
117
- rtc_time_to_tm(now, tm);
114
+ rtc_time64_to_tm(now, tm);
118115
119116 /*
120117 * update second minute hour registers
....@@ -129,16 +126,14 @@
129126 {
130127 struct mpc5121_rtc_data *rtc = dev_get_drvdata(dev);
131128 struct mpc5121_rtc_regs __iomem *regs = rtc->regs;
132
- int ret;
133129 unsigned long now;
134130
135131 /*
136132 * The actual_time register is read only so we write the offset
137133 * between it and linux time to the target_time register.
138134 */
139
- ret = rtc_tm_to_time(tm, &now);
140
- if (ret == 0)
141
- out_be32(&regs->target_time, now - in_be32(&regs->actual_time));
135
+ now = rtc_tm_to_time64(tm);
136
+ out_be32(&regs->target_time, now - in_be32(&regs->actual_time));
142137
143138 /*
144139 * update second minute hour registers
....@@ -318,10 +313,10 @@
318313 if (!rtc)
319314 return -ENOMEM;
320315
321
- rtc->regs = of_iomap(op->dev.of_node, 0);
322
- if (!rtc->regs) {
316
+ rtc->regs = devm_platform_ioremap_resource(op, 0);
317
+ if (IS_ERR(rtc->regs)) {
323318 dev_err(&op->dev, "%s: couldn't map io space\n", __func__);
324
- return -ENOSYS;
319
+ return PTR_ERR(rtc->regs);
325320 }
326321
327322 device_init_wakeup(&op->dev, 1);
....@@ -329,8 +324,8 @@
329324 platform_set_drvdata(op, rtc);
330325
331326 rtc->irq = irq_of_parse_and_map(op->dev.of_node, 1);
332
- err = request_irq(rtc->irq, mpc5121_rtc_handler, 0,
333
- "mpc5121-rtc", &op->dev);
327
+ err = devm_request_irq(&op->dev, rtc->irq, mpc5121_rtc_handler, 0,
328
+ "mpc5121-rtc", &op->dev);
334329 if (err) {
335330 dev_err(&op->dev, "%s: could not request irq: %i\n",
336331 __func__, rtc->irq);
....@@ -338,13 +333,25 @@
338333 }
339334
340335 rtc->irq_periodic = irq_of_parse_and_map(op->dev.of_node, 0);
341
- err = request_irq(rtc->irq_periodic, mpc5121_rtc_handler_upd,
342
- 0, "mpc5121-rtc_upd", &op->dev);
336
+ err = devm_request_irq(&op->dev, rtc->irq_periodic,
337
+ mpc5121_rtc_handler_upd, 0, "mpc5121-rtc_upd",
338
+ &op->dev);
343339 if (err) {
344340 dev_err(&op->dev, "%s: could not request irq: %i\n",
345341 __func__, rtc->irq_periodic);
346342 goto out_dispose2;
347343 }
344
+
345
+ rtc->rtc = devm_rtc_allocate_device(&op->dev);
346
+ if (IS_ERR(rtc->rtc)) {
347
+ err = PTR_ERR(rtc->rtc);
348
+ goto out_dispose2;
349
+ }
350
+
351
+ rtc->rtc->ops = &mpc5200_rtc_ops;
352
+ rtc->rtc->uie_unsupported = 1;
353
+ rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_0000;
354
+ rtc->rtc->range_max = 65733206399ULL; /* 4052-12-31 23:59:59 */
348355
349356 if (of_device_is_compatible(op->dev.of_node, "fsl,mpc5121-rtc")) {
350357 u32 ka;
....@@ -354,30 +361,26 @@
354361 "mpc5121-rtc: Battery or oscillator failure!\n");
355362 out_be32(&rtc->regs->keep_alive, ka);
356363 }
357
-
358
- rtc->rtc = devm_rtc_device_register(&op->dev, "mpc5121-rtc",
359
- &mpc5121_rtc_ops, THIS_MODULE);
360
- } else {
361
- rtc->rtc = devm_rtc_device_register(&op->dev, "mpc5200-rtc",
362
- &mpc5200_rtc_ops, THIS_MODULE);
364
+ rtc->rtc->ops = &mpc5121_rtc_ops;
365
+ /*
366
+ * This is a limitation of the driver that abuses the target
367
+ * time register, the actual maximum year for the mpc5121 is
368
+ * also 4052.
369
+ */
370
+ rtc->rtc->range_min = 0;
371
+ rtc->rtc->range_max = U32_MAX;
363372 }
364373
365
- if (IS_ERR(rtc->rtc)) {
366
- err = PTR_ERR(rtc->rtc);
367
- goto out_free_irq;
368
- }
369
- rtc->rtc->uie_unsupported = 1;
374
+ err = rtc_register_device(rtc->rtc);
375
+ if (err)
376
+ goto out_dispose2;
370377
371378 return 0;
372379
373
-out_free_irq:
374
- free_irq(rtc->irq_periodic, &op->dev);
375380 out_dispose2:
376381 irq_dispose_mapping(rtc->irq_periodic);
377
- free_irq(rtc->irq, &op->dev);
378382 out_dispose:
379383 irq_dispose_mapping(rtc->irq);
380
- iounmap(rtc->regs);
381384
382385 return err;
383386 }
....@@ -391,9 +394,6 @@
391394 out_8(&regs->alm_enable, 0);
392395 out_8(&regs->int_enable, in_8(&regs->int_enable) & ~0x1);
393396
394
- iounmap(rtc->regs);
395
- free_irq(rtc->irq, &op->dev);
396
- free_irq(rtc->irq_periodic, &op->dev);
397397 irq_dispose_mapping(rtc->irq);
398398 irq_dispose_mapping(rtc->irq_periodic);
399399