hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/rtc/rtc-rk808.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * RTC driver for Rockchip RK808
34 *
....@@ -5,15 +6,6 @@
56 *
67 * Author: Chris Zhong <zyw@rock-chips.com>
78 * Author: Zhang Qing <zhangqing@rock-chips.com>
8
- *
9
- * This program is free software; you can redistribute it and/or modify it
10
- * under the terms and conditions of the GNU General Public License,
11
- * version 2, as published by the Free Software Foundation.
12
- *
13
- * This program is distributed in the hope it will be useful, but WITHOUT
14
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16
- * more details.
179 */
1810
1911 #include <linux/module.h>
....@@ -36,6 +28,7 @@
3628 #define BIT_RTC_CTRL_REG_RTC_READSEL_M BIT(7)
3729 #define BIT_RTC_INTERRUPTS_REG_IT_ALARM_M BIT(3)
3830 #define RTC_STATUS_MASK 0xFE
31
+#define RTC_ALARM_STATUS BIT(6)
3932
4033 #define SECONDS_REG_MSK 0x7F
4134 #define MINUTES_REG_MAK 0x7F
....@@ -240,10 +233,8 @@
240233 return ret;
241234 }
242235
243
- dev_dbg(dev, "alrm read RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
244
- 1900 + alrm->time.tm_year, alrm->time.tm_mon + 1,
245
- alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour,
246
- alrm->time.tm_min, alrm->time.tm_sec);
236
+ dev_dbg(dev, "alrm read RTC date/time %ptRd(%d) %ptRt\n",
237
+ &alrm->time, alrm->time.tm_wday, &alrm->time);
247238
248239 alrm->enabled = (int_reg & BIT_RTC_INTERRUPTS_REG_IT_ALARM_M) ? 1 : 0;
249240
....@@ -258,6 +249,12 @@
258249 ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->int_reg,
259250 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M, 0);
260251
252
+ /*
253
+ * The rtc alarm status(BIT(6)) must be cleared after alarm 1s or
254
+ * after the alarm is disabled.
255
+ */
256
+ ret = regmap_write(rk808->regmap, rk808_rtc->creg->status_reg,
257
+ RTC_ALARM_STATUS);
261258 return ret;
262259 }
263260
....@@ -285,10 +282,8 @@
285282 dev_err(dev, "Failed to stop alarm: %d\n", ret);
286283 return ret;
287284 }
288
- dev_dbg(dev, "alrm set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
289
- 1900 + alrm->time.tm_year, alrm->time.tm_mon + 1,
290
- alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour,
291
- alrm->time.tm_min, alrm->time.tm_sec);
285
+ dev_dbg(dev, "alrm set RTC date/time %ptRd(%d) %ptRt\n",
286
+ &alrm->time, alrm->time.tm_wday, &alrm->time);
292287
293288 if (rk808_rtc->flag & RTC_NEED_TRANSITIONS)
294289 gregorian_to_rockchip(&alrm->time);
....@@ -371,8 +366,7 @@
371366 /* Turn off the alarm if it should not be a wake source. */
372367 static int rk808_rtc_suspend(struct device *dev)
373368 {
374
- struct platform_device *pdev = to_platform_device(dev);
375
- struct rk808_rtc *rk808_rtc = dev_get_drvdata(&pdev->dev);
369
+ struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev);
376370
377371 if (device_may_wakeup(dev))
378372 enable_irq_wake(rk808_rtc->irq);
....@@ -385,8 +379,7 @@
385379 */
386380 static int rk808_rtc_resume(struct device *dev)
387381 {
388
- struct platform_device *pdev = to_platform_device(dev);
389
- struct rk808_rtc *rk808_rtc = dev_get_drvdata(&pdev->dev);
382
+ struct rk808_rtc *rk808_rtc = dev_get_drvdata(dev);
390383
391384 if (device_may_wakeup(dev))
392385 disable_irq_wake(rk808_rtc->irq);
....@@ -477,7 +470,7 @@
477470 if (ret) {
478471 dev_err(&pdev->dev,
479472 "Failed to write RTC status: %d\n", ret);
480
- return ret;
473
+ return ret;
481474 }
482475
483476 device_init_wakeup(&pdev->dev, 1);
....@@ -489,12 +482,8 @@
489482 rk808_rtc->rtc->ops = &rk808_rtc_ops;
490483
491484 rk808_rtc->irq = platform_get_irq(pdev, 0);
492
- if (rk808_rtc->irq < 0) {
493
- if (rk808_rtc->irq != -EPROBE_DEFER)
494
- dev_err(&pdev->dev, "Wake up is not possible as irq = %d\n",
495
- rk808_rtc->irq);
485
+ if (rk808_rtc->irq < 0)
496486 return rk808_rtc->irq;
497
- }
498487
499488 /* request alarm irq of rk808 */
500489 ret = devm_request_threaded_irq(&pdev->dev, rk808_rtc->irq, NULL,