Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
[sfrench/cifs-2.6.git] / drivers / rtc / rtc-sc27xx.c
1 /*
2  * Copyright (C) 2017 Spreadtrum Communications Inc.
3  *
4  * SPDX-License-Identifier: GPL-2.0
5  */
6
7 #include <linux/bitops.h>
8 #include <linux/delay.h>
9 #include <linux/err.h>
10 #include <linux/module.h>
11 #include <linux/of.h>
12 #include <linux/platform_device.h>
13 #include <linux/regmap.h>
14 #include <linux/rtc.h>
15
16 #define SPRD_RTC_SEC_CNT_VALUE          0x0
17 #define SPRD_RTC_MIN_CNT_VALUE          0x4
18 #define SPRD_RTC_HOUR_CNT_VALUE         0x8
19 #define SPRD_RTC_DAY_CNT_VALUE          0xc
20 #define SPRD_RTC_SEC_CNT_UPD            0x10
21 #define SPRD_RTC_MIN_CNT_UPD            0x14
22 #define SPRD_RTC_HOUR_CNT_UPD           0x18
23 #define SPRD_RTC_DAY_CNT_UPD            0x1c
24 #define SPRD_RTC_SEC_ALM_UPD            0x20
25 #define SPRD_RTC_MIN_ALM_UPD            0x24
26 #define SPRD_RTC_HOUR_ALM_UPD           0x28
27 #define SPRD_RTC_DAY_ALM_UPD            0x2c
28 #define SPRD_RTC_INT_EN                 0x30
29 #define SPRD_RTC_INT_RAW_STS            0x34
30 #define SPRD_RTC_INT_CLR                0x38
31 #define SPRD_RTC_INT_MASK_STS           0x3C
32 #define SPRD_RTC_SEC_ALM_VALUE          0x40
33 #define SPRD_RTC_MIN_ALM_VALUE          0x44
34 #define SPRD_RTC_HOUR_ALM_VALUE         0x48
35 #define SPRD_RTC_DAY_ALM_VALUE          0x4c
36 #define SPRD_RTC_SPG_VALUE              0x50
37 #define SPRD_RTC_SPG_UPD                0x54
38 #define SPRD_RTC_SEC_AUXALM_UPD         0x60
39 #define SPRD_RTC_MIN_AUXALM_UPD         0x64
40 #define SPRD_RTC_HOUR_AUXALM_UPD        0x68
41 #define SPRD_RTC_DAY_AUXALM_UPD         0x6c
42
43 /* BIT & MASK definition for SPRD_RTC_INT_* registers */
44 #define SPRD_RTC_SEC_EN                 BIT(0)
45 #define SPRD_RTC_MIN_EN                 BIT(1)
46 #define SPRD_RTC_HOUR_EN                BIT(2)
47 #define SPRD_RTC_DAY_EN                 BIT(3)
48 #define SPRD_RTC_ALARM_EN               BIT(4)
49 #define SPRD_RTC_HRS_FORMAT_EN          BIT(5)
50 #define SPRD_RTC_AUXALM_EN              BIT(6)
51 #define SPRD_RTC_SPG_UPD_EN             BIT(7)
52 #define SPRD_RTC_SEC_UPD_EN             BIT(8)
53 #define SPRD_RTC_MIN_UPD_EN             BIT(9)
54 #define SPRD_RTC_HOUR_UPD_EN            BIT(10)
55 #define SPRD_RTC_DAY_UPD_EN             BIT(11)
56 #define SPRD_RTC_ALMSEC_UPD_EN          BIT(12)
57 #define SPRD_RTC_ALMMIN_UPD_EN          BIT(13)
58 #define SPRD_RTC_ALMHOUR_UPD_EN         BIT(14)
59 #define SPRD_RTC_ALMDAY_UPD_EN          BIT(15)
60 #define SPRD_RTC_INT_MASK               GENMASK(15, 0)
61
62 #define SPRD_RTC_TIME_INT_MASK                          \
63         (SPRD_RTC_SEC_UPD_EN | SPRD_RTC_MIN_UPD_EN |    \
64          SPRD_RTC_HOUR_UPD_EN | SPRD_RTC_DAY_UPD_EN)
65
66 #define SPRD_RTC_ALMTIME_INT_MASK                               \
67         (SPRD_RTC_ALMSEC_UPD_EN | SPRD_RTC_ALMMIN_UPD_EN |      \
68          SPRD_RTC_ALMHOUR_UPD_EN | SPRD_RTC_ALMDAY_UPD_EN)
69
70 #define SPRD_RTC_ALM_INT_MASK                   \
71         (SPRD_RTC_SEC_EN | SPRD_RTC_MIN_EN |    \
72          SPRD_RTC_HOUR_EN | SPRD_RTC_DAY_EN |   \
73          SPRD_RTC_ALARM_EN | SPRD_RTC_AUXALM_EN)
74
75 /* second/minute/hour/day values mask definition */
76 #define SPRD_RTC_SEC_MASK               GENMASK(5, 0)
77 #define SPRD_RTC_MIN_MASK               GENMASK(5, 0)
78 #define SPRD_RTC_HOUR_MASK              GENMASK(4, 0)
79 #define SPRD_RTC_DAY_MASK               GENMASK(15, 0)
80
81 /* alarm lock definition for SPRD_RTC_SPG_UPD register */
82 #define SPRD_RTC_ALMLOCK_MASK           GENMASK(7, 0)
83 #define SPRD_RTC_ALM_UNLOCK             0xa5
84 #define SPRD_RTC_ALM_LOCK               (~SPRD_RTC_ALM_UNLOCK & \
85                                          SPRD_RTC_ALMLOCK_MASK)
86
87 /* SPG values definition for SPRD_RTC_SPG_UPD register */
88 #define SPRD_RTC_POWEROFF_ALM_FLAG      BIT(8)
89 #define SPRD_RTC_POWER_RESET_FLAG       BIT(9)
90
91 /* timeout of synchronizing time and alarm registers (us) */
92 #define SPRD_RTC_POLL_TIMEOUT           200000
93 #define SPRD_RTC_POLL_DELAY_US          20000
94
95 struct sprd_rtc {
96         struct rtc_device       *rtc;
97         struct regmap           *regmap;
98         struct device           *dev;
99         u32                     base;
100         int                     irq;
101         bool                    valid;
102 };
103
104 /*
105  * The Spreadtrum RTC controller has 3 groups registers, including time, normal
106  * alarm and auxiliary alarm. The time group registers are used to set RTC time,
107  * the normal alarm registers are used to set normal alarm, and the auxiliary
108  * alarm registers are used to set auxiliary alarm. Both alarm event and
109  * auxiliary alarm event can wake up system from deep sleep, but only alarm
110  * event can power up system from power down status.
111  */
112 enum sprd_rtc_reg_types {
113         SPRD_RTC_TIME,
114         SPRD_RTC_ALARM,
115         SPRD_RTC_AUX_ALARM,
116 };
117
118 static int sprd_rtc_clear_alarm_ints(struct sprd_rtc *rtc)
119 {
120         return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR,
121                             SPRD_RTC_ALM_INT_MASK);
122 }
123
124 static int sprd_rtc_disable_ints(struct sprd_rtc *rtc)
125 {
126         int ret;
127
128         ret = regmap_update_bits(rtc->regmap, rtc->base + SPRD_RTC_INT_EN,
129                                  SPRD_RTC_INT_MASK, 0);
130         if (ret)
131                 return ret;
132
133         return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR,
134                             SPRD_RTC_INT_MASK);
135 }
136
137 static int sprd_rtc_lock_alarm(struct sprd_rtc *rtc, bool lock)
138 {
139         int ret;
140         u32 val;
141
142         ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_SPG_VALUE, &val);
143         if (ret)
144                 return ret;
145
146         val &= ~(SPRD_RTC_ALMLOCK_MASK | SPRD_RTC_POWEROFF_ALM_FLAG);
147         if (lock)
148                 val |= SPRD_RTC_ALM_LOCK;
149         else
150                 val |= SPRD_RTC_ALM_UNLOCK | SPRD_RTC_POWEROFF_ALM_FLAG;
151
152         ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_SPG_UPD, val);
153         if (ret)
154                 return ret;
155
156         /* wait until the SPG value is updated successfully */
157         ret = regmap_read_poll_timeout(rtc->regmap,
158                                        rtc->base + SPRD_RTC_INT_RAW_STS, val,
159                                        (val & SPRD_RTC_SPG_UPD_EN),
160                                        SPRD_RTC_POLL_DELAY_US,
161                                        SPRD_RTC_POLL_TIMEOUT);
162         if (ret) {
163                 dev_err(rtc->dev, "failed to update SPG value:%d\n", ret);
164                 return ret;
165         }
166
167         return 0;
168 }
169
170 static int sprd_rtc_get_secs(struct sprd_rtc *rtc, enum sprd_rtc_reg_types type,
171                              time64_t *secs)
172 {
173         u32 sec_reg, min_reg, hour_reg, day_reg;
174         u32 val, sec, min, hour, day;
175         int ret;
176
177         switch (type) {
178         case SPRD_RTC_TIME:
179                 sec_reg = SPRD_RTC_SEC_CNT_VALUE;
180                 min_reg = SPRD_RTC_MIN_CNT_VALUE;
181                 hour_reg = SPRD_RTC_HOUR_CNT_VALUE;
182                 day_reg = SPRD_RTC_DAY_CNT_VALUE;
183                 break;
184         case SPRD_RTC_ALARM:
185                 sec_reg = SPRD_RTC_SEC_ALM_VALUE;
186                 min_reg = SPRD_RTC_MIN_ALM_VALUE;
187                 hour_reg = SPRD_RTC_HOUR_ALM_VALUE;
188                 day_reg = SPRD_RTC_DAY_ALM_VALUE;
189                 break;
190         case SPRD_RTC_AUX_ALARM:
191                 sec_reg = SPRD_RTC_SEC_AUXALM_UPD;
192                 min_reg = SPRD_RTC_MIN_AUXALM_UPD;
193                 hour_reg = SPRD_RTC_HOUR_AUXALM_UPD;
194                 day_reg = SPRD_RTC_DAY_AUXALM_UPD;
195                 break;
196         default:
197                 return -EINVAL;
198         }
199
200         ret = regmap_read(rtc->regmap, rtc->base + sec_reg, &val);
201         if (ret)
202                 return ret;
203
204         sec = val & SPRD_RTC_SEC_MASK;
205
206         ret = regmap_read(rtc->regmap, rtc->base + min_reg, &val);
207         if (ret)
208                 return ret;
209
210         min = val & SPRD_RTC_MIN_MASK;
211
212         ret = regmap_read(rtc->regmap, rtc->base + hour_reg, &val);
213         if (ret)
214                 return ret;
215
216         hour = val & SPRD_RTC_HOUR_MASK;
217
218         ret = regmap_read(rtc->regmap, rtc->base + day_reg, &val);
219         if (ret)
220                 return ret;
221
222         day = val & SPRD_RTC_DAY_MASK;
223         *secs = (((time64_t)(day * 24) + hour) * 60 + min) * 60 + sec;
224         return 0;
225 }
226
227 static int sprd_rtc_set_secs(struct sprd_rtc *rtc, enum sprd_rtc_reg_types type,
228                              time64_t secs)
229 {
230         u32 sec_reg, min_reg, hour_reg, day_reg, sts_mask;
231         u32 sec, min, hour, day, val;
232         int ret, rem;
233
234         /* convert seconds to RTC time format */
235         day = div_s64_rem(secs, 86400, &rem);
236         hour = rem / 3600;
237         rem -= hour * 3600;
238         min = rem / 60;
239         sec = rem - min * 60;
240
241         switch (type) {
242         case SPRD_RTC_TIME:
243                 sec_reg = SPRD_RTC_SEC_CNT_UPD;
244                 min_reg = SPRD_RTC_MIN_CNT_UPD;
245                 hour_reg = SPRD_RTC_HOUR_CNT_UPD;
246                 day_reg = SPRD_RTC_DAY_CNT_UPD;
247                 sts_mask = SPRD_RTC_TIME_INT_MASK;
248                 break;
249         case SPRD_RTC_ALARM:
250                 sec_reg = SPRD_RTC_SEC_ALM_UPD;
251                 min_reg = SPRD_RTC_MIN_ALM_UPD;
252                 hour_reg = SPRD_RTC_HOUR_ALM_UPD;
253                 day_reg = SPRD_RTC_DAY_ALM_UPD;
254                 sts_mask = SPRD_RTC_ALMTIME_INT_MASK;
255                 break;
256         case SPRD_RTC_AUX_ALARM:
257                 sec_reg = SPRD_RTC_SEC_AUXALM_UPD;
258                 min_reg = SPRD_RTC_MIN_AUXALM_UPD;
259                 hour_reg = SPRD_RTC_HOUR_AUXALM_UPD;
260                 day_reg = SPRD_RTC_DAY_AUXALM_UPD;
261                 sts_mask = 0;
262                 break;
263         default:
264                 return -EINVAL;
265         }
266
267         ret = regmap_write(rtc->regmap, rtc->base + sec_reg, sec);
268         if (ret)
269                 return ret;
270
271         ret = regmap_write(rtc->regmap, rtc->base + min_reg, min);
272         if (ret)
273                 return ret;
274
275         ret = regmap_write(rtc->regmap, rtc->base + hour_reg, hour);
276         if (ret)
277                 return ret;
278
279         ret = regmap_write(rtc->regmap, rtc->base + day_reg, day);
280         if (ret)
281                 return ret;
282
283         if (type == SPRD_RTC_AUX_ALARM)
284                 return 0;
285
286         /*
287          * Since the time and normal alarm registers are put in always-power-on
288          * region supplied by VDDRTC, then these registers changing time will
289          * be very long, about 125ms. Thus here we should wait until all
290          * values are updated successfully.
291          */
292         ret = regmap_read_poll_timeout(rtc->regmap,
293                                        rtc->base + SPRD_RTC_INT_RAW_STS, val,
294                                        ((val & sts_mask) == sts_mask),
295                                        SPRD_RTC_POLL_DELAY_US,
296                                        SPRD_RTC_POLL_TIMEOUT);
297         if (ret < 0) {
298                 dev_err(rtc->dev, "set time/alarm values timeout\n");
299                 return ret;
300         }
301
302         return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR,
303                             sts_mask);
304 }
305
306 static int sprd_rtc_read_aux_alarm(struct device *dev, struct rtc_wkalrm *alrm)
307 {
308         struct sprd_rtc *rtc = dev_get_drvdata(dev);
309         time64_t secs;
310         u32 val;
311         int ret;
312
313         ret = sprd_rtc_get_secs(rtc, SPRD_RTC_AUX_ALARM, &secs);
314         if (ret)
315                 return ret;
316
317         rtc_time64_to_tm(secs, &alrm->time);
318
319         ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, &val);
320         if (ret)
321                 return ret;
322
323         alrm->enabled = !!(val & SPRD_RTC_AUXALM_EN);
324
325         ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_RAW_STS, &val);
326         if (ret)
327                 return ret;
328
329         alrm->pending = !!(val & SPRD_RTC_AUXALM_EN);
330         return 0;
331 }
332
333 static int sprd_rtc_set_aux_alarm(struct device *dev, struct rtc_wkalrm *alrm)
334 {
335         struct sprd_rtc *rtc = dev_get_drvdata(dev);
336         time64_t secs = rtc_tm_to_time64(&alrm->time);
337         int ret;
338
339         /* clear the auxiliary alarm interrupt status */
340         ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR,
341                            SPRD_RTC_AUXALM_EN);
342         if (ret)
343                 return ret;
344
345         ret = sprd_rtc_set_secs(rtc, SPRD_RTC_AUX_ALARM, secs);
346         if (ret)
347                 return ret;
348
349         if (alrm->enabled) {
350                 ret = regmap_update_bits(rtc->regmap,
351                                          rtc->base + SPRD_RTC_INT_EN,
352                                          SPRD_RTC_AUXALM_EN,
353                                          SPRD_RTC_AUXALM_EN);
354         } else {
355                 ret = regmap_update_bits(rtc->regmap,
356                                          rtc->base + SPRD_RTC_INT_EN,
357                                          SPRD_RTC_AUXALM_EN, 0);
358         }
359
360         return ret;
361 }
362
363 static int sprd_rtc_read_time(struct device *dev, struct rtc_time *tm)
364 {
365         struct sprd_rtc *rtc = dev_get_drvdata(dev);
366         time64_t secs;
367         int ret;
368
369         if (!rtc->valid) {
370                 dev_warn(dev, "RTC values are invalid\n");
371                 return -EINVAL;
372         }
373
374         ret = sprd_rtc_get_secs(rtc, SPRD_RTC_TIME, &secs);
375         if (ret)
376                 return ret;
377
378         rtc_time64_to_tm(secs, tm);
379         return rtc_valid_tm(tm);
380 }
381
382 static int sprd_rtc_set_time(struct device *dev, struct rtc_time *tm)
383 {
384         struct sprd_rtc *rtc = dev_get_drvdata(dev);
385         time64_t secs = rtc_tm_to_time64(tm);
386         u32 val;
387         int ret;
388
389         ret = sprd_rtc_set_secs(rtc, SPRD_RTC_TIME, secs);
390         if (ret)
391                 return ret;
392
393         if (!rtc->valid) {
394                 /*
395                  * Set SPRD_RTC_POWER_RESET_FLAG to indicate now RTC has valid
396                  * time values.
397                  */
398                 ret = regmap_update_bits(rtc->regmap,
399                                          rtc->base + SPRD_RTC_SPG_UPD,
400                                          SPRD_RTC_POWER_RESET_FLAG,
401                                          SPRD_RTC_POWER_RESET_FLAG);
402                 if (ret)
403                         return ret;
404
405                 ret = regmap_read_poll_timeout(rtc->regmap,
406                                                rtc->base + SPRD_RTC_INT_RAW_STS,
407                                                val, (val & SPRD_RTC_SPG_UPD_EN),
408                                                SPRD_RTC_POLL_DELAY_US,
409                                                SPRD_RTC_POLL_TIMEOUT);
410                 if (ret) {
411                         dev_err(rtc->dev, "failed to update SPG value:%d\n",
412                                 ret);
413                         return ret;
414                 }
415
416                 rtc->valid = true;
417         }
418
419         return 0;
420 }
421
422 static int sprd_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
423 {
424         struct sprd_rtc *rtc = dev_get_drvdata(dev);
425         time64_t secs;
426         int ret;
427         u32 val;
428
429         /*
430          * If aie_timer is enabled, we should get the normal alarm time.
431          * Otherwise we should get auxiliary alarm time.
432          */
433         if (rtc->rtc && rtc->rtc->aie_timer.enabled == 0)
434                 return sprd_rtc_read_aux_alarm(dev, alrm);
435
436         ret = sprd_rtc_get_secs(rtc, SPRD_RTC_ALARM, &secs);
437         if (ret)
438                 return ret;
439
440         rtc_time64_to_tm(secs, &alrm->time);
441
442         ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, &val);
443         if (ret)
444                 return ret;
445
446         alrm->enabled = !!(val & SPRD_RTC_ALARM_EN);
447
448         ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_RAW_STS, &val);
449         if (ret)
450                 return ret;
451
452         alrm->pending = !!(val & SPRD_RTC_ALARM_EN);
453         return 0;
454 }
455
456 static int sprd_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
457 {
458         struct sprd_rtc *rtc = dev_get_drvdata(dev);
459         time64_t secs = rtc_tm_to_time64(&alrm->time);
460         struct rtc_time aie_time =
461                 rtc_ktime_to_tm(rtc->rtc->aie_timer.node.expires);
462         int ret;
463
464         /*
465          * We have 2 groups alarms: normal alarm and auxiliary alarm. Since
466          * both normal alarm event and auxiliary alarm event can wake up system
467          * from deep sleep, but only alarm event can power up system from power
468          * down status. Moreover we do not need to poll about 125ms when
469          * updating auxiliary alarm registers. Thus we usually set auxiliary
470          * alarm when wake up system from deep sleep, and for other scenarios,
471          * we should set normal alarm with polling status.
472          *
473          * So here we check if the alarm time is set by aie_timer, if yes, we
474          * should set normal alarm, if not, we should set auxiliary alarm which
475          * means it is just a wake event.
476          */
477         if (!rtc->rtc->aie_timer.enabled || rtc_tm_sub(&aie_time, &alrm->time))
478                 return sprd_rtc_set_aux_alarm(dev, alrm);
479
480         /* clear the alarm interrupt status firstly */
481         ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR,
482                            SPRD_RTC_ALARM_EN);
483         if (ret)
484                 return ret;
485
486         ret = sprd_rtc_set_secs(rtc, SPRD_RTC_ALARM, secs);
487         if (ret)
488                 return ret;
489
490         if (alrm->enabled) {
491                 ret = regmap_update_bits(rtc->regmap,
492                                          rtc->base + SPRD_RTC_INT_EN,
493                                          SPRD_RTC_ALARM_EN,
494                                          SPRD_RTC_ALARM_EN);
495                 if (ret)
496                         return ret;
497
498                 /* unlock the alarm to enable the alarm function. */
499                 ret = sprd_rtc_lock_alarm(rtc, false);
500         } else {
501                 regmap_update_bits(rtc->regmap,
502                                    rtc->base + SPRD_RTC_INT_EN,
503                                    SPRD_RTC_ALARM_EN, 0);
504
505                 /*
506                  * Lock the alarm function in case fake alarm event will power
507                  * up systems.
508                  */
509                 ret = sprd_rtc_lock_alarm(rtc, true);
510         }
511
512         return ret;
513 }
514
515 static int sprd_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
516 {
517         struct sprd_rtc *rtc = dev_get_drvdata(dev);
518         int ret;
519
520         if (enabled) {
521                 ret = regmap_update_bits(rtc->regmap,
522                                          rtc->base + SPRD_RTC_INT_EN,
523                                          SPRD_RTC_ALARM_EN | SPRD_RTC_AUXALM_EN,
524                                          SPRD_RTC_ALARM_EN | SPRD_RTC_AUXALM_EN);
525                 if (ret)
526                         return ret;
527
528                 ret = sprd_rtc_lock_alarm(rtc, false);
529         } else {
530                 regmap_update_bits(rtc->regmap, rtc->base + SPRD_RTC_INT_EN,
531                                    SPRD_RTC_ALARM_EN | SPRD_RTC_AUXALM_EN, 0);
532
533                 ret = sprd_rtc_lock_alarm(rtc, true);
534         }
535
536         return ret;
537 }
538
539 static const struct rtc_class_ops sprd_rtc_ops = {
540         .read_time = sprd_rtc_read_time,
541         .set_time = sprd_rtc_set_time,
542         .read_alarm = sprd_rtc_read_alarm,
543         .set_alarm = sprd_rtc_set_alarm,
544         .alarm_irq_enable = sprd_rtc_alarm_irq_enable,
545 };
546
547 static irqreturn_t sprd_rtc_handler(int irq, void *dev_id)
548 {
549         struct sprd_rtc *rtc = dev_id;
550         int ret;
551
552         ret = sprd_rtc_clear_alarm_ints(rtc);
553         if (ret)
554                 return IRQ_RETVAL(ret);
555
556         rtc_update_irq(rtc->rtc, 1, RTC_AF | RTC_IRQF);
557         return IRQ_HANDLED;
558 }
559
560 static int sprd_rtc_check_power_down(struct sprd_rtc *rtc)
561 {
562         u32 val;
563         int ret;
564
565         ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_SPG_VALUE, &val);
566         if (ret)
567                 return ret;
568
569         /*
570          * If the SPRD_RTC_POWER_RESET_FLAG was not set, which means the RTC has
571          * been powered down, so the RTC time values are invalid.
572          */
573         rtc->valid = (val & SPRD_RTC_POWER_RESET_FLAG) ? true : false;
574         return 0;
575 }
576
577 static int sprd_rtc_probe(struct platform_device *pdev)
578 {
579         struct device_node *node = pdev->dev.of_node;
580         struct sprd_rtc *rtc;
581         int ret;
582
583         rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
584         if (!rtc)
585                 return -ENOMEM;
586
587         rtc->regmap = dev_get_regmap(pdev->dev.parent, NULL);
588         if (!rtc->regmap)
589                 return -ENODEV;
590
591         ret = of_property_read_u32(node, "reg", &rtc->base);
592         if (ret) {
593                 dev_err(&pdev->dev, "failed to get RTC base address\n");
594                 return ret;
595         }
596
597         rtc->irq = platform_get_irq(pdev, 0);
598         if (rtc->irq < 0) {
599                 dev_err(&pdev->dev, "failed to get RTC irq number\n");
600                 return rtc->irq;
601         }
602
603         rtc->dev = &pdev->dev;
604         platform_set_drvdata(pdev, rtc);
605
606         /* clear all RTC interrupts and disable all RTC interrupts */
607         ret = sprd_rtc_disable_ints(rtc);
608         if (ret) {
609                 dev_err(&pdev->dev, "failed to disable RTC interrupts\n");
610                 return ret;
611         }
612
613         /* check if RTC time values are valid */
614         ret = sprd_rtc_check_power_down(rtc);
615         if (ret) {
616                 dev_err(&pdev->dev, "failed to check RTC time values\n");
617                 return ret;
618         }
619
620         ret = devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL,
621                                         sprd_rtc_handler,
622                                         IRQF_ONESHOT | IRQF_EARLY_RESUME,
623                                         pdev->name, rtc);
624         if (ret < 0) {
625                 dev_err(&pdev->dev, "failed to request RTC irq\n");
626                 return ret;
627         }
628
629         rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
630                                             &sprd_rtc_ops, THIS_MODULE);
631         if (IS_ERR(rtc->rtc))
632                 return PTR_ERR(rtc->rtc);
633
634         device_init_wakeup(&pdev->dev, 1);
635         return 0;
636 }
637
638 static int sprd_rtc_remove(struct platform_device *pdev)
639 {
640         device_init_wakeup(&pdev->dev, 0);
641         return 0;
642 }
643
644 static const struct of_device_id sprd_rtc_of_match[] = {
645         { .compatible = "sprd,sc2731-rtc", },
646         { },
647 };
648 MODULE_DEVICE_TABLE(of, sprd_rtc_of_match);
649
650 static struct platform_driver sprd_rtc_driver = {
651         .driver = {
652                 .name = "sprd-rtc",
653                 .of_match_table = sprd_rtc_of_match,
654         },
655         .probe  = sprd_rtc_probe,
656         .remove = sprd_rtc_remove,
657 };
658 module_platform_driver(sprd_rtc_driver);
659
660 MODULE_LICENSE("GPL v2");
661 MODULE_DESCRIPTION("Spreadtrum RTC Device Driver");
662 MODULE_AUTHOR("Baolin Wang <baolin.wang@spreadtrum.com>");