1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * An RTC driver for Allwinner A31/A23
5 * Copyright (c) 2014, Chen-Yu Tsai <wens@csie.org>
9 * An RTC driver for Allwinner A10/A20
11 * Copyright (c) 2013, Carlo Caione <carlo.caione@gmail.com>
14 #include <linux/clk.h>
15 #include <linux/clk-provider.h>
16 #include <linux/clk/sunxi-ng.h>
17 #include <linux/delay.h>
18 #include <linux/err.h>
20 #include <linux/init.h>
21 #include <linux/interrupt.h>
23 #include <linux/kernel.h>
24 #include <linux/module.h>
26 #include <linux/of_address.h>
27 #include <linux/platform_device.h>
28 #include <linux/rtc.h>
29 #include <linux/slab.h>
30 #include <linux/types.h>
32 /* Control register */
33 #define SUN6I_LOSC_CTRL 0x0000
34 #define SUN6I_LOSC_CTRL_KEY (0x16aa << 16)
35 #define SUN6I_LOSC_CTRL_AUTO_SWT_BYPASS BIT(15)
36 #define SUN6I_LOSC_CTRL_ALM_DHMS_ACC BIT(9)
37 #define SUN6I_LOSC_CTRL_RTC_HMS_ACC BIT(8)
38 #define SUN6I_LOSC_CTRL_RTC_YMD_ACC BIT(7)
39 #define SUN6I_LOSC_CTRL_EXT_LOSC_EN BIT(4)
40 #define SUN6I_LOSC_CTRL_EXT_OSC BIT(0)
41 #define SUN6I_LOSC_CTRL_ACC_MASK GENMASK(9, 7)
43 #define SUN6I_LOSC_CLK_PRESCAL 0x0008
46 #define SUN6I_RTC_YMD 0x0010
47 #define SUN6I_RTC_HMS 0x0014
49 /* Alarm 0 (counter) */
50 #define SUN6I_ALRM_COUNTER 0x0020
51 /* This holds the remaining alarm seconds on older SoCs (current value) */
52 #define SUN6I_ALRM_COUNTER_HMS 0x0024
53 #define SUN6I_ALRM_EN 0x0028
54 #define SUN6I_ALRM_EN_CNT_EN BIT(0)
55 #define SUN6I_ALRM_IRQ_EN 0x002c
56 #define SUN6I_ALRM_IRQ_EN_CNT_IRQ_EN BIT(0)
57 #define SUN6I_ALRM_IRQ_STA 0x0030
58 #define SUN6I_ALRM_IRQ_STA_CNT_IRQ_PEND BIT(0)
60 /* Alarm 1 (wall clock) */
61 #define SUN6I_ALRM1_EN 0x0044
62 #define SUN6I_ALRM1_IRQ_EN 0x0048
63 #define SUN6I_ALRM1_IRQ_STA 0x004c
64 #define SUN6I_ALRM1_IRQ_STA_WEEK_IRQ_PEND BIT(0)
67 #define SUN6I_ALARM_CONFIG 0x0050
68 #define SUN6I_ALARM_CONFIG_WAKEUP BIT(0)
70 #define SUN6I_LOSC_OUT_GATING 0x0060
71 #define SUN6I_LOSC_OUT_GATING_EN_OFFSET 0
73 /* General-purpose data */
74 #define SUN6I_GP_DATA 0x0100
75 #define SUN6I_GP_DATA_SIZE 0x20
80 #define SUN6I_DATE_GET_DAY_VALUE(x) ((x) & 0x0000001f)
81 #define SUN6I_DATE_GET_MON_VALUE(x) (((x) & 0x00000f00) >> 8)
82 #define SUN6I_DATE_GET_YEAR_VALUE(x) (((x) & 0x003f0000) >> 16)
83 #define SUN6I_LEAP_GET_VALUE(x) (((x) & 0x00400000) >> 22)
88 #define SUN6I_TIME_GET_SEC_VALUE(x) ((x) & 0x0000003f)
89 #define SUN6I_TIME_GET_MIN_VALUE(x) (((x) & 0x00003f00) >> 8)
90 #define SUN6I_TIME_GET_HOUR_VALUE(x) (((x) & 0x001f0000) >> 16)
95 #define SUN6I_DATE_SET_DAY_VALUE(x) ((x) & 0x0000001f)
96 #define SUN6I_DATE_SET_MON_VALUE(x) ((x) << 8 & 0x00000f00)
97 #define SUN6I_DATE_SET_YEAR_VALUE(x) ((x) << 16 & 0x003f0000)
98 #define SUN6I_LEAP_SET_VALUE(x) ((x) << 22 & 0x00400000)
103 #define SUN6I_TIME_SET_SEC_VALUE(x) ((x) & 0x0000003f)
104 #define SUN6I_TIME_SET_MIN_VALUE(x) ((x) << 8 & 0x00003f00)
105 #define SUN6I_TIME_SET_HOUR_VALUE(x) ((x) << 16 & 0x001f0000)
108 * The year parameter passed to the driver is usually an offset relative to
109 * the year 1900. This macro is used to convert this offset to another one
110 * relative to the minimum year allowed by the hardware.
112 * The year range is 1970 - 2033. This range is selected to match Allwinner's
113 * driver, even though it is somewhat limited.
115 #define SUN6I_YEAR_MIN 1970
116 #define SUN6I_YEAR_OFF (SUN6I_YEAR_MIN - 1900)
118 #define SECS_PER_DAY (24 * 3600ULL)
121 * There are other differences between models, including:
123 * - number of GPIO pins that can be configured to hold a certain level
124 * - crypto-key related registers (H5, H6)
125 * - boot process related (super standby, secondary processor entry address)
126 * registers (R40, H6)
127 * - SYS power domain controls (R40)
128 * - DCXO controls (H6)
129 * - RC oscillator calibration (H6)
131 * These functions are not covered by this driver.
133 struct sun6i_rtc_clk_data
{
134 unsigned long rc_osc_rate
;
135 unsigned int fixed_prescaler
: 16;
136 unsigned int has_prescaler
: 1;
137 unsigned int has_out_clk
: 1;
138 unsigned int has_losc_en
: 1;
139 unsigned int has_auto_swt
: 1;
142 #define RTC_LINEAR_DAY BIT(0)
144 struct sun6i_rtc_dev
{
145 struct rtc_device
*rtc
;
146 const struct sun6i_rtc_clk_data
*data
;
153 struct clk_hw
*int_osc
;
155 struct clk
*ext_losc
;
160 static struct sun6i_rtc_dev
*sun6i_rtc
;
162 static unsigned long sun6i_rtc_osc_recalc_rate(struct clk_hw
*hw
,
163 unsigned long parent_rate
)
165 struct sun6i_rtc_dev
*rtc
= container_of(hw
, struct sun6i_rtc_dev
, hw
);
168 val
= readl(rtc
->base
+ SUN6I_LOSC_CTRL
);
169 if (val
& SUN6I_LOSC_CTRL_EXT_OSC
)
172 if (rtc
->data
->fixed_prescaler
)
173 parent_rate
/= rtc
->data
->fixed_prescaler
;
175 if (rtc
->data
->has_prescaler
) {
176 val
= readl(rtc
->base
+ SUN6I_LOSC_CLK_PRESCAL
);
177 val
&= GENMASK(4, 0);
180 return parent_rate
/ (val
+ 1);
183 static u8
sun6i_rtc_osc_get_parent(struct clk_hw
*hw
)
185 struct sun6i_rtc_dev
*rtc
= container_of(hw
, struct sun6i_rtc_dev
, hw
);
187 return readl(rtc
->base
+ SUN6I_LOSC_CTRL
) & SUN6I_LOSC_CTRL_EXT_OSC
;
190 static int sun6i_rtc_osc_set_parent(struct clk_hw
*hw
, u8 index
)
192 struct sun6i_rtc_dev
*rtc
= container_of(hw
, struct sun6i_rtc_dev
, hw
);
199 spin_lock_irqsave(&rtc
->lock
, flags
);
200 val
= readl(rtc
->base
+ SUN6I_LOSC_CTRL
);
201 val
&= ~SUN6I_LOSC_CTRL_EXT_OSC
;
202 val
|= SUN6I_LOSC_CTRL_KEY
;
203 val
|= index
? SUN6I_LOSC_CTRL_EXT_OSC
: 0;
204 if (rtc
->data
->has_losc_en
) {
205 val
&= ~SUN6I_LOSC_CTRL_EXT_LOSC_EN
;
206 val
|= index
? SUN6I_LOSC_CTRL_EXT_LOSC_EN
: 0;
208 writel(val
, rtc
->base
+ SUN6I_LOSC_CTRL
);
209 spin_unlock_irqrestore(&rtc
->lock
, flags
);
214 static const struct clk_ops sun6i_rtc_osc_ops
= {
215 .recalc_rate
= sun6i_rtc_osc_recalc_rate
,
216 .determine_rate
= clk_hw_determine_rate_no_reparent
,
218 .get_parent
= sun6i_rtc_osc_get_parent
,
219 .set_parent
= sun6i_rtc_osc_set_parent
,
222 static void __init
sun6i_rtc_clk_init(struct device_node
*node
,
223 const struct sun6i_rtc_clk_data
*data
)
225 struct clk_hw_onecell_data
*clk_data
;
226 struct sun6i_rtc_dev
*rtc
;
227 struct clk_init_data init
= {
228 .ops
= &sun6i_rtc_osc_ops
,
231 const char *iosc_name
= "rtc-int-osc";
232 const char *clkout_name
= "osc32k-out";
233 const char *parents
[2];
236 rtc
= kzalloc(sizeof(*rtc
), GFP_KERNEL
);
241 clk_data
= kzalloc(struct_size(clk_data
, hws
, 3), GFP_KERNEL
);
247 spin_lock_init(&rtc
->lock
);
249 rtc
->base
= of_io_request_and_map(node
, 0, of_node_full_name(node
));
250 if (IS_ERR(rtc
->base
)) {
251 pr_crit("Can't map RTC registers");
255 reg
= SUN6I_LOSC_CTRL_KEY
;
256 if (rtc
->data
->has_auto_swt
) {
257 /* Bypass auto-switch to int osc, on ext losc failure */
258 reg
|= SUN6I_LOSC_CTRL_AUTO_SWT_BYPASS
;
259 writel(reg
, rtc
->base
+ SUN6I_LOSC_CTRL
);
262 /* Switch to the external, more precise, oscillator, if present */
263 if (of_property_present(node
, "clocks")) {
264 reg
|= SUN6I_LOSC_CTRL_EXT_OSC
;
265 if (rtc
->data
->has_losc_en
)
266 reg
|= SUN6I_LOSC_CTRL_EXT_LOSC_EN
;
268 writel(reg
, rtc
->base
+ SUN6I_LOSC_CTRL
);
270 /* Yes, I know, this is ugly. */
273 of_property_read_string_index(node
, "clock-output-names", 2,
276 rtc
->int_osc
= clk_hw_register_fixed_rate_with_accuracy(NULL
,
279 rtc
->data
->rc_osc_rate
,
281 if (IS_ERR(rtc
->int_osc
)) {
282 pr_crit("Couldn't register the internal oscillator\n");
286 parents
[0] = clk_hw_get_name(rtc
->int_osc
);
287 /* If there is no external oscillator, this will be NULL and ... */
288 parents
[1] = of_clk_get_parent_name(node
, 0);
290 rtc
->hw
.init
= &init
;
292 init
.parent_names
= parents
;
293 /* ... number of clock parents will be 1. */
294 init
.num_parents
= of_clk_get_parent_count(node
) + 1;
295 of_property_read_string_index(node
, "clock-output-names", 0,
298 rtc
->losc
= clk_register(NULL
, &rtc
->hw
);
299 if (IS_ERR(rtc
->losc
)) {
300 pr_crit("Couldn't register the LOSC clock\n");
304 of_property_read_string_index(node
, "clock-output-names", 1,
306 rtc
->ext_losc
= clk_register_gate(NULL
, clkout_name
, init
.name
,
307 0, rtc
->base
+ SUN6I_LOSC_OUT_GATING
,
308 SUN6I_LOSC_OUT_GATING_EN_OFFSET
, 0,
310 if (IS_ERR(rtc
->ext_losc
)) {
311 pr_crit("Couldn't register the LOSC external gate\n");
316 clk_data
->hws
[0] = &rtc
->hw
;
317 clk_data
->hws
[1] = __clk_get_hw(rtc
->ext_losc
);
318 clk_data
->hws
[2] = rtc
->int_osc
;
319 of_clk_add_hw_provider(node
, of_clk_hw_onecell_get
, clk_data
);
323 clk_hw_unregister_fixed_rate(rtc
->int_osc
);
328 static const struct sun6i_rtc_clk_data sun6i_a31_rtc_data
= {
329 .rc_osc_rate
= 667000, /* datasheet says 600 ~ 700 KHz */
333 static void __init
sun6i_a31_rtc_clk_init(struct device_node
*node
)
335 sun6i_rtc_clk_init(node
, &sun6i_a31_rtc_data
);
337 CLK_OF_DECLARE_DRIVER(sun6i_a31_rtc_clk
, "allwinner,sun6i-a31-rtc",
338 sun6i_a31_rtc_clk_init
);
340 static const struct sun6i_rtc_clk_data sun8i_a23_rtc_data
= {
341 .rc_osc_rate
= 667000, /* datasheet says 600 ~ 700 KHz */
346 static void __init
sun8i_a23_rtc_clk_init(struct device_node
*node
)
348 sun6i_rtc_clk_init(node
, &sun8i_a23_rtc_data
);
350 CLK_OF_DECLARE_DRIVER(sun8i_a23_rtc_clk
, "allwinner,sun8i-a23-rtc",
351 sun8i_a23_rtc_clk_init
);
353 static const struct sun6i_rtc_clk_data sun8i_h3_rtc_data
= {
354 .rc_osc_rate
= 16000000,
355 .fixed_prescaler
= 32,
360 static void __init
sun8i_h3_rtc_clk_init(struct device_node
*node
)
362 sun6i_rtc_clk_init(node
, &sun8i_h3_rtc_data
);
364 CLK_OF_DECLARE_DRIVER(sun8i_h3_rtc_clk
, "allwinner,sun8i-h3-rtc",
365 sun8i_h3_rtc_clk_init
);
366 /* As far as we are concerned, clocks for H5 are the same as H3 */
367 CLK_OF_DECLARE_DRIVER(sun50i_h5_rtc_clk
, "allwinner,sun50i-h5-rtc",
368 sun8i_h3_rtc_clk_init
);
370 static const struct sun6i_rtc_clk_data sun50i_h6_rtc_data
= {
371 .rc_osc_rate
= 16000000,
372 .fixed_prescaler
= 32,
379 static void __init
sun50i_h6_rtc_clk_init(struct device_node
*node
)
381 sun6i_rtc_clk_init(node
, &sun50i_h6_rtc_data
);
383 CLK_OF_DECLARE_DRIVER(sun50i_h6_rtc_clk
, "allwinner,sun50i-h6-rtc",
384 sun50i_h6_rtc_clk_init
);
387 * The R40 user manual is self-conflicting on whether the prescaler is
388 * fixed or configurable. The clock diagram shows it as fixed, but there
389 * is also a configurable divider in the RTC block.
391 static const struct sun6i_rtc_clk_data sun8i_r40_rtc_data
= {
392 .rc_osc_rate
= 16000000,
393 .fixed_prescaler
= 512,
395 static void __init
sun8i_r40_rtc_clk_init(struct device_node
*node
)
397 sun6i_rtc_clk_init(node
, &sun8i_r40_rtc_data
);
399 CLK_OF_DECLARE_DRIVER(sun8i_r40_rtc_clk
, "allwinner,sun8i-r40-rtc",
400 sun8i_r40_rtc_clk_init
);
402 static const struct sun6i_rtc_clk_data sun8i_v3_rtc_data
= {
403 .rc_osc_rate
= 32000,
408 static void __init
sun8i_v3_rtc_clk_init(struct device_node
*node
)
410 sun6i_rtc_clk_init(node
, &sun8i_v3_rtc_data
);
412 CLK_OF_DECLARE_DRIVER(sun8i_v3_rtc_clk
, "allwinner,sun8i-v3-rtc",
413 sun8i_v3_rtc_clk_init
);
415 static irqreturn_t
sun6i_rtc_alarmirq(int irq
, void *id
)
417 struct sun6i_rtc_dev
*chip
= (struct sun6i_rtc_dev
*) id
;
418 irqreturn_t ret
= IRQ_NONE
;
421 spin_lock(&chip
->lock
);
422 val
= readl(chip
->base
+ SUN6I_ALRM_IRQ_STA
);
424 if (val
& SUN6I_ALRM_IRQ_STA_CNT_IRQ_PEND
) {
425 val
|= SUN6I_ALRM_IRQ_STA_CNT_IRQ_PEND
;
426 writel(val
, chip
->base
+ SUN6I_ALRM_IRQ_STA
);
428 rtc_update_irq(chip
->rtc
, 1, RTC_AF
| RTC_IRQF
);
432 spin_unlock(&chip
->lock
);
437 static void sun6i_rtc_setaie(int to
, struct sun6i_rtc_dev
*chip
)
440 u32 alrm_irq_val
= 0;
441 u32 alrm_wake_val
= 0;
445 alrm_val
= SUN6I_ALRM_EN_CNT_EN
;
446 alrm_irq_val
= SUN6I_ALRM_IRQ_EN_CNT_IRQ_EN
;
447 alrm_wake_val
= SUN6I_ALARM_CONFIG_WAKEUP
;
449 writel(SUN6I_ALRM_IRQ_STA_CNT_IRQ_PEND
,
450 chip
->base
+ SUN6I_ALRM_IRQ_STA
);
453 spin_lock_irqsave(&chip
->lock
, flags
);
454 writel(alrm_val
, chip
->base
+ SUN6I_ALRM_EN
);
455 writel(alrm_irq_val
, chip
->base
+ SUN6I_ALRM_IRQ_EN
);
456 writel(alrm_wake_val
, chip
->base
+ SUN6I_ALARM_CONFIG
);
457 spin_unlock_irqrestore(&chip
->lock
, flags
);
460 static int sun6i_rtc_gettime(struct device
*dev
, struct rtc_time
*rtc_tm
)
462 struct sun6i_rtc_dev
*chip
= dev_get_drvdata(dev
);
466 * read again in case it changes
469 date
= readl(chip
->base
+ SUN6I_RTC_YMD
);
470 time
= readl(chip
->base
+ SUN6I_RTC_HMS
);
471 } while ((date
!= readl(chip
->base
+ SUN6I_RTC_YMD
)) ||
472 (time
!= readl(chip
->base
+ SUN6I_RTC_HMS
)));
474 if (chip
->flags
& RTC_LINEAR_DAY
) {
476 * Newer chips store a linear day number, the manual
477 * does not mandate any epoch base. The BSP driver uses
478 * the UNIX epoch, let's just copy that, as it's the
481 rtc_time64_to_tm((date
& 0xffff) * SECS_PER_DAY
, rtc_tm
);
483 rtc_tm
->tm_mday
= SUN6I_DATE_GET_DAY_VALUE(date
);
484 rtc_tm
->tm_mon
= SUN6I_DATE_GET_MON_VALUE(date
) - 1;
485 rtc_tm
->tm_year
= SUN6I_DATE_GET_YEAR_VALUE(date
);
488 * switch from (data_year->min)-relative offset to
489 * a (1900)-relative one
491 rtc_tm
->tm_year
+= SUN6I_YEAR_OFF
;
494 rtc_tm
->tm_sec
= SUN6I_TIME_GET_SEC_VALUE(time
);
495 rtc_tm
->tm_min
= SUN6I_TIME_GET_MIN_VALUE(time
);
496 rtc_tm
->tm_hour
= SUN6I_TIME_GET_HOUR_VALUE(time
);
501 static int sun6i_rtc_getalarm(struct device
*dev
, struct rtc_wkalrm
*wkalrm
)
503 struct sun6i_rtc_dev
*chip
= dev_get_drvdata(dev
);
508 spin_lock_irqsave(&chip
->lock
, flags
);
509 alrm_en
= readl(chip
->base
+ SUN6I_ALRM_IRQ_EN
);
510 alrm_st
= readl(chip
->base
+ SUN6I_ALRM_IRQ_STA
);
511 spin_unlock_irqrestore(&chip
->lock
, flags
);
513 wkalrm
->enabled
= !!(alrm_en
& SUN6I_ALRM_EN_CNT_EN
);
514 wkalrm
->pending
= !!(alrm_st
& SUN6I_ALRM_EN_CNT_EN
);
515 rtc_time64_to_tm(chip
->alarm
, &wkalrm
->time
);
520 static int sun6i_rtc_setalarm(struct device
*dev
, struct rtc_wkalrm
*wkalrm
)
522 struct sun6i_rtc_dev
*chip
= dev_get_drvdata(dev
);
523 struct rtc_time
*alrm_tm
= &wkalrm
->time
;
524 struct rtc_time tm_now
;
526 u32 counter_val
, counter_val_hms
;
529 time_set
= rtc_tm_to_time64(alrm_tm
);
531 if (chip
->flags
& RTC_LINEAR_DAY
) {
533 * The alarm registers hold the actual alarm time, encoded
534 * in the same way (linear day + HMS) as the current time.
536 counter_val_hms
= SUN6I_TIME_SET_SEC_VALUE(alrm_tm
->tm_sec
) |
537 SUN6I_TIME_SET_MIN_VALUE(alrm_tm
->tm_min
) |
538 SUN6I_TIME_SET_HOUR_VALUE(alrm_tm
->tm_hour
);
539 /* The division will cut off the H:M:S part of alrm_tm. */
540 counter_val
= div_u64(rtc_tm_to_time64(alrm_tm
), SECS_PER_DAY
);
542 /* The alarm register holds the number of seconds left. */
545 ret
= sun6i_rtc_gettime(dev
, &tm_now
);
547 dev_err(dev
, "Error in getting time\n");
551 time_now
= rtc_tm_to_time64(&tm_now
);
552 if (time_set
<= time_now
) {
553 dev_err(dev
, "Date to set in the past\n");
556 if ((time_set
- time_now
) > U32_MAX
) {
557 dev_err(dev
, "Date too far in the future\n");
561 counter_val
= time_set
- time_now
;
564 sun6i_rtc_setaie(0, chip
);
565 writel(0, chip
->base
+ SUN6I_ALRM_COUNTER
);
566 if (chip
->flags
& RTC_LINEAR_DAY
)
567 writel(0, chip
->base
+ SUN6I_ALRM_COUNTER_HMS
);
568 usleep_range(100, 300);
570 writel(counter_val
, chip
->base
+ SUN6I_ALRM_COUNTER
);
571 if (chip
->flags
& RTC_LINEAR_DAY
)
572 writel(counter_val_hms
, chip
->base
+ SUN6I_ALRM_COUNTER_HMS
);
573 chip
->alarm
= time_set
;
575 sun6i_rtc_setaie(wkalrm
->enabled
, chip
);
580 static int sun6i_rtc_wait(struct sun6i_rtc_dev
*chip
, int offset
,
581 unsigned int mask
, unsigned int ms_timeout
)
583 const unsigned long timeout
= jiffies
+ msecs_to_jiffies(ms_timeout
);
587 reg
= readl(chip
->base
+ offset
);
593 } while (time_before(jiffies
, timeout
));
598 static int sun6i_rtc_settime(struct device
*dev
, struct rtc_time
*rtc_tm
)
600 struct sun6i_rtc_dev
*chip
= dev_get_drvdata(dev
);
604 time
= SUN6I_TIME_SET_SEC_VALUE(rtc_tm
->tm_sec
) |
605 SUN6I_TIME_SET_MIN_VALUE(rtc_tm
->tm_min
) |
606 SUN6I_TIME_SET_HOUR_VALUE(rtc_tm
->tm_hour
);
608 if (chip
->flags
& RTC_LINEAR_DAY
) {
609 /* The division will cut off the H:M:S part of rtc_tm. */
610 date
= div_u64(rtc_tm_to_time64(rtc_tm
), SECS_PER_DAY
);
612 rtc_tm
->tm_year
-= SUN6I_YEAR_OFF
;
615 date
= SUN6I_DATE_SET_DAY_VALUE(rtc_tm
->tm_mday
) |
616 SUN6I_DATE_SET_MON_VALUE(rtc_tm
->tm_mon
) |
617 SUN6I_DATE_SET_YEAR_VALUE(rtc_tm
->tm_year
);
619 if (is_leap_year(rtc_tm
->tm_year
+ SUN6I_YEAR_MIN
))
620 date
|= SUN6I_LEAP_SET_VALUE(1);
623 /* Check whether registers are writable */
624 if (sun6i_rtc_wait(chip
, SUN6I_LOSC_CTRL
,
625 SUN6I_LOSC_CTRL_ACC_MASK
, 50)) {
626 dev_err(dev
, "rtc is still busy.\n");
630 writel(time
, chip
->base
+ SUN6I_RTC_HMS
);
633 * After writing the RTC HH-MM-SS register, the
634 * SUN6I_LOSC_CTRL_RTC_HMS_ACC bit is set and it will not
635 * be cleared until the real writing operation is finished
638 if (sun6i_rtc_wait(chip
, SUN6I_LOSC_CTRL
,
639 SUN6I_LOSC_CTRL_RTC_HMS_ACC
, 50)) {
640 dev_err(dev
, "Failed to set rtc time.\n");
644 writel(date
, chip
->base
+ SUN6I_RTC_YMD
);
647 * After writing the RTC YY-MM-DD register, the
648 * SUN6I_LOSC_CTRL_RTC_YMD_ACC bit is set and it will not
649 * be cleared until the real writing operation is finished
652 if (sun6i_rtc_wait(chip
, SUN6I_LOSC_CTRL
,
653 SUN6I_LOSC_CTRL_RTC_YMD_ACC
, 50)) {
654 dev_err(dev
, "Failed to set rtc time.\n");
661 static int sun6i_rtc_alarm_irq_enable(struct device
*dev
, unsigned int enabled
)
663 struct sun6i_rtc_dev
*chip
= dev_get_drvdata(dev
);
666 sun6i_rtc_setaie(enabled
, chip
);
671 static const struct rtc_class_ops sun6i_rtc_ops
= {
672 .read_time
= sun6i_rtc_gettime
,
673 .set_time
= sun6i_rtc_settime
,
674 .read_alarm
= sun6i_rtc_getalarm
,
675 .set_alarm
= sun6i_rtc_setalarm
,
676 .alarm_irq_enable
= sun6i_rtc_alarm_irq_enable
679 static int sun6i_rtc_nvmem_read(void *priv
, unsigned int offset
, void *_val
, size_t bytes
)
681 struct sun6i_rtc_dev
*chip
= priv
;
685 for (i
= 0; i
< bytes
/ 4; ++i
)
686 val
[i
] = readl(chip
->base
+ SUN6I_GP_DATA
+ offset
+ 4 * i
);
691 static int sun6i_rtc_nvmem_write(void *priv
, unsigned int offset
, void *_val
, size_t bytes
)
693 struct sun6i_rtc_dev
*chip
= priv
;
697 for (i
= 0; i
< bytes
/ 4; ++i
)
698 writel(val
[i
], chip
->base
+ SUN6I_GP_DATA
+ offset
+ 4 * i
);
703 static struct nvmem_config sun6i_rtc_nvmem_cfg
= {
704 .type
= NVMEM_TYPE_BATTERY_BACKED
,
705 .reg_read
= sun6i_rtc_nvmem_read
,
706 .reg_write
= sun6i_rtc_nvmem_write
,
707 .size
= SUN6I_GP_DATA_SIZE
,
712 #ifdef CONFIG_PM_SLEEP
713 /* Enable IRQ wake on suspend, to wake up from RTC. */
714 static int sun6i_rtc_suspend(struct device
*dev
)
716 struct sun6i_rtc_dev
*chip
= dev_get_drvdata(dev
);
718 if (device_may_wakeup(dev
))
719 enable_irq_wake(chip
->irq
);
724 /* Disable IRQ wake on resume. */
725 static int sun6i_rtc_resume(struct device
*dev
)
727 struct sun6i_rtc_dev
*chip
= dev_get_drvdata(dev
);
729 if (device_may_wakeup(dev
))
730 disable_irq_wake(chip
->irq
);
736 static SIMPLE_DEV_PM_OPS(sun6i_rtc_pm_ops
,
737 sun6i_rtc_suspend
, sun6i_rtc_resume
);
739 static void sun6i_rtc_bus_clk_cleanup(void *data
)
741 struct clk
*bus_clk
= data
;
743 clk_disable_unprepare(bus_clk
);
746 static int sun6i_rtc_probe(struct platform_device
*pdev
)
748 struct sun6i_rtc_dev
*chip
= sun6i_rtc
;
749 struct device
*dev
= &pdev
->dev
;
753 bus_clk
= devm_clk_get_optional(dev
, "bus");
755 return PTR_ERR(bus_clk
);
758 ret
= clk_prepare_enable(bus_clk
);
762 ret
= devm_add_action_or_reset(dev
, sun6i_rtc_bus_clk_cleanup
,
769 chip
= devm_kzalloc(&pdev
->dev
, sizeof(*chip
), GFP_KERNEL
);
773 spin_lock_init(&chip
->lock
);
775 chip
->base
= devm_platform_ioremap_resource(pdev
, 0);
776 if (IS_ERR(chip
->base
))
777 return PTR_ERR(chip
->base
);
779 if (IS_REACHABLE(CONFIG_SUN6I_RTC_CCU
)) {
780 ret
= sun6i_rtc_ccu_probe(dev
, chip
->base
);
786 platform_set_drvdata(pdev
, chip
);
788 chip
->flags
= (unsigned long)of_device_get_match_data(&pdev
->dev
);
790 chip
->irq
= platform_get_irq(pdev
, 0);
794 ret
= devm_request_irq(&pdev
->dev
, chip
->irq
, sun6i_rtc_alarmirq
,
795 0, dev_name(&pdev
->dev
), chip
);
797 dev_err(&pdev
->dev
, "Could not request IRQ\n");
801 /* clear the alarm counter value */
802 writel(0, chip
->base
+ SUN6I_ALRM_COUNTER
);
804 /* disable counter alarm */
805 writel(0, chip
->base
+ SUN6I_ALRM_EN
);
807 /* disable counter alarm interrupt */
808 writel(0, chip
->base
+ SUN6I_ALRM_IRQ_EN
);
810 /* disable week alarm */
811 writel(0, chip
->base
+ SUN6I_ALRM1_EN
);
813 /* disable week alarm interrupt */
814 writel(0, chip
->base
+ SUN6I_ALRM1_IRQ_EN
);
816 /* clear counter alarm pending interrupts */
817 writel(SUN6I_ALRM_IRQ_STA_CNT_IRQ_PEND
,
818 chip
->base
+ SUN6I_ALRM_IRQ_STA
);
820 /* clear week alarm pending interrupts */
821 writel(SUN6I_ALRM1_IRQ_STA_WEEK_IRQ_PEND
,
822 chip
->base
+ SUN6I_ALRM1_IRQ_STA
);
824 /* disable alarm wakeup */
825 writel(0, chip
->base
+ SUN6I_ALARM_CONFIG
);
827 clk_prepare_enable(chip
->losc
);
829 device_init_wakeup(&pdev
->dev
, 1);
831 chip
->rtc
= devm_rtc_allocate_device(&pdev
->dev
);
832 if (IS_ERR(chip
->rtc
))
833 return PTR_ERR(chip
->rtc
);
835 chip
->rtc
->ops
= &sun6i_rtc_ops
;
836 if (chip
->flags
& RTC_LINEAR_DAY
)
837 chip
->rtc
->range_max
= (65536 * SECS_PER_DAY
) - 1;
839 chip
->rtc
->range_max
= 2019686399LL; /* 2033-12-31 23:59:59 */
841 ret
= devm_rtc_register_device(chip
->rtc
);
845 sun6i_rtc_nvmem_cfg
.priv
= chip
;
846 ret
= devm_rtc_nvmem_register(chip
->rtc
, &sun6i_rtc_nvmem_cfg
);
854 * As far as RTC functionality goes, all models are the same. The
855 * datasheets claim that different models have different number of
856 * registers available for non-volatile storage, but experiments show
857 * that all SoCs have 16 registers available for this purpose.
859 static const struct of_device_id sun6i_rtc_dt_ids
[] = {
860 { .compatible
= "allwinner,sun6i-a31-rtc" },
861 { .compatible
= "allwinner,sun8i-a23-rtc" },
862 { .compatible
= "allwinner,sun8i-h3-rtc" },
863 { .compatible
= "allwinner,sun8i-r40-rtc" },
864 { .compatible
= "allwinner,sun8i-v3-rtc" },
865 { .compatible
= "allwinner,sun50i-h5-rtc" },
866 { .compatible
= "allwinner,sun50i-h6-rtc" },
867 { .compatible
= "allwinner,sun50i-h616-rtc",
868 .data
= (void *)RTC_LINEAR_DAY
},
869 { .compatible
= "allwinner,sun50i-r329-rtc",
870 .data
= (void *)RTC_LINEAR_DAY
},
873 MODULE_DEVICE_TABLE(of
, sun6i_rtc_dt_ids
);
875 static struct platform_driver sun6i_rtc_driver
= {
876 .probe
= sun6i_rtc_probe
,
879 .of_match_table
= sun6i_rtc_dt_ids
,
880 .pm
= &sun6i_rtc_pm_ops
,
883 builtin_platform_driver(sun6i_rtc_driver
);