0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/module.h>
0012 #include <linux/kernel.h>
0013 #include <linux/time.h>
0014 #include <linux/rtc.h>
0015 #include <linux/slab.h>
0016 #include <linux/bcd.h>
0017 #include <linux/interrupt.h>
0018 #include <linux/ioctl.h>
0019 #include <linux/completion.h>
0020 #include <linux/mfd/wm831x/core.h>
0021 #include <linux/delay.h>
0022 #include <linux/platform_device.h>
0023 #include <linux/random.h>
0024
0025
0026
0027
0028 #define WM831X_RTC_WR_CNT_MASK 0xFFFF
0029 #define WM831X_RTC_WR_CNT_SHIFT 0
0030 #define WM831X_RTC_WR_CNT_WIDTH 16
0031
0032
0033
0034
0035 #define WM831X_RTC_TIME_MASK 0xFFFF
0036 #define WM831X_RTC_TIME_SHIFT 0
0037 #define WM831X_RTC_TIME_WIDTH 16
0038
0039
0040
0041
0042 #define WM831X_RTC_TIME_MASK 0xFFFF
0043 #define WM831X_RTC_TIME_SHIFT 0
0044 #define WM831X_RTC_TIME_WIDTH 16
0045
0046
0047
0048
0049 #define WM831X_RTC_ALM_MASK 0xFFFF
0050 #define WM831X_RTC_ALM_SHIFT 0
0051 #define WM831X_RTC_ALM_WIDTH 16
0052
0053
0054
0055
0056 #define WM831X_RTC_ALM_MASK 0xFFFF
0057 #define WM831X_RTC_ALM_SHIFT 0
0058 #define WM831X_RTC_ALM_WIDTH 16
0059
0060
0061
0062
0063 #define WM831X_RTC_VALID 0x8000
0064 #define WM831X_RTC_VALID_MASK 0x8000
0065 #define WM831X_RTC_VALID_SHIFT 15
0066 #define WM831X_RTC_VALID_WIDTH 1
0067 #define WM831X_RTC_SYNC_BUSY 0x4000
0068 #define WM831X_RTC_SYNC_BUSY_MASK 0x4000
0069 #define WM831X_RTC_SYNC_BUSY_SHIFT 14
0070 #define WM831X_RTC_SYNC_BUSY_WIDTH 1
0071 #define WM831X_RTC_ALM_ENA 0x0400
0072 #define WM831X_RTC_ALM_ENA_MASK 0x0400
0073 #define WM831X_RTC_ALM_ENA_SHIFT 10
0074 #define WM831X_RTC_ALM_ENA_WIDTH 1
0075 #define WM831X_RTC_PINT_FREQ_MASK 0x0070
0076 #define WM831X_RTC_PINT_FREQ_SHIFT 4
0077 #define WM831X_RTC_PINT_FREQ_WIDTH 3
0078
0079
0080
0081
0082 #define WM831X_RTC_TRIM_MASK 0x03FF
0083 #define WM831X_RTC_TRIM_SHIFT 0
0084 #define WM831X_RTC_TRIM_WIDTH 10
0085
0086 #define WM831X_SET_TIME_RETRIES 5
0087 #define WM831X_GET_TIME_RETRIES 5
0088
0089 struct wm831x_rtc {
0090 struct wm831x *wm831x;
0091 struct rtc_device *rtc;
0092 unsigned int alarm_enabled:1;
0093 };
0094
0095 static void wm831x_rtc_add_randomness(struct wm831x *wm831x)
0096 {
0097 int ret;
0098 u16 reg;
0099
0100
0101
0102
0103
0104
0105 ret = wm831x_reg_read(wm831x, WM831X_RTC_WRITE_COUNTER);
0106 if (ret >= 0) {
0107 reg = ret;
0108 add_device_randomness(®, sizeof(reg));
0109 } else {
0110 dev_warn(wm831x->dev, "Failed to read RTC write counter: %d\n",
0111 ret);
0112 }
0113 }
0114
0115
0116
0117
0118 static int wm831x_rtc_readtime(struct device *dev, struct rtc_time *tm)
0119 {
0120 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);
0121 struct wm831x *wm831x = wm831x_rtc->wm831x;
0122 u16 time1[2], time2[2];
0123 int ret;
0124 int count = 0;
0125
0126
0127 ret = wm831x_reg_read(wm831x, WM831X_RTC_CONTROL);
0128 if (ret < 0) {
0129 dev_err(dev, "Failed to read RTC control: %d\n", ret);
0130 return ret;
0131 }
0132 if (!(ret & WM831X_RTC_VALID)) {
0133 dev_dbg(dev, "RTC not yet configured\n");
0134 return -EINVAL;
0135 }
0136
0137
0138
0139
0140 do {
0141 ret = wm831x_bulk_read(wm831x, WM831X_RTC_TIME_1,
0142 2, time1);
0143 if (ret != 0)
0144 continue;
0145
0146 ret = wm831x_bulk_read(wm831x, WM831X_RTC_TIME_1,
0147 2, time2);
0148 if (ret != 0)
0149 continue;
0150
0151 if (memcmp(time1, time2, sizeof(time1)) == 0) {
0152 u32 time = (time1[0] << 16) | time1[1];
0153
0154 rtc_time64_to_tm(time, tm);
0155 return 0;
0156 }
0157
0158 } while (++count < WM831X_GET_TIME_RETRIES);
0159
0160 dev_err(dev, "Timed out reading current time\n");
0161
0162 return -EIO;
0163 }
0164
0165
0166
0167
0168 static int wm831x_rtc_settime(struct device *dev, struct rtc_time *tm)
0169 {
0170 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);
0171 struct wm831x *wm831x = wm831x_rtc->wm831x;
0172 struct rtc_time new_tm;
0173 unsigned long time, new_time;
0174 int ret;
0175 int count = 0;
0176
0177 time = rtc_tm_to_time64(tm);
0178
0179 ret = wm831x_reg_write(wm831x, WM831X_RTC_TIME_1,
0180 (time >> 16) & 0xffff);
0181 if (ret < 0) {
0182 dev_err(dev, "Failed to write TIME_1: %d\n", ret);
0183 return ret;
0184 }
0185
0186 ret = wm831x_reg_write(wm831x, WM831X_RTC_TIME_2, time & 0xffff);
0187 if (ret < 0) {
0188 dev_err(dev, "Failed to write TIME_2: %d\n", ret);
0189 return ret;
0190 }
0191
0192
0193
0194
0195 do {
0196 msleep(1);
0197
0198 ret = wm831x_reg_read(wm831x, WM831X_RTC_CONTROL);
0199 if (ret < 0)
0200 ret = WM831X_RTC_SYNC_BUSY;
0201 } while (!(ret & WM831X_RTC_SYNC_BUSY) &&
0202 ++count < WM831X_SET_TIME_RETRIES);
0203
0204 if (ret & WM831X_RTC_SYNC_BUSY) {
0205 dev_err(dev, "Timed out writing RTC update\n");
0206 return -EIO;
0207 }
0208
0209
0210
0211
0212 ret = wm831x_rtc_readtime(dev, &new_tm);
0213 if (ret < 0)
0214 return ret;
0215
0216 new_time = rtc_tm_to_time64(&new_tm);
0217
0218
0219 if (new_time - time > 1) {
0220 dev_err(dev, "RTC update not permitted by hardware\n");
0221 return -EPERM;
0222 }
0223
0224 return 0;
0225 }
0226
0227
0228
0229
0230 static int wm831x_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
0231 {
0232 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);
0233 int ret;
0234 u16 data[2];
0235 u32 time;
0236
0237 ret = wm831x_bulk_read(wm831x_rtc->wm831x, WM831X_RTC_ALARM_1,
0238 2, data);
0239 if (ret != 0) {
0240 dev_err(dev, "Failed to read alarm time: %d\n", ret);
0241 return ret;
0242 }
0243
0244 time = (data[0] << 16) | data[1];
0245
0246 rtc_time64_to_tm(time, &alrm->time);
0247
0248 ret = wm831x_reg_read(wm831x_rtc->wm831x, WM831X_RTC_CONTROL);
0249 if (ret < 0) {
0250 dev_err(dev, "Failed to read RTC control: %d\n", ret);
0251 return ret;
0252 }
0253
0254 if (ret & WM831X_RTC_ALM_ENA)
0255 alrm->enabled = 1;
0256 else
0257 alrm->enabled = 0;
0258
0259 return 0;
0260 }
0261
0262 static int wm831x_rtc_stop_alarm(struct wm831x_rtc *wm831x_rtc)
0263 {
0264 wm831x_rtc->alarm_enabled = 0;
0265
0266 return wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL,
0267 WM831X_RTC_ALM_ENA, 0);
0268 }
0269
0270 static int wm831x_rtc_start_alarm(struct wm831x_rtc *wm831x_rtc)
0271 {
0272 wm831x_rtc->alarm_enabled = 1;
0273
0274 return wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL,
0275 WM831X_RTC_ALM_ENA, WM831X_RTC_ALM_ENA);
0276 }
0277
0278 static int wm831x_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
0279 {
0280 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);
0281 struct wm831x *wm831x = wm831x_rtc->wm831x;
0282 int ret;
0283 unsigned long time;
0284
0285 time = rtc_tm_to_time64(&alrm->time);
0286
0287 ret = wm831x_rtc_stop_alarm(wm831x_rtc);
0288 if (ret < 0) {
0289 dev_err(dev, "Failed to stop alarm: %d\n", ret);
0290 return ret;
0291 }
0292
0293 ret = wm831x_reg_write(wm831x, WM831X_RTC_ALARM_1,
0294 (time >> 16) & 0xffff);
0295 if (ret < 0) {
0296 dev_err(dev, "Failed to write ALARM_1: %d\n", ret);
0297 return ret;
0298 }
0299
0300 ret = wm831x_reg_write(wm831x, WM831X_RTC_ALARM_2, time & 0xffff);
0301 if (ret < 0) {
0302 dev_err(dev, "Failed to write ALARM_2: %d\n", ret);
0303 return ret;
0304 }
0305
0306 if (alrm->enabled) {
0307 ret = wm831x_rtc_start_alarm(wm831x_rtc);
0308 if (ret < 0) {
0309 dev_err(dev, "Failed to start alarm: %d\n", ret);
0310 return ret;
0311 }
0312 }
0313
0314 return 0;
0315 }
0316
0317 static int wm831x_rtc_alarm_irq_enable(struct device *dev,
0318 unsigned int enabled)
0319 {
0320 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);
0321
0322 if (enabled)
0323 return wm831x_rtc_start_alarm(wm831x_rtc);
0324 else
0325 return wm831x_rtc_stop_alarm(wm831x_rtc);
0326 }
0327
0328 static irqreturn_t wm831x_alm_irq(int irq, void *data)
0329 {
0330 struct wm831x_rtc *wm831x_rtc = data;
0331
0332 rtc_update_irq(wm831x_rtc->rtc, 1, RTC_IRQF | RTC_AF);
0333
0334 return IRQ_HANDLED;
0335 }
0336
0337 static const struct rtc_class_ops wm831x_rtc_ops = {
0338 .read_time = wm831x_rtc_readtime,
0339 .set_time = wm831x_rtc_settime,
0340 .read_alarm = wm831x_rtc_readalarm,
0341 .set_alarm = wm831x_rtc_setalarm,
0342 .alarm_irq_enable = wm831x_rtc_alarm_irq_enable,
0343 };
0344
0345 #ifdef CONFIG_PM
0346
0347 static int wm831x_rtc_suspend(struct device *dev)
0348 {
0349 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);
0350 int ret, enable;
0351
0352 if (wm831x_rtc->alarm_enabled && device_may_wakeup(dev))
0353 enable = WM831X_RTC_ALM_ENA;
0354 else
0355 enable = 0;
0356
0357 ret = wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL,
0358 WM831X_RTC_ALM_ENA, enable);
0359 if (ret != 0)
0360 dev_err(dev, "Failed to update RTC alarm: %d\n", ret);
0361
0362 return 0;
0363 }
0364
0365
0366
0367
0368 static int wm831x_rtc_resume(struct device *dev)
0369 {
0370 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);
0371 int ret;
0372
0373 if (wm831x_rtc->alarm_enabled) {
0374 ret = wm831x_rtc_start_alarm(wm831x_rtc);
0375 if (ret != 0)
0376 dev_err(dev, "Failed to restart RTC alarm: %d\n", ret);
0377 }
0378
0379 return 0;
0380 }
0381
0382
0383 static int wm831x_rtc_freeze(struct device *dev)
0384 {
0385 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev);
0386 int ret;
0387
0388 ret = wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL,
0389 WM831X_RTC_ALM_ENA, 0);
0390 if (ret != 0)
0391 dev_err(dev, "Failed to stop RTC alarm: %d\n", ret);
0392
0393 return 0;
0394 }
0395 #else
0396 #define wm831x_rtc_suspend NULL
0397 #define wm831x_rtc_resume NULL
0398 #define wm831x_rtc_freeze NULL
0399 #endif
0400
0401 static int wm831x_rtc_probe(struct platform_device *pdev)
0402 {
0403 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
0404 struct wm831x_rtc *wm831x_rtc;
0405 int alm_irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "ALM"));
0406 int ret = 0;
0407
0408 wm831x_rtc = devm_kzalloc(&pdev->dev, sizeof(*wm831x_rtc), GFP_KERNEL);
0409 if (wm831x_rtc == NULL)
0410 return -ENOMEM;
0411
0412 platform_set_drvdata(pdev, wm831x_rtc);
0413 wm831x_rtc->wm831x = wm831x;
0414
0415 ret = wm831x_reg_read(wm831x, WM831X_RTC_CONTROL);
0416 if (ret < 0) {
0417 dev_err(&pdev->dev, "Failed to read RTC control: %d\n", ret);
0418 return ret;
0419 }
0420 if (ret & WM831X_RTC_ALM_ENA)
0421 wm831x_rtc->alarm_enabled = 1;
0422
0423 device_init_wakeup(&pdev->dev, 1);
0424
0425 wm831x_rtc->rtc = devm_rtc_allocate_device(&pdev->dev);
0426 if (IS_ERR(wm831x_rtc->rtc))
0427 return PTR_ERR(wm831x_rtc->rtc);
0428
0429 wm831x_rtc->rtc->ops = &wm831x_rtc_ops;
0430 wm831x_rtc->rtc->range_max = U32_MAX;
0431
0432 ret = devm_rtc_register_device(wm831x_rtc->rtc);
0433 if (ret)
0434 return ret;
0435
0436 ret = devm_request_threaded_irq(&pdev->dev, alm_irq, NULL,
0437 wm831x_alm_irq,
0438 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
0439 "RTC alarm",
0440 wm831x_rtc);
0441 if (ret != 0) {
0442 dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n",
0443 alm_irq, ret);
0444 }
0445
0446 wm831x_rtc_add_randomness(wm831x);
0447
0448 return 0;
0449 }
0450
0451 static const struct dev_pm_ops wm831x_rtc_pm_ops = {
0452 .suspend = wm831x_rtc_suspend,
0453 .resume = wm831x_rtc_resume,
0454
0455 .freeze = wm831x_rtc_freeze,
0456 .thaw = wm831x_rtc_resume,
0457 .restore = wm831x_rtc_resume,
0458
0459 .poweroff = wm831x_rtc_suspend,
0460 };
0461
0462 static struct platform_driver wm831x_rtc_driver = {
0463 .probe = wm831x_rtc_probe,
0464 .driver = {
0465 .name = "wm831x-rtc",
0466 .pm = &wm831x_rtc_pm_ops,
0467 },
0468 };
0469
0470 module_platform_driver(wm831x_rtc_driver);
0471
0472 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
0473 MODULE_DESCRIPTION("RTC driver for the WM831x series PMICs");
0474 MODULE_LICENSE("GPL");
0475 MODULE_ALIAS("platform:wm831x-rtc");