0001
0002
0003
0004
0005
0006
0007 #include <linux/bcd.h>
0008 #include <linux/clk.h>
0009 #include <linux/iopoll.h>
0010 #include <linux/ioport.h>
0011 #include <linux/mfd/syscon.h>
0012 #include <linux/module.h>
0013 #include <linux/of_device.h>
0014 #include <linux/pm_wakeirq.h>
0015 #include <linux/regmap.h>
0016 #include <linux/rtc.h>
0017
0018 #define DRIVER_NAME "stm32_rtc"
0019
0020
0021 #define STM32_RTC_TR_SEC_SHIFT 0
0022 #define STM32_RTC_TR_SEC GENMASK(6, 0)
0023 #define STM32_RTC_TR_MIN_SHIFT 8
0024 #define STM32_RTC_TR_MIN GENMASK(14, 8)
0025 #define STM32_RTC_TR_HOUR_SHIFT 16
0026 #define STM32_RTC_TR_HOUR GENMASK(21, 16)
0027
0028
0029 #define STM32_RTC_DR_DATE_SHIFT 0
0030 #define STM32_RTC_DR_DATE GENMASK(5, 0)
0031 #define STM32_RTC_DR_MONTH_SHIFT 8
0032 #define STM32_RTC_DR_MONTH GENMASK(12, 8)
0033 #define STM32_RTC_DR_WDAY_SHIFT 13
0034 #define STM32_RTC_DR_WDAY GENMASK(15, 13)
0035 #define STM32_RTC_DR_YEAR_SHIFT 16
0036 #define STM32_RTC_DR_YEAR GENMASK(23, 16)
0037
0038
0039 #define STM32_RTC_CR_FMT BIT(6)
0040 #define STM32_RTC_CR_ALRAE BIT(8)
0041 #define STM32_RTC_CR_ALRAIE BIT(12)
0042
0043
0044 #define STM32_RTC_ISR_ALRAWF BIT(0)
0045 #define STM32_RTC_ISR_INITS BIT(4)
0046 #define STM32_RTC_ISR_RSF BIT(5)
0047 #define STM32_RTC_ISR_INITF BIT(6)
0048 #define STM32_RTC_ISR_INIT BIT(7)
0049 #define STM32_RTC_ISR_ALRAF BIT(8)
0050
0051
0052 #define STM32_RTC_PRER_PRED_S_SHIFT 0
0053 #define STM32_RTC_PRER_PRED_S GENMASK(14, 0)
0054 #define STM32_RTC_PRER_PRED_A_SHIFT 16
0055 #define STM32_RTC_PRER_PRED_A GENMASK(22, 16)
0056
0057
0058 #define STM32_RTC_ALRMXR_SEC_SHIFT 0
0059 #define STM32_RTC_ALRMXR_SEC GENMASK(6, 0)
0060 #define STM32_RTC_ALRMXR_SEC_MASK BIT(7)
0061 #define STM32_RTC_ALRMXR_MIN_SHIFT 8
0062 #define STM32_RTC_ALRMXR_MIN GENMASK(14, 8)
0063 #define STM32_RTC_ALRMXR_MIN_MASK BIT(15)
0064 #define STM32_RTC_ALRMXR_HOUR_SHIFT 16
0065 #define STM32_RTC_ALRMXR_HOUR GENMASK(21, 16)
0066 #define STM32_RTC_ALRMXR_PM BIT(22)
0067 #define STM32_RTC_ALRMXR_HOUR_MASK BIT(23)
0068 #define STM32_RTC_ALRMXR_DATE_SHIFT 24
0069 #define STM32_RTC_ALRMXR_DATE GENMASK(29, 24)
0070 #define STM32_RTC_ALRMXR_WDSEL BIT(30)
0071 #define STM32_RTC_ALRMXR_WDAY_SHIFT 24
0072 #define STM32_RTC_ALRMXR_WDAY GENMASK(27, 24)
0073 #define STM32_RTC_ALRMXR_DATE_MASK BIT(31)
0074
0075
0076 #define STM32_RTC_SR_ALRA BIT(0)
0077
0078
0079 #define STM32_RTC_VERR_MINREV_SHIFT 0
0080 #define STM32_RTC_VERR_MINREV GENMASK(3, 0)
0081 #define STM32_RTC_VERR_MAJREV_SHIFT 4
0082 #define STM32_RTC_VERR_MAJREV GENMASK(7, 4)
0083
0084
0085 #define RTC_WPR_1ST_KEY 0xCA
0086 #define RTC_WPR_2ND_KEY 0x53
0087 #define RTC_WPR_WRONG_KEY 0xFF
0088
0089
0090 #define UNDEF_REG 0xFFFF
0091
0092 struct stm32_rtc;
0093
0094 struct stm32_rtc_registers {
0095 u16 tr;
0096 u16 dr;
0097 u16 cr;
0098 u16 isr;
0099 u16 prer;
0100 u16 alrmar;
0101 u16 wpr;
0102 u16 sr;
0103 u16 scr;
0104 u16 verr;
0105 };
0106
0107 struct stm32_rtc_events {
0108 u32 alra;
0109 };
0110
0111 struct stm32_rtc_data {
0112 const struct stm32_rtc_registers regs;
0113 const struct stm32_rtc_events events;
0114 void (*clear_events)(struct stm32_rtc *rtc, unsigned int flags);
0115 bool has_pclk;
0116 bool need_dbp;
0117 bool has_wakeirq;
0118 };
0119
0120 struct stm32_rtc {
0121 struct rtc_device *rtc_dev;
0122 void __iomem *base;
0123 struct regmap *dbp;
0124 unsigned int dbp_reg;
0125 unsigned int dbp_mask;
0126 struct clk *pclk;
0127 struct clk *rtc_ck;
0128 const struct stm32_rtc_data *data;
0129 int irq_alarm;
0130 int wakeirq_alarm;
0131 };
0132
0133 static void stm32_rtc_wpr_unlock(struct stm32_rtc *rtc)
0134 {
0135 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0136
0137 writel_relaxed(RTC_WPR_1ST_KEY, rtc->base + regs->wpr);
0138 writel_relaxed(RTC_WPR_2ND_KEY, rtc->base + regs->wpr);
0139 }
0140
0141 static void stm32_rtc_wpr_lock(struct stm32_rtc *rtc)
0142 {
0143 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0144
0145 writel_relaxed(RTC_WPR_WRONG_KEY, rtc->base + regs->wpr);
0146 }
0147
0148 static int stm32_rtc_enter_init_mode(struct stm32_rtc *rtc)
0149 {
0150 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0151 unsigned int isr = readl_relaxed(rtc->base + regs->isr);
0152
0153 if (!(isr & STM32_RTC_ISR_INITF)) {
0154 isr |= STM32_RTC_ISR_INIT;
0155 writel_relaxed(isr, rtc->base + regs->isr);
0156
0157
0158
0159
0160
0161
0162
0163 return readl_relaxed_poll_timeout_atomic(
0164 rtc->base + regs->isr,
0165 isr, (isr & STM32_RTC_ISR_INITF),
0166 10, 100000);
0167 }
0168
0169 return 0;
0170 }
0171
0172 static void stm32_rtc_exit_init_mode(struct stm32_rtc *rtc)
0173 {
0174 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0175 unsigned int isr = readl_relaxed(rtc->base + regs->isr);
0176
0177 isr &= ~STM32_RTC_ISR_INIT;
0178 writel_relaxed(isr, rtc->base + regs->isr);
0179 }
0180
0181 static int stm32_rtc_wait_sync(struct stm32_rtc *rtc)
0182 {
0183 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0184 unsigned int isr = readl_relaxed(rtc->base + regs->isr);
0185
0186 isr &= ~STM32_RTC_ISR_RSF;
0187 writel_relaxed(isr, rtc->base + regs->isr);
0188
0189
0190
0191
0192
0193 return readl_relaxed_poll_timeout_atomic(rtc->base + regs->isr,
0194 isr,
0195 (isr & STM32_RTC_ISR_RSF),
0196 10, 100000);
0197 }
0198
0199 static void stm32_rtc_clear_event_flags(struct stm32_rtc *rtc,
0200 unsigned int flags)
0201 {
0202 rtc->data->clear_events(rtc, flags);
0203 }
0204
0205 static irqreturn_t stm32_rtc_alarm_irq(int irq, void *dev_id)
0206 {
0207 struct stm32_rtc *rtc = (struct stm32_rtc *)dev_id;
0208 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0209 const struct stm32_rtc_events *evts = &rtc->data->events;
0210 unsigned int status, cr;
0211
0212 rtc_lock(rtc->rtc_dev);
0213
0214 status = readl_relaxed(rtc->base + regs->sr);
0215 cr = readl_relaxed(rtc->base + regs->cr);
0216
0217 if ((status & evts->alra) &&
0218 (cr & STM32_RTC_CR_ALRAIE)) {
0219
0220 dev_dbg(&rtc->rtc_dev->dev, "Alarm occurred\n");
0221
0222
0223 rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF);
0224
0225
0226 stm32_rtc_clear_event_flags(rtc, evts->alra);
0227 }
0228
0229 rtc_unlock(rtc->rtc_dev);
0230
0231 return IRQ_HANDLED;
0232 }
0233
0234
0235 static void tm2bcd(struct rtc_time *tm)
0236 {
0237 tm->tm_sec = bin2bcd(tm->tm_sec);
0238 tm->tm_min = bin2bcd(tm->tm_min);
0239 tm->tm_hour = bin2bcd(tm->tm_hour);
0240
0241 tm->tm_mday = bin2bcd(tm->tm_mday);
0242 tm->tm_mon = bin2bcd(tm->tm_mon + 1);
0243 tm->tm_year = bin2bcd(tm->tm_year - 100);
0244
0245
0246
0247
0248
0249 tm->tm_wday = (!tm->tm_wday) ? 7 : tm->tm_wday;
0250 }
0251
0252
0253 static void bcd2tm(struct rtc_time *tm)
0254 {
0255 tm->tm_sec = bcd2bin(tm->tm_sec);
0256 tm->tm_min = bcd2bin(tm->tm_min);
0257 tm->tm_hour = bcd2bin(tm->tm_hour);
0258
0259 tm->tm_mday = bcd2bin(tm->tm_mday);
0260 tm->tm_mon = bcd2bin(tm->tm_mon) - 1;
0261 tm->tm_year = bcd2bin(tm->tm_year) + 100;
0262
0263
0264
0265
0266
0267 tm->tm_wday %= 7;
0268 }
0269
0270 static int stm32_rtc_read_time(struct device *dev, struct rtc_time *tm)
0271 {
0272 struct stm32_rtc *rtc = dev_get_drvdata(dev);
0273 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0274 unsigned int tr, dr;
0275
0276
0277 tr = readl_relaxed(rtc->base + regs->tr);
0278 dr = readl_relaxed(rtc->base + regs->dr);
0279
0280 tm->tm_sec = (tr & STM32_RTC_TR_SEC) >> STM32_RTC_TR_SEC_SHIFT;
0281 tm->tm_min = (tr & STM32_RTC_TR_MIN) >> STM32_RTC_TR_MIN_SHIFT;
0282 tm->tm_hour = (tr & STM32_RTC_TR_HOUR) >> STM32_RTC_TR_HOUR_SHIFT;
0283
0284 tm->tm_mday = (dr & STM32_RTC_DR_DATE) >> STM32_RTC_DR_DATE_SHIFT;
0285 tm->tm_mon = (dr & STM32_RTC_DR_MONTH) >> STM32_RTC_DR_MONTH_SHIFT;
0286 tm->tm_year = (dr & STM32_RTC_DR_YEAR) >> STM32_RTC_DR_YEAR_SHIFT;
0287 tm->tm_wday = (dr & STM32_RTC_DR_WDAY) >> STM32_RTC_DR_WDAY_SHIFT;
0288
0289
0290
0291 bcd2tm(tm);
0292
0293 return 0;
0294 }
0295
0296 static int stm32_rtc_set_time(struct device *dev, struct rtc_time *tm)
0297 {
0298 struct stm32_rtc *rtc = dev_get_drvdata(dev);
0299 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0300 unsigned int tr, dr;
0301 int ret = 0;
0302
0303 tm2bcd(tm);
0304
0305
0306 tr = ((tm->tm_sec << STM32_RTC_TR_SEC_SHIFT) & STM32_RTC_TR_SEC) |
0307 ((tm->tm_min << STM32_RTC_TR_MIN_SHIFT) & STM32_RTC_TR_MIN) |
0308 ((tm->tm_hour << STM32_RTC_TR_HOUR_SHIFT) & STM32_RTC_TR_HOUR);
0309
0310
0311 dr = ((tm->tm_mday << STM32_RTC_DR_DATE_SHIFT) & STM32_RTC_DR_DATE) |
0312 ((tm->tm_mon << STM32_RTC_DR_MONTH_SHIFT) & STM32_RTC_DR_MONTH) |
0313 ((tm->tm_year << STM32_RTC_DR_YEAR_SHIFT) & STM32_RTC_DR_YEAR) |
0314 ((tm->tm_wday << STM32_RTC_DR_WDAY_SHIFT) & STM32_RTC_DR_WDAY);
0315
0316 stm32_rtc_wpr_unlock(rtc);
0317
0318 ret = stm32_rtc_enter_init_mode(rtc);
0319 if (ret) {
0320 dev_err(dev, "Can't enter in init mode. Set time aborted.\n");
0321 goto end;
0322 }
0323
0324 writel_relaxed(tr, rtc->base + regs->tr);
0325 writel_relaxed(dr, rtc->base + regs->dr);
0326
0327 stm32_rtc_exit_init_mode(rtc);
0328
0329 ret = stm32_rtc_wait_sync(rtc);
0330 end:
0331 stm32_rtc_wpr_lock(rtc);
0332
0333 return ret;
0334 }
0335
0336 static int stm32_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0337 {
0338 struct stm32_rtc *rtc = dev_get_drvdata(dev);
0339 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0340 const struct stm32_rtc_events *evts = &rtc->data->events;
0341 struct rtc_time *tm = &alrm->time;
0342 unsigned int alrmar, cr, status;
0343
0344 alrmar = readl_relaxed(rtc->base + regs->alrmar);
0345 cr = readl_relaxed(rtc->base + regs->cr);
0346 status = readl_relaxed(rtc->base + regs->sr);
0347
0348 if (alrmar & STM32_RTC_ALRMXR_DATE_MASK) {
0349
0350
0351
0352
0353 tm->tm_mday = -1;
0354 tm->tm_wday = -1;
0355 } else {
0356 if (alrmar & STM32_RTC_ALRMXR_WDSEL) {
0357
0358 tm->tm_mday = -1;
0359 tm->tm_wday = (alrmar & STM32_RTC_ALRMXR_WDAY) >>
0360 STM32_RTC_ALRMXR_WDAY_SHIFT;
0361 tm->tm_wday %= 7;
0362 } else {
0363
0364 tm->tm_wday = -1;
0365 tm->tm_mday = (alrmar & STM32_RTC_ALRMXR_DATE) >>
0366 STM32_RTC_ALRMXR_DATE_SHIFT;
0367 }
0368 }
0369
0370 if (alrmar & STM32_RTC_ALRMXR_HOUR_MASK) {
0371
0372 tm->tm_hour = -1;
0373 } else {
0374 tm->tm_hour = (alrmar & STM32_RTC_ALRMXR_HOUR) >>
0375 STM32_RTC_ALRMXR_HOUR_SHIFT;
0376 if (alrmar & STM32_RTC_ALRMXR_PM)
0377 tm->tm_hour += 12;
0378 }
0379
0380 if (alrmar & STM32_RTC_ALRMXR_MIN_MASK) {
0381
0382 tm->tm_min = -1;
0383 } else {
0384 tm->tm_min = (alrmar & STM32_RTC_ALRMXR_MIN) >>
0385 STM32_RTC_ALRMXR_MIN_SHIFT;
0386 }
0387
0388 if (alrmar & STM32_RTC_ALRMXR_SEC_MASK) {
0389
0390 tm->tm_sec = -1;
0391 } else {
0392 tm->tm_sec = (alrmar & STM32_RTC_ALRMXR_SEC) >>
0393 STM32_RTC_ALRMXR_SEC_SHIFT;
0394 }
0395
0396 bcd2tm(tm);
0397
0398 alrm->enabled = (cr & STM32_RTC_CR_ALRAE) ? 1 : 0;
0399 alrm->pending = (status & evts->alra) ? 1 : 0;
0400
0401 return 0;
0402 }
0403
0404 static int stm32_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
0405 {
0406 struct stm32_rtc *rtc = dev_get_drvdata(dev);
0407 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0408 const struct stm32_rtc_events *evts = &rtc->data->events;
0409 unsigned int cr;
0410
0411 cr = readl_relaxed(rtc->base + regs->cr);
0412
0413 stm32_rtc_wpr_unlock(rtc);
0414
0415
0416 if (enabled)
0417 cr |= (STM32_RTC_CR_ALRAIE | STM32_RTC_CR_ALRAE);
0418 else
0419 cr &= ~(STM32_RTC_CR_ALRAIE | STM32_RTC_CR_ALRAE);
0420 writel_relaxed(cr, rtc->base + regs->cr);
0421
0422
0423 stm32_rtc_clear_event_flags(rtc, evts->alra);
0424
0425 stm32_rtc_wpr_lock(rtc);
0426
0427 return 0;
0428 }
0429
0430 static int stm32_rtc_valid_alrm(struct stm32_rtc *rtc, struct rtc_time *tm)
0431 {
0432 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0433 int cur_day, cur_mon, cur_year, cur_hour, cur_min, cur_sec;
0434 unsigned int dr = readl_relaxed(rtc->base + regs->dr);
0435 unsigned int tr = readl_relaxed(rtc->base + regs->tr);
0436
0437 cur_day = (dr & STM32_RTC_DR_DATE) >> STM32_RTC_DR_DATE_SHIFT;
0438 cur_mon = (dr & STM32_RTC_DR_MONTH) >> STM32_RTC_DR_MONTH_SHIFT;
0439 cur_year = (dr & STM32_RTC_DR_YEAR) >> STM32_RTC_DR_YEAR_SHIFT;
0440 cur_sec = (tr & STM32_RTC_TR_SEC) >> STM32_RTC_TR_SEC_SHIFT;
0441 cur_min = (tr & STM32_RTC_TR_MIN) >> STM32_RTC_TR_MIN_SHIFT;
0442 cur_hour = (tr & STM32_RTC_TR_HOUR) >> STM32_RTC_TR_HOUR_SHIFT;
0443
0444
0445
0446
0447
0448
0449
0450
0451 if ((((tm->tm_year > cur_year) &&
0452 (tm->tm_mon == 0x1) && (cur_mon == 0x12)) ||
0453 ((tm->tm_year == cur_year) &&
0454 (tm->tm_mon <= cur_mon + 1))) &&
0455 ((tm->tm_mday > cur_day) ||
0456 ((tm->tm_mday == cur_day) &&
0457 ((tm->tm_hour > cur_hour) ||
0458 ((tm->tm_hour == cur_hour) && (tm->tm_min > cur_min)) ||
0459 ((tm->tm_hour == cur_hour) && (tm->tm_min == cur_min) &&
0460 (tm->tm_sec >= cur_sec))))))
0461 return 0;
0462
0463 return -EINVAL;
0464 }
0465
0466 static int stm32_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0467 {
0468 struct stm32_rtc *rtc = dev_get_drvdata(dev);
0469 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0470 struct rtc_time *tm = &alrm->time;
0471 unsigned int cr, isr, alrmar;
0472 int ret = 0;
0473
0474 tm2bcd(tm);
0475
0476
0477
0478
0479
0480 if (stm32_rtc_valid_alrm(rtc, tm) < 0) {
0481 dev_err(dev, "Alarm can be set only on upcoming month.\n");
0482 return -EINVAL;
0483 }
0484
0485 alrmar = 0;
0486
0487 alrmar |= (tm->tm_mday << STM32_RTC_ALRMXR_DATE_SHIFT) &
0488 STM32_RTC_ALRMXR_DATE;
0489
0490 alrmar &= ~STM32_RTC_ALRMXR_PM;
0491 alrmar |= (tm->tm_hour << STM32_RTC_ALRMXR_HOUR_SHIFT) &
0492 STM32_RTC_ALRMXR_HOUR;
0493 alrmar |= (tm->tm_min << STM32_RTC_ALRMXR_MIN_SHIFT) &
0494 STM32_RTC_ALRMXR_MIN;
0495 alrmar |= (tm->tm_sec << STM32_RTC_ALRMXR_SEC_SHIFT) &
0496 STM32_RTC_ALRMXR_SEC;
0497
0498 stm32_rtc_wpr_unlock(rtc);
0499
0500
0501 cr = readl_relaxed(rtc->base + regs->cr);
0502 cr &= ~STM32_RTC_CR_ALRAE;
0503 writel_relaxed(cr, rtc->base + regs->cr);
0504
0505
0506
0507
0508
0509 ret = readl_relaxed_poll_timeout_atomic(rtc->base + regs->isr,
0510 isr,
0511 (isr & STM32_RTC_ISR_ALRAWF),
0512 10, 100000);
0513
0514 if (ret) {
0515 dev_err(dev, "Alarm update not allowed\n");
0516 goto end;
0517 }
0518
0519
0520 writel_relaxed(alrmar, rtc->base + regs->alrmar);
0521
0522 stm32_rtc_alarm_irq_enable(dev, alrm->enabled);
0523 end:
0524 stm32_rtc_wpr_lock(rtc);
0525
0526 return ret;
0527 }
0528
0529 static const struct rtc_class_ops stm32_rtc_ops = {
0530 .read_time = stm32_rtc_read_time,
0531 .set_time = stm32_rtc_set_time,
0532 .read_alarm = stm32_rtc_read_alarm,
0533 .set_alarm = stm32_rtc_set_alarm,
0534 .alarm_irq_enable = stm32_rtc_alarm_irq_enable,
0535 };
0536
0537 static void stm32_rtc_clear_events(struct stm32_rtc *rtc,
0538 unsigned int flags)
0539 {
0540 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0541
0542
0543 writel_relaxed(readl_relaxed(rtc->base + regs->isr) & ~flags,
0544 rtc->base + regs->isr);
0545 }
0546
0547 static const struct stm32_rtc_data stm32_rtc_data = {
0548 .has_pclk = false,
0549 .need_dbp = true,
0550 .has_wakeirq = false,
0551 .regs = {
0552 .tr = 0x00,
0553 .dr = 0x04,
0554 .cr = 0x08,
0555 .isr = 0x0C,
0556 .prer = 0x10,
0557 .alrmar = 0x1C,
0558 .wpr = 0x24,
0559 .sr = 0x0C,
0560 .scr = UNDEF_REG,
0561 .verr = UNDEF_REG,
0562 },
0563 .events = {
0564 .alra = STM32_RTC_ISR_ALRAF,
0565 },
0566 .clear_events = stm32_rtc_clear_events,
0567 };
0568
0569 static const struct stm32_rtc_data stm32h7_rtc_data = {
0570 .has_pclk = true,
0571 .need_dbp = true,
0572 .has_wakeirq = false,
0573 .regs = {
0574 .tr = 0x00,
0575 .dr = 0x04,
0576 .cr = 0x08,
0577 .isr = 0x0C,
0578 .prer = 0x10,
0579 .alrmar = 0x1C,
0580 .wpr = 0x24,
0581 .sr = 0x0C,
0582 .scr = UNDEF_REG,
0583 .verr = UNDEF_REG,
0584 },
0585 .events = {
0586 .alra = STM32_RTC_ISR_ALRAF,
0587 },
0588 .clear_events = stm32_rtc_clear_events,
0589 };
0590
0591 static void stm32mp1_rtc_clear_events(struct stm32_rtc *rtc,
0592 unsigned int flags)
0593 {
0594 struct stm32_rtc_registers regs = rtc->data->regs;
0595
0596
0597 writel_relaxed(flags, rtc->base + regs.scr);
0598 }
0599
0600 static const struct stm32_rtc_data stm32mp1_data = {
0601 .has_pclk = true,
0602 .need_dbp = false,
0603 .has_wakeirq = true,
0604 .regs = {
0605 .tr = 0x00,
0606 .dr = 0x04,
0607 .cr = 0x18,
0608 .isr = 0x0C,
0609 .prer = 0x10,
0610 .alrmar = 0x40,
0611 .wpr = 0x24,
0612 .sr = 0x50,
0613 .scr = 0x5C,
0614 .verr = 0x3F4,
0615 },
0616 .events = {
0617 .alra = STM32_RTC_SR_ALRA,
0618 },
0619 .clear_events = stm32mp1_rtc_clear_events,
0620 };
0621
0622 static const struct of_device_id stm32_rtc_of_match[] = {
0623 { .compatible = "st,stm32-rtc", .data = &stm32_rtc_data },
0624 { .compatible = "st,stm32h7-rtc", .data = &stm32h7_rtc_data },
0625 { .compatible = "st,stm32mp1-rtc", .data = &stm32mp1_data },
0626 {}
0627 };
0628 MODULE_DEVICE_TABLE(of, stm32_rtc_of_match);
0629
0630 static int stm32_rtc_init(struct platform_device *pdev,
0631 struct stm32_rtc *rtc)
0632 {
0633 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0634 unsigned int prer, pred_a, pred_s, pred_a_max, pred_s_max, cr;
0635 unsigned int rate;
0636 int ret = 0;
0637
0638 rate = clk_get_rate(rtc->rtc_ck);
0639
0640
0641 pred_a_max = STM32_RTC_PRER_PRED_A >> STM32_RTC_PRER_PRED_A_SHIFT;
0642 pred_s_max = STM32_RTC_PRER_PRED_S >> STM32_RTC_PRER_PRED_S_SHIFT;
0643
0644 for (pred_a = pred_a_max; pred_a + 1 > 0; pred_a--) {
0645 pred_s = (rate / (pred_a + 1)) - 1;
0646
0647 if (((pred_s + 1) * (pred_a + 1)) == rate)
0648 break;
0649 }
0650
0651
0652
0653
0654
0655 if ((pred_s > pred_s_max) || (pred_a > pred_a_max)) {
0656 pred_a = pred_a_max;
0657 pred_s = (rate / (pred_a + 1)) - 1;
0658
0659 dev_warn(&pdev->dev, "rtc_ck is %s\n",
0660 (rate < ((pred_a + 1) * (pred_s + 1))) ?
0661 "fast" : "slow");
0662 }
0663
0664 stm32_rtc_wpr_unlock(rtc);
0665
0666 ret = stm32_rtc_enter_init_mode(rtc);
0667 if (ret) {
0668 dev_err(&pdev->dev,
0669 "Can't enter in init mode. Prescaler config failed.\n");
0670 goto end;
0671 }
0672
0673 prer = (pred_s << STM32_RTC_PRER_PRED_S_SHIFT) & STM32_RTC_PRER_PRED_S;
0674 writel_relaxed(prer, rtc->base + regs->prer);
0675 prer |= (pred_a << STM32_RTC_PRER_PRED_A_SHIFT) & STM32_RTC_PRER_PRED_A;
0676 writel_relaxed(prer, rtc->base + regs->prer);
0677
0678
0679 cr = readl_relaxed(rtc->base + regs->cr);
0680 cr &= ~STM32_RTC_CR_FMT;
0681 writel_relaxed(cr, rtc->base + regs->cr);
0682
0683 stm32_rtc_exit_init_mode(rtc);
0684
0685 ret = stm32_rtc_wait_sync(rtc);
0686 end:
0687 stm32_rtc_wpr_lock(rtc);
0688
0689 return ret;
0690 }
0691
0692 static int stm32_rtc_probe(struct platform_device *pdev)
0693 {
0694 struct stm32_rtc *rtc;
0695 const struct stm32_rtc_registers *regs;
0696 int ret;
0697
0698 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
0699 if (!rtc)
0700 return -ENOMEM;
0701
0702 rtc->base = devm_platform_ioremap_resource(pdev, 0);
0703 if (IS_ERR(rtc->base))
0704 return PTR_ERR(rtc->base);
0705
0706 rtc->data = (struct stm32_rtc_data *)
0707 of_device_get_match_data(&pdev->dev);
0708 regs = &rtc->data->regs;
0709
0710 if (rtc->data->need_dbp) {
0711 rtc->dbp = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
0712 "st,syscfg");
0713 if (IS_ERR(rtc->dbp)) {
0714 dev_err(&pdev->dev, "no st,syscfg\n");
0715 return PTR_ERR(rtc->dbp);
0716 }
0717
0718 ret = of_property_read_u32_index(pdev->dev.of_node, "st,syscfg",
0719 1, &rtc->dbp_reg);
0720 if (ret) {
0721 dev_err(&pdev->dev, "can't read DBP register offset\n");
0722 return ret;
0723 }
0724
0725 ret = of_property_read_u32_index(pdev->dev.of_node, "st,syscfg",
0726 2, &rtc->dbp_mask);
0727 if (ret) {
0728 dev_err(&pdev->dev, "can't read DBP register mask\n");
0729 return ret;
0730 }
0731 }
0732
0733 if (!rtc->data->has_pclk) {
0734 rtc->pclk = NULL;
0735 rtc->rtc_ck = devm_clk_get(&pdev->dev, NULL);
0736 } else {
0737 rtc->pclk = devm_clk_get(&pdev->dev, "pclk");
0738 if (IS_ERR(rtc->pclk)) {
0739 dev_err(&pdev->dev, "no pclk clock");
0740 return PTR_ERR(rtc->pclk);
0741 }
0742 rtc->rtc_ck = devm_clk_get(&pdev->dev, "rtc_ck");
0743 }
0744 if (IS_ERR(rtc->rtc_ck)) {
0745 dev_err(&pdev->dev, "no rtc_ck clock");
0746 return PTR_ERR(rtc->rtc_ck);
0747 }
0748
0749 if (rtc->data->has_pclk) {
0750 ret = clk_prepare_enable(rtc->pclk);
0751 if (ret)
0752 return ret;
0753 }
0754
0755 ret = clk_prepare_enable(rtc->rtc_ck);
0756 if (ret)
0757 goto err_no_rtc_ck;
0758
0759 if (rtc->data->need_dbp)
0760 regmap_update_bits(rtc->dbp, rtc->dbp_reg,
0761 rtc->dbp_mask, rtc->dbp_mask);
0762
0763
0764
0765
0766
0767
0768
0769
0770
0771 ret = stm32_rtc_init(pdev, rtc);
0772 if (ret)
0773 goto err;
0774
0775 rtc->irq_alarm = platform_get_irq(pdev, 0);
0776 if (rtc->irq_alarm <= 0) {
0777 ret = rtc->irq_alarm;
0778 goto err;
0779 }
0780
0781 ret = device_init_wakeup(&pdev->dev, true);
0782 if (rtc->data->has_wakeirq) {
0783 rtc->wakeirq_alarm = platform_get_irq(pdev, 1);
0784 if (rtc->wakeirq_alarm > 0) {
0785 ret = dev_pm_set_dedicated_wake_irq(&pdev->dev,
0786 rtc->wakeirq_alarm);
0787 } else {
0788 ret = rtc->wakeirq_alarm;
0789 if (rtc->wakeirq_alarm == -EPROBE_DEFER)
0790 goto err;
0791 }
0792 }
0793 if (ret)
0794 dev_warn(&pdev->dev, "alarm can't wake up the system: %d", ret);
0795
0796 platform_set_drvdata(pdev, rtc);
0797
0798 rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, pdev->name,
0799 &stm32_rtc_ops, THIS_MODULE);
0800 if (IS_ERR(rtc->rtc_dev)) {
0801 ret = PTR_ERR(rtc->rtc_dev);
0802 dev_err(&pdev->dev, "rtc device registration failed, err=%d\n",
0803 ret);
0804 goto err;
0805 }
0806
0807
0808 ret = devm_request_threaded_irq(&pdev->dev, rtc->irq_alarm, NULL,
0809 stm32_rtc_alarm_irq, IRQF_ONESHOT,
0810 pdev->name, rtc);
0811 if (ret) {
0812 dev_err(&pdev->dev, "IRQ%d (alarm interrupt) already claimed\n",
0813 rtc->irq_alarm);
0814 goto err;
0815 }
0816
0817
0818
0819
0820
0821 if (!(readl_relaxed(rtc->base + regs->isr) & STM32_RTC_ISR_INITS))
0822 dev_warn(&pdev->dev, "Date/Time must be initialized\n");
0823
0824 if (regs->verr != UNDEF_REG) {
0825 u32 ver = readl_relaxed(rtc->base + regs->verr);
0826
0827 dev_info(&pdev->dev, "registered rev:%d.%d\n",
0828 (ver >> STM32_RTC_VERR_MAJREV_SHIFT) & 0xF,
0829 (ver >> STM32_RTC_VERR_MINREV_SHIFT) & 0xF);
0830 }
0831
0832 return 0;
0833
0834 err:
0835 clk_disable_unprepare(rtc->rtc_ck);
0836 err_no_rtc_ck:
0837 if (rtc->data->has_pclk)
0838 clk_disable_unprepare(rtc->pclk);
0839
0840 if (rtc->data->need_dbp)
0841 regmap_update_bits(rtc->dbp, rtc->dbp_reg, rtc->dbp_mask, 0);
0842
0843 dev_pm_clear_wake_irq(&pdev->dev);
0844 device_init_wakeup(&pdev->dev, false);
0845
0846 return ret;
0847 }
0848
0849 static int stm32_rtc_remove(struct platform_device *pdev)
0850 {
0851 struct stm32_rtc *rtc = platform_get_drvdata(pdev);
0852 const struct stm32_rtc_registers *regs = &rtc->data->regs;
0853 unsigned int cr;
0854
0855
0856 stm32_rtc_wpr_unlock(rtc);
0857 cr = readl_relaxed(rtc->base + regs->cr);
0858 cr &= ~STM32_RTC_CR_ALRAIE;
0859 writel_relaxed(cr, rtc->base + regs->cr);
0860 stm32_rtc_wpr_lock(rtc);
0861
0862 clk_disable_unprepare(rtc->rtc_ck);
0863 if (rtc->data->has_pclk)
0864 clk_disable_unprepare(rtc->pclk);
0865
0866
0867 if (rtc->data->need_dbp)
0868 regmap_update_bits(rtc->dbp, rtc->dbp_reg, rtc->dbp_mask, 0);
0869
0870 dev_pm_clear_wake_irq(&pdev->dev);
0871 device_init_wakeup(&pdev->dev, false);
0872
0873 return 0;
0874 }
0875
0876 #ifdef CONFIG_PM_SLEEP
0877 static int stm32_rtc_suspend(struct device *dev)
0878 {
0879 struct stm32_rtc *rtc = dev_get_drvdata(dev);
0880
0881 if (rtc->data->has_pclk)
0882 clk_disable_unprepare(rtc->pclk);
0883
0884 if (device_may_wakeup(dev))
0885 return enable_irq_wake(rtc->irq_alarm);
0886
0887 return 0;
0888 }
0889
0890 static int stm32_rtc_resume(struct device *dev)
0891 {
0892 struct stm32_rtc *rtc = dev_get_drvdata(dev);
0893 int ret = 0;
0894
0895 if (rtc->data->has_pclk) {
0896 ret = clk_prepare_enable(rtc->pclk);
0897 if (ret)
0898 return ret;
0899 }
0900
0901 ret = stm32_rtc_wait_sync(rtc);
0902 if (ret < 0) {
0903 if (rtc->data->has_pclk)
0904 clk_disable_unprepare(rtc->pclk);
0905 return ret;
0906 }
0907
0908 if (device_may_wakeup(dev))
0909 return disable_irq_wake(rtc->irq_alarm);
0910
0911 return ret;
0912 }
0913 #endif
0914
0915 static SIMPLE_DEV_PM_OPS(stm32_rtc_pm_ops,
0916 stm32_rtc_suspend, stm32_rtc_resume);
0917
0918 static struct platform_driver stm32_rtc_driver = {
0919 .probe = stm32_rtc_probe,
0920 .remove = stm32_rtc_remove,
0921 .driver = {
0922 .name = DRIVER_NAME,
0923 .pm = &stm32_rtc_pm_ops,
0924 .of_match_table = stm32_rtc_of_match,
0925 },
0926 };
0927
0928 module_platform_driver(stm32_rtc_driver);
0929
0930 MODULE_ALIAS("platform:" DRIVER_NAME);
0931 MODULE_AUTHOR("Amelie Delaunay <amelie.delaunay@st.com>");
0932 MODULE_DESCRIPTION("STMicroelectronics STM32 Real Time Clock driver");
0933 MODULE_LICENSE("GPL v2");