hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/rtc/rtc-mv.c
....@@ -1,9 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * Driver for the RTC in Marvell SoCs.
3
- *
4
- * This file is licensed under the terms of the GNU General Public
5
- * License version 2. This program is licensed "as is" without any
6
- * warranty of any kind, whether express or implied.
74 */
85
96 #include <linux/init.h>
....@@ -60,7 +57,7 @@
6057
6158 rtc_reg = (bin2bcd(tm->tm_mday) << RTC_MDAY_OFFS) |
6259 (bin2bcd(tm->tm_mon + 1) << RTC_MONTH_OFFS) |
63
- (bin2bcd(tm->tm_year % 100) << RTC_YEAR_OFFS);
60
+ (bin2bcd(tm->tm_year - 100) << RTC_YEAR_OFFS);
6461 writel(rtc_reg, ioaddr + RTC_DATE_REG_OFFS);
6562
6663 return 0;
....@@ -125,13 +122,9 @@
125122 /* hw counts from year 2000, but tm_year is relative to 1900 */
126123 alm->time.tm_year = bcd2bin(year) + 100;
127124
128
- if (rtc_valid_tm(&alm->time) < 0) {
129
- dev_err(dev, "retrieved alarm date/time is not valid.\n");
130
- rtc_time_to_tm(0, &alm->time);
131
- }
132
-
133125 alm->enabled = !!readl(ioaddr + RTC_ALARM_INTERRUPT_MASK_REG_OFFS);
134
- return 0;
126
+
127
+ return rtc_valid_tm(&alm->time);
135128 }
136129
137130 static int mv_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
....@@ -163,7 +156,7 @@
163156 << RTC_MONTH_OFFS;
164157
165158 if (alm->time.tm_year >= 0)
166
- rtc_reg |= (RTC_ALARM_VALID | bin2bcd(alm->time.tm_year % 100))
159
+ rtc_reg |= (RTC_ALARM_VALID | bin2bcd(alm->time.tm_year - 100))
167160 << RTC_YEAR_OFFS;
168161
169162 writel(rtc_reg, ioaddr + RTC_ALARM_DATE_REG_OFFS);
....@@ -219,7 +212,6 @@
219212
220213 static int __init mv_rtc_probe(struct platform_device *pdev)
221214 {
222
- struct resource *res;
223215 struct rtc_plat_data *pdata;
224216 u32 rtc_time;
225217 int ret = 0;
....@@ -228,8 +220,7 @@
228220 if (!pdata)
229221 return -ENOMEM;
230222
231
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
232
- pdata->ioaddr = devm_ioremap_resource(&pdev->dev, res);
223
+ pdata->ioaddr = devm_platform_ioremap_resource(pdev, 0);
233224 if (IS_ERR(pdata->ioaddr))
234225 return PTR_ERR(pdata->ioaddr);
235226
....@@ -261,15 +252,7 @@
261252
262253 platform_set_drvdata(pdev, pdata);
263254
264
- if (pdata->irq >= 0) {
265
- device_init_wakeup(&pdev->dev, 1);
266
- pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
267
- &mv_rtc_alarm_ops,
268
- THIS_MODULE);
269
- } else {
270
- pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
271
- &mv_rtc_ops, THIS_MODULE);
272
- }
255
+ pdata->rtc = devm_rtc_allocate_device(&pdev->dev);
273256 if (IS_ERR(pdata->rtc)) {
274257 ret = PTR_ERR(pdata->rtc);
275258 goto out;
....@@ -285,7 +268,19 @@
285268 }
286269 }
287270
288
- return 0;
271
+ if (pdata->irq >= 0) {
272
+ device_init_wakeup(&pdev->dev, 1);
273
+ pdata->rtc->ops = &mv_rtc_alarm_ops;
274
+ } else {
275
+ pdata->rtc->ops = &mv_rtc_ops;
276
+ }
277
+
278
+ pdata->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
279
+ pdata->rtc->range_max = RTC_TIMESTAMP_END_2099;
280
+
281
+ ret = rtc_register_device(pdata->rtc);
282
+ if (!ret)
283
+ return 0;
289284 out:
290285 if (!IS_ERR(pdata->clk))
291286 clk_disable_unprepare(pdata->clk);