hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/rtc/rtc-pm8xxx.c
....@@ -1,13 +1,5 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
2
- *
3
- * This program is free software; you can redistribute it and/or modify
4
- * it under the terms of the GNU General Public License version 2 and
5
- * only version 2 as published by the Free Software Foundation.
6
- *
7
- * This program is distributed in the hope that it will be useful,
8
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
- * GNU General Public License for more details.
113 */
124 #include <linux/of.h>
135 #include <linux/module.h>
....@@ -57,7 +49,7 @@
5749 * @regmap: regmap used to access RTC registers
5850 * @allow_set_time: indicates whether writing to the RTC is allowed
5951 * @rtc_alarm_irq: rtc alarm irq number.
60
- * @ctrl_reg: rtc control register.
52
+ * @regs: rtc registers description.
6153 * @rtc_dev: device structure.
6254 * @ctrl_reg_lock: spinlock protecting access to ctrl_reg.
6355 */
....@@ -92,7 +84,7 @@
9284 if (!rtc_dd->allow_set_time)
9385 return -EACCES;
9486
95
- rtc_tm_to_time(tm, &secs);
87
+ secs = rtc_tm_to_time64(tm);
9688
9789 dev_dbg(dev, "Seconds value to be written to RTC = %lu\n", secs);
9890
....@@ -216,11 +208,9 @@
216208 secs = value[0] | (value[1] << 8) | (value[2] << 16) |
217209 ((unsigned long)value[3] << 24);
218210
219
- rtc_time_to_tm(secs, tm);
211
+ rtc_time64_to_tm(secs, tm);
220212
221
- dev_dbg(dev, "secs = %lu, h:m:s == %d:%d:%d, d/m/y = %d/%d/%d\n",
222
- secs, tm->tm_hour, tm->tm_min, tm->tm_sec,
223
- tm->tm_mday, tm->tm_mon, tm->tm_year);
213
+ dev_dbg(dev, "secs = %lu, h:m:s == %ptRt, y-m-d = %ptRdr\n", secs, tm, tm);
224214
225215 return 0;
226216 }
....@@ -229,17 +219,21 @@
229219 {
230220 int rc, i;
231221 u8 value[NUM_8_BIT_RTC_REGS];
232
- unsigned int ctrl_reg;
233222 unsigned long secs, irq_flags;
234223 struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
235224 const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
236225
237
- rtc_tm_to_time(&alarm->time, &secs);
226
+ secs = rtc_tm_to_time64(&alarm->time);
238227
239228 for (i = 0; i < NUM_8_BIT_RTC_REGS; i++) {
240229 value[i] = secs & 0xFF;
241230 secs >>= 8;
242231 }
232
+
233
+ rc = regmap_update_bits(rtc_dd->regmap, regs->alarm_ctrl,
234
+ regs->alarm_en, 0);
235
+ if (rc)
236
+ return rc;
243237
244238 spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
245239
....@@ -250,25 +244,15 @@
250244 goto rtc_rw_fail;
251245 }
252246
253
- rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg);
254
- if (rc)
255
- goto rtc_rw_fail;
256
-
257
- if (alarm->enabled)
258
- ctrl_reg |= regs->alarm_en;
259
- else
260
- ctrl_reg &= ~regs->alarm_en;
261
-
262
- rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg);
263
- if (rc) {
264
- dev_err(dev, "Write to RTC alarm control register failed\n");
265
- goto rtc_rw_fail;
247
+ if (alarm->enabled) {
248
+ rc = regmap_update_bits(rtc_dd->regmap, regs->alarm_ctrl,
249
+ regs->alarm_en, regs->alarm_en);
250
+ if (rc)
251
+ goto rtc_rw_fail;
266252 }
267253
268
- dev_dbg(dev, "Alarm Set for h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n",
269
- alarm->time.tm_hour, alarm->time.tm_min,
270
- alarm->time.tm_sec, alarm->time.tm_mday,
271
- alarm->time.tm_mon, alarm->time.tm_year);
254
+ dev_dbg(dev, "Alarm Set for h:m:s=%ptRt, y-m-d=%ptRdr\n",
255
+ &alarm->time, &alarm->time);
272256 rtc_rw_fail:
273257 spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
274258 return rc;
....@@ -292,18 +276,10 @@
292276 secs = value[0] | (value[1] << 8) | (value[2] << 16) |
293277 ((unsigned long)value[3] << 24);
294278
295
- rtc_time_to_tm(secs, &alarm->time);
279
+ rtc_time64_to_tm(secs, &alarm->time);
296280
297
- rc = rtc_valid_tm(&alarm->time);
298
- if (rc < 0) {
299
- dev_err(dev, "Invalid alarm time read from RTC\n");
300
- return rc;
301
- }
302
-
303
- dev_dbg(dev, "Alarm set for - h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n",
304
- alarm->time.tm_hour, alarm->time.tm_min,
305
- alarm->time.tm_sec, alarm->time.tm_mday,
306
- alarm->time.tm_mon, alarm->time.tm_year);
281
+ dev_dbg(dev, "Alarm set for - h:m:s=%ptRt, y-m-d=%ptRdr\n",
282
+ &alarm->time, &alarm->time);
307283
308284 return 0;
309285 }
....@@ -315,6 +291,7 @@
315291 struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
316292 const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
317293 unsigned int ctrl_reg;
294
+ u8 value[NUM_8_BIT_RTC_REGS] = {0};
318295
319296 spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
320297
....@@ -331,6 +308,16 @@
331308 if (rc) {
332309 dev_err(dev, "Write to RTC control register failed\n");
333310 goto rtc_rw_fail;
311
+ }
312
+
313
+ /* Clear Alarm register */
314
+ if (!enable) {
315
+ rc = regmap_bulk_write(rtc_dd->regmap, regs->alarm_rw, value,
316
+ sizeof(value));
317
+ if (rc) {
318
+ dev_err(dev, "Clear RTC ALARM register failed\n");
319
+ goto rtc_rw_fail;
320
+ }
334321 }
335322
336323 rtc_rw_fail:
....@@ -482,10 +469,8 @@
482469 }
483470
484471 rtc_dd->rtc_alarm_irq = platform_get_irq(pdev, 0);
485
- if (rtc_dd->rtc_alarm_irq < 0) {
486
- dev_err(&pdev->dev, "Alarm IRQ resource absent!\n");
472
+ if (rtc_dd->rtc_alarm_irq < 0)
487473 return -ENXIO;
488
- }
489474
490475 rtc_dd->allow_set_time = of_property_read_bool(pdev->dev.of_node,
491476 "allow-set-time");
....@@ -502,13 +487,12 @@
502487 device_init_wakeup(&pdev->dev, 1);
503488
504489 /* Register the RTC device */
505
- rtc_dd->rtc = devm_rtc_device_register(&pdev->dev, "pm8xxx_rtc",
506
- &pm8xxx_rtc_ops, THIS_MODULE);
507
- if (IS_ERR(rtc_dd->rtc)) {
508
- dev_err(&pdev->dev, "%s: RTC registration failed (%ld)\n",
509
- __func__, PTR_ERR(rtc_dd->rtc));
490
+ rtc_dd->rtc = devm_rtc_allocate_device(&pdev->dev);
491
+ if (IS_ERR(rtc_dd->rtc))
510492 return PTR_ERR(rtc_dd->rtc);
511
- }
493
+
494
+ rtc_dd->rtc->ops = &pm8xxx_rtc_ops;
495
+ rtc_dd->rtc->range_max = U32_MAX;
512496
513497 /* Request the alarm IRQ */
514498 rc = devm_request_any_context_irq(&pdev->dev, rtc_dd->rtc_alarm_irq,
....@@ -520,9 +504,7 @@
520504 return rc;
521505 }
522506
523
- dev_dbg(&pdev->dev, "Probe success !!\n");
524
-
525
- return 0;
507
+ return rtc_register_device(rtc_dd->rtc);
526508 }
527509
528510 #ifdef CONFIG_PM_SLEEP