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