hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/rtc/rtc-goldfish.c
....@@ -1,23 +1,15 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /* drivers/rtc/rtc-goldfish.c
23 *
34 * Copyright (C) 2007 Google, Inc.
45 * Copyright (C) 2017 Imagination Technologies Ltd.
5
- *
6
- * This software is licensed under the terms of the GNU General Public
7
- * License version 2, as published by the Free Software Foundation, and
8
- * may be copied, distributed, and modified under those terms.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
156 */
167
8
+#include <linux/io.h>
179 #include <linux/module.h>
10
+#include <linux/of.h>
1811 #include <linux/platform_device.h>
1912 #include <linux/rtc.h>
20
-#include <linux/io.h>
2113
2214 #define TIMER_TIME_LOW 0x00 /* get low bits of current time */
2315 /* and update TIMER_TIME_HIGH */
....@@ -56,7 +48,7 @@
5648 do_div(rtc_alarm, NSEC_PER_SEC);
5749 memset(alrm, 0, sizeof(struct rtc_wkalrm));
5850
59
- rtc_time_to_tm(rtc_alarm, &alrm->time);
51
+ rtc_time64_to_tm(rtc_alarm, &alrm->time);
6052
6153 if (readl(base + TIMER_ALARM_STATUS))
6254 alrm->enabled = 1;
....@@ -70,21 +62,15 @@
7062 struct rtc_wkalrm *alrm)
7163 {
7264 struct goldfish_rtc *rtcdrv;
73
- unsigned long rtc_alarm;
7465 u64 rtc_alarm64;
7566 u64 rtc_status_reg;
7667 void __iomem *base;
77
- int ret = 0;
7868
7969 rtcdrv = dev_get_drvdata(dev);
8070 base = rtcdrv->base;
8171
8272 if (alrm->enabled) {
83
- ret = rtc_tm_to_time(&alrm->time, &rtc_alarm);
84
- if (ret != 0)
85
- return ret;
86
-
87
- rtc_alarm64 = rtc_alarm * NSEC_PER_SEC;
73
+ rtc_alarm64 = rtc_tm_to_time64(&alrm->time) * NSEC_PER_SEC;
8874 writel((rtc_alarm64 >> 32), base + TIMER_ALARM_HIGH);
8975 writel(rtc_alarm64, base + TIMER_ALARM_LOW);
9076 writel(1, base + TIMER_IRQ_ENABLED);
....@@ -99,7 +85,7 @@
9985 writel(1, base + TIMER_CLEAR_ALARM);
10086 }
10187
102
- return ret;
88
+ return 0;
10389 }
10490
10591 static int goldfish_rtc_alarm_irq_enable(struct device *dev,
....@@ -148,7 +134,7 @@
148134
149135 do_div(time, NSEC_PER_SEC);
150136
151
- rtc_time_to_tm(time, tm);
137
+ rtc_time64_to_tm(time, tm);
152138
153139 return 0;
154140 }
....@@ -157,21 +143,16 @@
157143 {
158144 struct goldfish_rtc *rtcdrv;
159145 void __iomem *base;
160
- unsigned long now;
161146 u64 now64;
162
- int ret;
163147
164148 rtcdrv = dev_get_drvdata(dev);
165149 base = rtcdrv->base;
166150
167
- ret = rtc_tm_to_time(tm, &now);
168
- if (ret == 0) {
169
- now64 = now * NSEC_PER_SEC;
170
- writel((now64 >> 32), base + TIMER_TIME_HIGH);
171
- writel(now64, base + TIMER_TIME_LOW);
172
- }
151
+ now64 = rtc_tm_to_time64(tm) * NSEC_PER_SEC;
152
+ writel((now64 >> 32), base + TIMER_TIME_HIGH);
153
+ writel(now64, base + TIMER_TIME_LOW);
173154
174
- return ret;
155
+ return 0;
175156 }
176157
177158 static const struct rtc_class_ops goldfish_rtc_ops = {
....@@ -185,7 +166,6 @@
185166 static int goldfish_rtc_probe(struct platform_device *pdev)
186167 {
187168 struct goldfish_rtc *rtcdrv;
188
- struct resource *r;
189169 int err;
190170
191171 rtcdrv = devm_kzalloc(&pdev->dev, sizeof(*rtcdrv), GFP_KERNEL);
....@@ -193,24 +173,20 @@
193173 return -ENOMEM;
194174
195175 platform_set_drvdata(pdev, rtcdrv);
196
-
197
- r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
198
- if (!r)
199
- return -ENODEV;
200
-
201
- rtcdrv->base = devm_ioremap_resource(&pdev->dev, r);
176
+ rtcdrv->base = devm_platform_ioremap_resource(pdev, 0);
202177 if (IS_ERR(rtcdrv->base))
203
- return -ENODEV;
178
+ return PTR_ERR(rtcdrv->base);
204179
205180 rtcdrv->irq = platform_get_irq(pdev, 0);
206181 if (rtcdrv->irq < 0)
207182 return -ENODEV;
208183
209
- rtcdrv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
210
- &goldfish_rtc_ops,
211
- THIS_MODULE);
184
+ rtcdrv->rtc = devm_rtc_allocate_device(&pdev->dev);
212185 if (IS_ERR(rtcdrv->rtc))
213186 return PTR_ERR(rtcdrv->rtc);
187
+
188
+ rtcdrv->rtc->ops = &goldfish_rtc_ops;
189
+ rtcdrv->rtc->range_max = U64_MAX / NSEC_PER_SEC;
214190
215191 err = devm_request_irq(&pdev->dev, rtcdrv->irq,
216192 goldfish_rtc_interrupt,
....@@ -218,7 +194,7 @@
218194 if (err)
219195 return err;
220196
221
- return 0;
197
+ return rtc_register_device(rtcdrv->rtc);
222198 }
223199
224200 static const struct of_device_id goldfish_rtc_of_match[] = {