hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/rtc/rtc-imxdi.c
....@@ -1,18 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0+
12 /*
23 * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
34 * Copyright 2010 Orex Computed Radiography
45 */
5
-
6
-/*
7
- * The code contained herein is licensed under the GNU General Public
8
- * License. You may obtain a copy of the GNU General Public License
9
- * Version 2 or later at the following locations:
10
- *
11
- * http://www.opensource.org/licenses/gpl-license.html
12
- * http://www.gnu.org/copyleft/gpl.html
13
- */
14
-
15
-/* based on rtc-mc13892.c */
166
177 /*
188 * This driver uses the 47-bit 32 kHz counter in the Freescale DryIce block
....@@ -105,7 +95,7 @@
10595
10696 /**
10797 * struct imxdi_dev - private imxdi rtc data
108
- * @pdev: pionter to platform dev
98
+ * @pdev: pointer to platform dev
10999 * @rtc: pointer to rtc struct
110100 * @ioaddr: IO registers pointer
111101 * @clk: input reference clock
....@@ -360,7 +350,7 @@
360350 * the tamper register is locked. We cannot disable the
361351 * tamper detection. The TDCHL can only be reset by a
362352 * DRYICE POR, but we cannot force a DRYICE POR in
363
- * softwere because we are still in "FAILURE STATE".
353
+ * software because we are still in "FAILURE STATE".
364354 * We need a DRYICE POR via battery power cycling....
365355 */
366356 /*
....@@ -552,7 +542,7 @@
552542 unsigned long now;
553543
554544 now = readl(imxdi->ioaddr + DTCMR);
555
- rtc_time_to_tm(now, tm);
545
+ rtc_time64_to_tm(now, tm);
556546
557547 return 0;
558548 }
....@@ -561,7 +551,7 @@
561551 * set the seconds portion of dryice time counter and clear the
562552 * fractional part.
563553 */
564
-static int dryice_rtc_set_mmss(struct device *dev, unsigned long secs)
554
+static int dryice_rtc_set_time(struct device *dev, struct rtc_time *tm)
565555 {
566556 struct imxdi_dev *imxdi = dev_get_drvdata(dev);
567557 u32 dcr, dsr;
....@@ -588,7 +578,7 @@
588578 if (rc != 0)
589579 return rc;
590580
591
- rc = di_write_wait(imxdi, secs, DTCMR);
581
+ rc = di_write_wait(imxdi, rtc_tm_to_time64(tm), DTCMR);
592582 if (rc != 0)
593583 return rc;
594584
....@@ -618,7 +608,7 @@
618608 u32 dcamr;
619609
620610 dcamr = readl(imxdi->ioaddr + DCAMR);
621
- rtc_time_to_tm(dcamr, &alarm->time);
611
+ rtc_time64_to_tm(dcamr, &alarm->time);
622612
623613 /* alarm is enabled if the interrupt is enabled */
624614 alarm->enabled = (readl(imxdi->ioaddr + DIER) & DIER_CAIE) != 0;
....@@ -640,21 +630,10 @@
640630 static int dryice_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
641631 {
642632 struct imxdi_dev *imxdi = dev_get_drvdata(dev);
643
- unsigned long now;
644
- unsigned long alarm_time;
645633 int rc;
646634
647
- rc = rtc_tm_to_time(&alarm->time, &alarm_time);
648
- if (rc)
649
- return rc;
650
-
651
- /* don't allow setting alarm in the past */
652
- now = readl(imxdi->ioaddr + DTCMR);
653
- if (alarm_time < now)
654
- return -EINVAL;
655
-
656635 /* write the new alarm time */
657
- rc = di_write_wait(imxdi, (u32)alarm_time, DCAMR);
636
+ rc = di_write_wait(imxdi, rtc_tm_to_time64(&alarm->time), DCAMR);
658637 if (rc)
659638 return rc;
660639
....@@ -668,7 +647,7 @@
668647
669648 static const struct rtc_class_ops dryice_rtc_ops = {
670649 .read_time = dryice_rtc_read_time,
671
- .set_mmss = dryice_rtc_set_mmss,
650
+ .set_time = dryice_rtc_set_time,
672651 .alarm_irq_enable = dryice_rtc_alarm_irq_enable,
673652 .read_alarm = dryice_rtc_read_alarm,
674653 .set_alarm = dryice_rtc_set_alarm,
....@@ -761,7 +740,6 @@
761740 */
762741 static int __init dryice_rtc_probe(struct platform_device *pdev)
763742 {
764
- struct resource *res;
765743 struct imxdi_dev *imxdi;
766744 int norm_irq, sec_irq;
767745 int rc;
....@@ -772,8 +750,7 @@
772750
773751 imxdi->pdev = pdev;
774752
775
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
776
- imxdi->ioaddr = devm_ioremap_resource(&pdev->dev, res);
753
+ imxdi->ioaddr = devm_platform_ioremap_resource(pdev, 0);
777754 if (IS_ERR(imxdi->ioaddr))
778755 return PTR_ERR(imxdi->ioaddr);
779756
....@@ -795,6 +772,10 @@
795772 INIT_WORK(&imxdi->work, dryice_work);
796773
797774 mutex_init(&imxdi->write_mutex);
775
+
776
+ imxdi->rtc = devm_rtc_allocate_device(&pdev->dev);
777
+ if (IS_ERR(imxdi->rtc))
778
+ return PTR_ERR(imxdi->rtc);
798779
799780 imxdi->clk = devm_clk_get(&pdev->dev, NULL);
800781 if (IS_ERR(imxdi->clk))
....@@ -829,12 +810,13 @@
829810 }
830811
831812 platform_set_drvdata(pdev, imxdi);
832
- imxdi->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
833
- &dryice_rtc_ops, THIS_MODULE);
834
- if (IS_ERR(imxdi->rtc)) {
835
- rc = PTR_ERR(imxdi->rtc);
813
+
814
+ imxdi->rtc->ops = &dryice_rtc_ops;
815
+ imxdi->rtc->range_max = U32_MAX;
816
+
817
+ rc = rtc_register_device(imxdi->rtc);
818
+ if (rc)
836819 goto err;
837
- }
838820
839821 return 0;
840822