hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/rtc/rtc-coh901331.c
....@@ -1,6 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * Copyright (C) 2007-2009 ST-Ericsson AB
3
- * License terms: GNU General Public License (GPL) version 2
44 * Real Time Clock interface for ST-Ericsson AB COH 901 331 RTC.
55 * Author: Linus Walleij <linus.walleij@stericsson.com>
66 * Based on rtc-pl031.c by Deepak Saxena <dsaxena@plexity.net>
....@@ -80,21 +80,22 @@
8080
8181 clk_enable(rtap->clk);
8282 /* Check if the time is valid */
83
- if (readl(rtap->virtbase + COH901331_VALID)) {
84
- rtc_time_to_tm(readl(rtap->virtbase + COH901331_CUR_TIME), tm);
83
+ if (!readl(rtap->virtbase + COH901331_VALID)) {
8584 clk_disable(rtap->clk);
86
- return 0;
85
+ return -EINVAL;
8786 }
87
+
88
+ rtc_time64_to_tm(readl(rtap->virtbase + COH901331_CUR_TIME), tm);
8889 clk_disable(rtap->clk);
89
- return -EINVAL;
90
+ return 0;
9091 }
9192
92
-static int coh901331_set_mmss(struct device *dev, unsigned long secs)
93
+static int coh901331_set_time(struct device *dev, struct rtc_time *tm)
9394 {
9495 struct coh901331_port *rtap = dev_get_drvdata(dev);
9596
9697 clk_enable(rtap->clk);
97
- writel(secs, rtap->virtbase + COH901331_SET_TIME);
98
+ writel(rtc_tm_to_time64(tm), rtap->virtbase + COH901331_SET_TIME);
9899 clk_disable(rtap->clk);
99100
100101 return 0;
....@@ -105,7 +106,7 @@
105106 struct coh901331_port *rtap = dev_get_drvdata(dev);
106107
107108 clk_enable(rtap->clk);
108
- rtc_time_to_tm(readl(rtap->virtbase + COH901331_ALARM), &alarm->time);
109
+ rtc_time64_to_tm(readl(rtap->virtbase + COH901331_ALARM), &alarm->time);
109110 alarm->pending = readl(rtap->virtbase + COH901331_IRQ_EVENT) & 1U;
110111 alarm->enabled = readl(rtap->virtbase + COH901331_IRQ_MASK) & 1U;
111112 clk_disable(rtap->clk);
....@@ -116,9 +117,8 @@
116117 static int coh901331_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
117118 {
118119 struct coh901331_port *rtap = dev_get_drvdata(dev);
119
- unsigned long time;
120
+ unsigned long time = rtc_tm_to_time64(&alarm->time);
120121
121
- rtc_tm_to_time(&alarm->time, &time);
122122 clk_enable(rtap->clk);
123123 writel(time, rtap->virtbase + COH901331_ALARM);
124124 writel(alarm->enabled, rtap->virtbase + COH901331_IRQ_MASK);
....@@ -143,7 +143,7 @@
143143
144144 static const struct rtc_class_ops coh901331_ops = {
145145 .read_time = coh901331_read_time,
146
- .set_mmss = coh901331_set_mmss,
146
+ .set_time = coh901331_set_time,
147147 .read_alarm = coh901331_read_alarm,
148148 .set_alarm = coh901331_set_alarm,
149149 .alarm_irq_enable = coh901331_alarm_irq_enable,
....@@ -164,15 +164,13 @@
164164 {
165165 int ret;
166166 struct coh901331_port *rtap;
167
- struct resource *res;
168167
169168 rtap = devm_kzalloc(&pdev->dev,
170169 sizeof(struct coh901331_port), GFP_KERNEL);
171170 if (!rtap)
172171 return -ENOMEM;
173172
174
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
175
- rtap->virtbase = devm_ioremap_resource(&pdev->dev, res);
173
+ rtap->virtbase = devm_platform_ioremap_resource(pdev, 0);
176174 if (IS_ERR(rtap->virtbase))
177175 return PTR_ERR(rtap->virtbase);
178176
....@@ -188,6 +186,13 @@
188186 return ret;
189187 }
190188
189
+ rtap->rtc = devm_rtc_allocate_device(&pdev->dev);
190
+ if (IS_ERR(rtap->rtc))
191
+ return PTR_ERR(rtap->rtc);
192
+
193
+ rtap->rtc->ops = &coh901331_ops;
194
+ rtap->rtc->range_max = U32_MAX;
195
+
191196 /* We enable/disable the clock only to assure it works */
192197 ret = clk_prepare_enable(rtap->clk);
193198 if (ret) {
....@@ -197,12 +202,10 @@
197202 clk_disable(rtap->clk);
198203
199204 platform_set_drvdata(pdev, rtap);
200
- rtap->rtc = devm_rtc_device_register(&pdev->dev, "coh901331",
201
- &coh901331_ops, THIS_MODULE);
202
- if (IS_ERR(rtap->rtc)) {
203
- ret = PTR_ERR(rtap->rtc);
205
+
206
+ ret = rtc_register_device(rtap->rtc);
207
+ if (ret)
204208 goto out_no_rtc;
205
- }
206209
207210 return 0;
208211
....@@ -235,9 +238,13 @@
235238
236239 static int coh901331_resume(struct device *dev)
237240 {
241
+ int ret;
238242 struct coh901331_port *rtap = dev_get_drvdata(dev);
239243
240
- clk_prepare(rtap->clk);
244
+ ret = clk_prepare(rtap->clk);
245
+ if (ret)
246
+ return ret;
247
+
241248 if (device_may_wakeup(dev)) {
242249 disable_irq_wake(rtap->irq);
243250 } else {