0001
0002
0003
0004
0005
0006
0007 #include <linux/bitops.h>
0008 #include <linux/delay.h>
0009 #include <linux/err.h>
0010 #include <linux/module.h>
0011 #include <linux/of.h>
0012 #include <linux/platform_device.h>
0013 #include <linux/regmap.h>
0014 #include <linux/rtc.h>
0015
0016 #define SPRD_RTC_SEC_CNT_VALUE 0x0
0017 #define SPRD_RTC_MIN_CNT_VALUE 0x4
0018 #define SPRD_RTC_HOUR_CNT_VALUE 0x8
0019 #define SPRD_RTC_DAY_CNT_VALUE 0xc
0020 #define SPRD_RTC_SEC_CNT_UPD 0x10
0021 #define SPRD_RTC_MIN_CNT_UPD 0x14
0022 #define SPRD_RTC_HOUR_CNT_UPD 0x18
0023 #define SPRD_RTC_DAY_CNT_UPD 0x1c
0024 #define SPRD_RTC_SEC_ALM_UPD 0x20
0025 #define SPRD_RTC_MIN_ALM_UPD 0x24
0026 #define SPRD_RTC_HOUR_ALM_UPD 0x28
0027 #define SPRD_RTC_DAY_ALM_UPD 0x2c
0028 #define SPRD_RTC_INT_EN 0x30
0029 #define SPRD_RTC_INT_RAW_STS 0x34
0030 #define SPRD_RTC_INT_CLR 0x38
0031 #define SPRD_RTC_INT_MASK_STS 0x3C
0032 #define SPRD_RTC_SEC_ALM_VALUE 0x40
0033 #define SPRD_RTC_MIN_ALM_VALUE 0x44
0034 #define SPRD_RTC_HOUR_ALM_VALUE 0x48
0035 #define SPRD_RTC_DAY_ALM_VALUE 0x4c
0036 #define SPRD_RTC_SPG_VALUE 0x50
0037 #define SPRD_RTC_SPG_UPD 0x54
0038 #define SPRD_RTC_PWR_CTRL 0x58
0039 #define SPRD_RTC_PWR_STS 0x5c
0040 #define SPRD_RTC_SEC_AUXALM_UPD 0x60
0041 #define SPRD_RTC_MIN_AUXALM_UPD 0x64
0042 #define SPRD_RTC_HOUR_AUXALM_UPD 0x68
0043 #define SPRD_RTC_DAY_AUXALM_UPD 0x6c
0044
0045
0046 #define SPRD_RTC_SEC_EN BIT(0)
0047 #define SPRD_RTC_MIN_EN BIT(1)
0048 #define SPRD_RTC_HOUR_EN BIT(2)
0049 #define SPRD_RTC_DAY_EN BIT(3)
0050 #define SPRD_RTC_ALARM_EN BIT(4)
0051 #define SPRD_RTC_HRS_FORMAT_EN BIT(5)
0052 #define SPRD_RTC_AUXALM_EN BIT(6)
0053 #define SPRD_RTC_SPG_UPD_EN BIT(7)
0054 #define SPRD_RTC_SEC_UPD_EN BIT(8)
0055 #define SPRD_RTC_MIN_UPD_EN BIT(9)
0056 #define SPRD_RTC_HOUR_UPD_EN BIT(10)
0057 #define SPRD_RTC_DAY_UPD_EN BIT(11)
0058 #define SPRD_RTC_ALMSEC_UPD_EN BIT(12)
0059 #define SPRD_RTC_ALMMIN_UPD_EN BIT(13)
0060 #define SPRD_RTC_ALMHOUR_UPD_EN BIT(14)
0061 #define SPRD_RTC_ALMDAY_UPD_EN BIT(15)
0062 #define SPRD_RTC_INT_MASK GENMASK(15, 0)
0063
0064 #define SPRD_RTC_TIME_INT_MASK \
0065 (SPRD_RTC_SEC_UPD_EN | SPRD_RTC_MIN_UPD_EN | \
0066 SPRD_RTC_HOUR_UPD_EN | SPRD_RTC_DAY_UPD_EN)
0067
0068 #define SPRD_RTC_ALMTIME_INT_MASK \
0069 (SPRD_RTC_ALMSEC_UPD_EN | SPRD_RTC_ALMMIN_UPD_EN | \
0070 SPRD_RTC_ALMHOUR_UPD_EN | SPRD_RTC_ALMDAY_UPD_EN)
0071
0072 #define SPRD_RTC_ALM_INT_MASK \
0073 (SPRD_RTC_SEC_EN | SPRD_RTC_MIN_EN | \
0074 SPRD_RTC_HOUR_EN | SPRD_RTC_DAY_EN | \
0075 SPRD_RTC_ALARM_EN | SPRD_RTC_AUXALM_EN)
0076
0077
0078 #define SPRD_RTC_SEC_MASK GENMASK(5, 0)
0079 #define SPRD_RTC_MIN_MASK GENMASK(5, 0)
0080 #define SPRD_RTC_HOUR_MASK GENMASK(4, 0)
0081 #define SPRD_RTC_DAY_MASK GENMASK(15, 0)
0082
0083
0084 #define SPRD_RTC_ALMLOCK_MASK GENMASK(7, 0)
0085 #define SPRD_RTC_ALM_UNLOCK 0xa5
0086 #define SPRD_RTC_ALM_LOCK (~SPRD_RTC_ALM_UNLOCK & \
0087 SPRD_RTC_ALMLOCK_MASK)
0088
0089
0090 #define SPRD_RTC_POWEROFF_ALM_FLAG BIT(8)
0091
0092
0093 #define SPRD_RTC_POWER_RESET_VALUE 0x96
0094 #define SPRD_RTC_POWER_STS_CLEAR GENMASK(7, 0)
0095 #define SPRD_RTC_POWER_STS_SHIFT 8
0096 #define SPRD_RTC_POWER_STS_VALID \
0097 (~SPRD_RTC_POWER_RESET_VALUE << SPRD_RTC_POWER_STS_SHIFT)
0098
0099
0100 #define SPRD_RTC_POLL_TIMEOUT 200000
0101 #define SPRD_RTC_POLL_DELAY_US 20000
0102
0103 struct sprd_rtc {
0104 struct rtc_device *rtc;
0105 struct regmap *regmap;
0106 struct device *dev;
0107 u32 base;
0108 int irq;
0109 bool valid;
0110 };
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120 enum sprd_rtc_reg_types {
0121 SPRD_RTC_TIME,
0122 SPRD_RTC_ALARM,
0123 SPRD_RTC_AUX_ALARM,
0124 };
0125
0126 static int sprd_rtc_clear_alarm_ints(struct sprd_rtc *rtc)
0127 {
0128 return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR,
0129 SPRD_RTC_ALM_INT_MASK);
0130 }
0131
0132 static int sprd_rtc_lock_alarm(struct sprd_rtc *rtc, bool lock)
0133 {
0134 int ret;
0135 u32 val;
0136
0137 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_SPG_VALUE, &val);
0138 if (ret)
0139 return ret;
0140
0141 val &= ~SPRD_RTC_ALMLOCK_MASK;
0142 if (lock)
0143 val |= SPRD_RTC_ALM_LOCK;
0144 else
0145 val |= SPRD_RTC_ALM_UNLOCK | SPRD_RTC_POWEROFF_ALM_FLAG;
0146
0147 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_SPG_UPD, val);
0148 if (ret)
0149 return ret;
0150
0151
0152 ret = regmap_read_poll_timeout(rtc->regmap,
0153 rtc->base + SPRD_RTC_INT_RAW_STS, val,
0154 (val & SPRD_RTC_SPG_UPD_EN),
0155 SPRD_RTC_POLL_DELAY_US,
0156 SPRD_RTC_POLL_TIMEOUT);
0157 if (ret) {
0158 dev_err(rtc->dev, "failed to update SPG value:%d\n", ret);
0159 return ret;
0160 }
0161
0162 return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR,
0163 SPRD_RTC_SPG_UPD_EN);
0164 }
0165
0166 static int sprd_rtc_get_secs(struct sprd_rtc *rtc, enum sprd_rtc_reg_types type,
0167 time64_t *secs)
0168 {
0169 u32 sec_reg, min_reg, hour_reg, day_reg;
0170 u32 val, sec, min, hour, day;
0171 int ret;
0172
0173 switch (type) {
0174 case SPRD_RTC_TIME:
0175 sec_reg = SPRD_RTC_SEC_CNT_VALUE;
0176 min_reg = SPRD_RTC_MIN_CNT_VALUE;
0177 hour_reg = SPRD_RTC_HOUR_CNT_VALUE;
0178 day_reg = SPRD_RTC_DAY_CNT_VALUE;
0179 break;
0180 case SPRD_RTC_ALARM:
0181 sec_reg = SPRD_RTC_SEC_ALM_VALUE;
0182 min_reg = SPRD_RTC_MIN_ALM_VALUE;
0183 hour_reg = SPRD_RTC_HOUR_ALM_VALUE;
0184 day_reg = SPRD_RTC_DAY_ALM_VALUE;
0185 break;
0186 case SPRD_RTC_AUX_ALARM:
0187 sec_reg = SPRD_RTC_SEC_AUXALM_UPD;
0188 min_reg = SPRD_RTC_MIN_AUXALM_UPD;
0189 hour_reg = SPRD_RTC_HOUR_AUXALM_UPD;
0190 day_reg = SPRD_RTC_DAY_AUXALM_UPD;
0191 break;
0192 default:
0193 return -EINVAL;
0194 }
0195
0196 ret = regmap_read(rtc->regmap, rtc->base + sec_reg, &val);
0197 if (ret)
0198 return ret;
0199
0200 sec = val & SPRD_RTC_SEC_MASK;
0201
0202 ret = regmap_read(rtc->regmap, rtc->base + min_reg, &val);
0203 if (ret)
0204 return ret;
0205
0206 min = val & SPRD_RTC_MIN_MASK;
0207
0208 ret = regmap_read(rtc->regmap, rtc->base + hour_reg, &val);
0209 if (ret)
0210 return ret;
0211
0212 hour = val & SPRD_RTC_HOUR_MASK;
0213
0214 ret = regmap_read(rtc->regmap, rtc->base + day_reg, &val);
0215 if (ret)
0216 return ret;
0217
0218 day = val & SPRD_RTC_DAY_MASK;
0219 *secs = (((time64_t)(day * 24) + hour) * 60 + min) * 60 + sec;
0220 return 0;
0221 }
0222
0223 static int sprd_rtc_set_secs(struct sprd_rtc *rtc, enum sprd_rtc_reg_types type,
0224 time64_t secs)
0225 {
0226 u32 sec_reg, min_reg, hour_reg, day_reg, sts_mask;
0227 u32 sec, min, hour, day, val;
0228 int ret, rem;
0229
0230
0231 day = div_s64_rem(secs, 86400, &rem);
0232 hour = rem / 3600;
0233 rem -= hour * 3600;
0234 min = rem / 60;
0235 sec = rem - min * 60;
0236
0237 switch (type) {
0238 case SPRD_RTC_TIME:
0239 sec_reg = SPRD_RTC_SEC_CNT_UPD;
0240 min_reg = SPRD_RTC_MIN_CNT_UPD;
0241 hour_reg = SPRD_RTC_HOUR_CNT_UPD;
0242 day_reg = SPRD_RTC_DAY_CNT_UPD;
0243 sts_mask = SPRD_RTC_TIME_INT_MASK;
0244 break;
0245 case SPRD_RTC_ALARM:
0246 sec_reg = SPRD_RTC_SEC_ALM_UPD;
0247 min_reg = SPRD_RTC_MIN_ALM_UPD;
0248 hour_reg = SPRD_RTC_HOUR_ALM_UPD;
0249 day_reg = SPRD_RTC_DAY_ALM_UPD;
0250 sts_mask = SPRD_RTC_ALMTIME_INT_MASK;
0251 break;
0252 case SPRD_RTC_AUX_ALARM:
0253 sec_reg = SPRD_RTC_SEC_AUXALM_UPD;
0254 min_reg = SPRD_RTC_MIN_AUXALM_UPD;
0255 hour_reg = SPRD_RTC_HOUR_AUXALM_UPD;
0256 day_reg = SPRD_RTC_DAY_AUXALM_UPD;
0257 sts_mask = 0;
0258 break;
0259 default:
0260 return -EINVAL;
0261 }
0262
0263 ret = regmap_write(rtc->regmap, rtc->base + sec_reg, sec);
0264 if (ret)
0265 return ret;
0266
0267 ret = regmap_write(rtc->regmap, rtc->base + min_reg, min);
0268 if (ret)
0269 return ret;
0270
0271 ret = regmap_write(rtc->regmap, rtc->base + hour_reg, hour);
0272 if (ret)
0273 return ret;
0274
0275 ret = regmap_write(rtc->regmap, rtc->base + day_reg, day);
0276 if (ret)
0277 return ret;
0278
0279 if (type == SPRD_RTC_AUX_ALARM)
0280 return 0;
0281
0282
0283
0284
0285
0286
0287
0288 ret = regmap_read_poll_timeout(rtc->regmap,
0289 rtc->base + SPRD_RTC_INT_RAW_STS, val,
0290 ((val & sts_mask) == sts_mask),
0291 SPRD_RTC_POLL_DELAY_US,
0292 SPRD_RTC_POLL_TIMEOUT);
0293 if (ret < 0) {
0294 dev_err(rtc->dev, "set time/alarm values timeout\n");
0295 return ret;
0296 }
0297
0298 return regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR,
0299 sts_mask);
0300 }
0301
0302 static int sprd_rtc_set_aux_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0303 {
0304 struct sprd_rtc *rtc = dev_get_drvdata(dev);
0305 time64_t secs = rtc_tm_to_time64(&alrm->time);
0306 int ret;
0307
0308
0309 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR,
0310 SPRD_RTC_AUXALM_EN);
0311 if (ret)
0312 return ret;
0313
0314 ret = sprd_rtc_set_secs(rtc, SPRD_RTC_AUX_ALARM, secs);
0315 if (ret)
0316 return ret;
0317
0318 if (alrm->enabled) {
0319 ret = regmap_update_bits(rtc->regmap,
0320 rtc->base + SPRD_RTC_INT_EN,
0321 SPRD_RTC_AUXALM_EN,
0322 SPRD_RTC_AUXALM_EN);
0323 } else {
0324 ret = regmap_update_bits(rtc->regmap,
0325 rtc->base + SPRD_RTC_INT_EN,
0326 SPRD_RTC_AUXALM_EN, 0);
0327 }
0328
0329 return ret;
0330 }
0331
0332 static int sprd_rtc_read_time(struct device *dev, struct rtc_time *tm)
0333 {
0334 struct sprd_rtc *rtc = dev_get_drvdata(dev);
0335 time64_t secs;
0336 int ret;
0337
0338 if (!rtc->valid) {
0339 dev_warn(dev, "RTC values are invalid\n");
0340 return -EINVAL;
0341 }
0342
0343 ret = sprd_rtc_get_secs(rtc, SPRD_RTC_TIME, &secs);
0344 if (ret)
0345 return ret;
0346
0347 rtc_time64_to_tm(secs, tm);
0348 return 0;
0349 }
0350
0351 static int sprd_rtc_set_time(struct device *dev, struct rtc_time *tm)
0352 {
0353 struct sprd_rtc *rtc = dev_get_drvdata(dev);
0354 time64_t secs = rtc_tm_to_time64(tm);
0355 int ret;
0356
0357 ret = sprd_rtc_set_secs(rtc, SPRD_RTC_TIME, secs);
0358 if (ret)
0359 return ret;
0360
0361 if (!rtc->valid) {
0362
0363 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_PWR_CTRL,
0364 SPRD_RTC_POWER_STS_CLEAR);
0365 if (ret)
0366 return ret;
0367
0368
0369
0370
0371
0372 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_PWR_CTRL,
0373 SPRD_RTC_POWER_STS_VALID);
0374 if (ret)
0375 return ret;
0376
0377 rtc->valid = true;
0378 }
0379
0380 return 0;
0381 }
0382
0383 static int sprd_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0384 {
0385 struct sprd_rtc *rtc = dev_get_drvdata(dev);
0386 time64_t secs;
0387 int ret;
0388 u32 val;
0389
0390
0391
0392
0393
0394 ret = sprd_rtc_get_secs(rtc, SPRD_RTC_ALARM, &secs);
0395 if (ret)
0396 return ret;
0397
0398 rtc_time64_to_tm(secs, &alrm->time);
0399
0400 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_EN, &val);
0401 if (ret)
0402 return ret;
0403
0404 alrm->enabled = !!(val & SPRD_RTC_ALARM_EN);
0405
0406 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_INT_RAW_STS, &val);
0407 if (ret)
0408 return ret;
0409
0410 alrm->pending = !!(val & SPRD_RTC_ALARM_EN);
0411 return 0;
0412 }
0413
0414 static int sprd_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0415 {
0416 struct sprd_rtc *rtc = dev_get_drvdata(dev);
0417 time64_t secs = rtc_tm_to_time64(&alrm->time);
0418 struct rtc_time aie_time =
0419 rtc_ktime_to_tm(rtc->rtc->aie_timer.node.expires);
0420 int ret;
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435 if (!rtc->rtc->aie_timer.enabled || rtc_tm_sub(&aie_time, &alrm->time))
0436 return sprd_rtc_set_aux_alarm(dev, alrm);
0437
0438
0439 ret = regmap_write(rtc->regmap, rtc->base + SPRD_RTC_INT_CLR,
0440 SPRD_RTC_ALARM_EN);
0441 if (ret)
0442 return ret;
0443
0444 ret = sprd_rtc_set_secs(rtc, SPRD_RTC_ALARM, secs);
0445 if (ret)
0446 return ret;
0447
0448 if (alrm->enabled) {
0449 ret = regmap_update_bits(rtc->regmap,
0450 rtc->base + SPRD_RTC_INT_EN,
0451 SPRD_RTC_ALARM_EN,
0452 SPRD_RTC_ALARM_EN);
0453 if (ret)
0454 return ret;
0455
0456
0457 ret = sprd_rtc_lock_alarm(rtc, false);
0458 } else {
0459 regmap_update_bits(rtc->regmap,
0460 rtc->base + SPRD_RTC_INT_EN,
0461 SPRD_RTC_ALARM_EN, 0);
0462
0463
0464
0465
0466
0467 ret = sprd_rtc_lock_alarm(rtc, true);
0468 }
0469
0470 return ret;
0471 }
0472
0473 static int sprd_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
0474 {
0475 struct sprd_rtc *rtc = dev_get_drvdata(dev);
0476 int ret;
0477
0478 if (enabled) {
0479 ret = regmap_update_bits(rtc->regmap,
0480 rtc->base + SPRD_RTC_INT_EN,
0481 SPRD_RTC_ALARM_EN | SPRD_RTC_AUXALM_EN,
0482 SPRD_RTC_ALARM_EN | SPRD_RTC_AUXALM_EN);
0483 if (ret)
0484 return ret;
0485
0486 ret = sprd_rtc_lock_alarm(rtc, false);
0487 } else {
0488 regmap_update_bits(rtc->regmap, rtc->base + SPRD_RTC_INT_EN,
0489 SPRD_RTC_ALARM_EN | SPRD_RTC_AUXALM_EN, 0);
0490
0491 ret = sprd_rtc_lock_alarm(rtc, true);
0492 }
0493
0494 return ret;
0495 }
0496
0497 static const struct rtc_class_ops sprd_rtc_ops = {
0498 .read_time = sprd_rtc_read_time,
0499 .set_time = sprd_rtc_set_time,
0500 .read_alarm = sprd_rtc_read_alarm,
0501 .set_alarm = sprd_rtc_set_alarm,
0502 .alarm_irq_enable = sprd_rtc_alarm_irq_enable,
0503 };
0504
0505 static irqreturn_t sprd_rtc_handler(int irq, void *dev_id)
0506 {
0507 struct sprd_rtc *rtc = dev_id;
0508 int ret;
0509
0510 ret = sprd_rtc_clear_alarm_ints(rtc);
0511 if (ret)
0512 return IRQ_RETVAL(ret);
0513
0514 rtc_update_irq(rtc->rtc, 1, RTC_AF | RTC_IRQF);
0515 return IRQ_HANDLED;
0516 }
0517
0518 static int sprd_rtc_check_power_down(struct sprd_rtc *rtc)
0519 {
0520 u32 val;
0521 int ret;
0522
0523 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_PWR_STS, &val);
0524 if (ret)
0525 return ret;
0526
0527
0528
0529
0530
0531
0532 rtc->valid = val != SPRD_RTC_POWER_RESET_VALUE;
0533 return 0;
0534 }
0535
0536 static int sprd_rtc_check_alarm_int(struct sprd_rtc *rtc)
0537 {
0538 u32 val;
0539 int ret;
0540
0541 ret = regmap_read(rtc->regmap, rtc->base + SPRD_RTC_SPG_VALUE, &val);
0542 if (ret)
0543 return ret;
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555 if (!(val & SPRD_RTC_POWEROFF_ALM_FLAG))
0556 return 0;
0557
0558 return regmap_update_bits(rtc->regmap, rtc->base + SPRD_RTC_INT_EN,
0559 SPRD_RTC_ALARM_EN, SPRD_RTC_ALARM_EN);
0560 }
0561
0562 static int sprd_rtc_probe(struct platform_device *pdev)
0563 {
0564 struct device_node *node = pdev->dev.of_node;
0565 struct sprd_rtc *rtc;
0566 int ret;
0567
0568 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
0569 if (!rtc)
0570 return -ENOMEM;
0571
0572 rtc->regmap = dev_get_regmap(pdev->dev.parent, NULL);
0573 if (!rtc->regmap)
0574 return -ENODEV;
0575
0576 ret = of_property_read_u32(node, "reg", &rtc->base);
0577 if (ret) {
0578 dev_err(&pdev->dev, "failed to get RTC base address\n");
0579 return ret;
0580 }
0581
0582 rtc->irq = platform_get_irq(pdev, 0);
0583 if (rtc->irq < 0)
0584 return rtc->irq;
0585
0586 rtc->rtc = devm_rtc_allocate_device(&pdev->dev);
0587 if (IS_ERR(rtc->rtc))
0588 return PTR_ERR(rtc->rtc);
0589
0590 rtc->dev = &pdev->dev;
0591 platform_set_drvdata(pdev, rtc);
0592
0593
0594 ret = sprd_rtc_check_alarm_int(rtc);
0595 if (ret) {
0596 dev_err(&pdev->dev, "failed to check RTC alarm interrupt\n");
0597 return ret;
0598 }
0599
0600
0601 ret = sprd_rtc_check_power_down(rtc);
0602 if (ret) {
0603 dev_err(&pdev->dev, "failed to check RTC time values\n");
0604 return ret;
0605 }
0606
0607 ret = devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL,
0608 sprd_rtc_handler,
0609 IRQF_ONESHOT | IRQF_EARLY_RESUME,
0610 pdev->name, rtc);
0611 if (ret < 0) {
0612 dev_err(&pdev->dev, "failed to request RTC irq\n");
0613 return ret;
0614 }
0615
0616 device_init_wakeup(&pdev->dev, 1);
0617
0618 rtc->rtc->ops = &sprd_rtc_ops;
0619 rtc->rtc->range_min = 0;
0620 rtc->rtc->range_max = 5662310399LL;
0621 ret = devm_rtc_register_device(rtc->rtc);
0622 if (ret) {
0623 device_init_wakeup(&pdev->dev, 0);
0624 return ret;
0625 }
0626
0627 return 0;
0628 }
0629
0630 static const struct of_device_id sprd_rtc_of_match[] = {
0631 { .compatible = "sprd,sc2731-rtc", },
0632 { },
0633 };
0634 MODULE_DEVICE_TABLE(of, sprd_rtc_of_match);
0635
0636 static struct platform_driver sprd_rtc_driver = {
0637 .driver = {
0638 .name = "sprd-rtc",
0639 .of_match_table = sprd_rtc_of_match,
0640 },
0641 .probe = sprd_rtc_probe,
0642 };
0643 module_platform_driver(sprd_rtc_driver);
0644
0645 MODULE_LICENSE("GPL v2");
0646 MODULE_DESCRIPTION("Spreadtrum RTC Device Driver");
0647 MODULE_AUTHOR("Baolin Wang <baolin.wang@spreadtrum.com>");