rtc-wm831x.c revision 471452104b8520337ae2fb48c4e61cd4896e025d
1/* 2 * Real Time Clock driver for Wolfson Microelectronics WM831x 3 * 4 * Copyright (C) 2009 Wolfson Microelectronics PLC. 5 * 6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the 10 * Free Software Foundation; either version 2 of the License, or (at your 11 * option) any later version. 12 * 13 */ 14 15#include <linux/module.h> 16#include <linux/kernel.h> 17#include <linux/time.h> 18#include <linux/rtc.h> 19#include <linux/bcd.h> 20#include <linux/interrupt.h> 21#include <linux/ioctl.h> 22#include <linux/completion.h> 23#include <linux/mfd/wm831x/core.h> 24#include <linux/delay.h> 25#include <linux/platform_device.h> 26 27 28/* 29 * R16416 (0x4020) - RTC Write Counter 30 */ 31#define WM831X_RTC_WR_CNT_MASK 0xFFFF /* RTC_WR_CNT - [15:0] */ 32#define WM831X_RTC_WR_CNT_SHIFT 0 /* RTC_WR_CNT - [15:0] */ 33#define WM831X_RTC_WR_CNT_WIDTH 16 /* RTC_WR_CNT - [15:0] */ 34 35/* 36 * R16417 (0x4021) - RTC Time 1 37 */ 38#define WM831X_RTC_TIME_MASK 0xFFFF /* RTC_TIME - [15:0] */ 39#define WM831X_RTC_TIME_SHIFT 0 /* RTC_TIME - [15:0] */ 40#define WM831X_RTC_TIME_WIDTH 16 /* RTC_TIME - [15:0] */ 41 42/* 43 * R16418 (0x4022) - RTC Time 2 44 */ 45#define WM831X_RTC_TIME_MASK 0xFFFF /* RTC_TIME - [15:0] */ 46#define WM831X_RTC_TIME_SHIFT 0 /* RTC_TIME - [15:0] */ 47#define WM831X_RTC_TIME_WIDTH 16 /* RTC_TIME - [15:0] */ 48 49/* 50 * R16419 (0x4023) - RTC Alarm 1 51 */ 52#define WM831X_RTC_ALM_MASK 0xFFFF /* RTC_ALM - [15:0] */ 53#define WM831X_RTC_ALM_SHIFT 0 /* RTC_ALM - [15:0] */ 54#define WM831X_RTC_ALM_WIDTH 16 /* RTC_ALM - [15:0] */ 55 56/* 57 * R16420 (0x4024) - RTC Alarm 2 58 */ 59#define WM831X_RTC_ALM_MASK 0xFFFF /* RTC_ALM - [15:0] */ 60#define WM831X_RTC_ALM_SHIFT 0 /* RTC_ALM - [15:0] */ 61#define WM831X_RTC_ALM_WIDTH 16 /* RTC_ALM - [15:0] */ 62 63/* 64 * R16421 (0x4025) - RTC Control 65 */ 66#define WM831X_RTC_VALID 0x8000 /* RTC_VALID */ 67#define WM831X_RTC_VALID_MASK 0x8000 /* RTC_VALID */ 68#define WM831X_RTC_VALID_SHIFT 15 /* RTC_VALID */ 69#define WM831X_RTC_VALID_WIDTH 1 /* RTC_VALID */ 70#define WM831X_RTC_SYNC_BUSY 0x4000 /* RTC_SYNC_BUSY */ 71#define WM831X_RTC_SYNC_BUSY_MASK 0x4000 /* RTC_SYNC_BUSY */ 72#define WM831X_RTC_SYNC_BUSY_SHIFT 14 /* RTC_SYNC_BUSY */ 73#define WM831X_RTC_SYNC_BUSY_WIDTH 1 /* RTC_SYNC_BUSY */ 74#define WM831X_RTC_ALM_ENA 0x0400 /* RTC_ALM_ENA */ 75#define WM831X_RTC_ALM_ENA_MASK 0x0400 /* RTC_ALM_ENA */ 76#define WM831X_RTC_ALM_ENA_SHIFT 10 /* RTC_ALM_ENA */ 77#define WM831X_RTC_ALM_ENA_WIDTH 1 /* RTC_ALM_ENA */ 78#define WM831X_RTC_PINT_FREQ_MASK 0x0070 /* RTC_PINT_FREQ - [6:4] */ 79#define WM831X_RTC_PINT_FREQ_SHIFT 4 /* RTC_PINT_FREQ - [6:4] */ 80#define WM831X_RTC_PINT_FREQ_WIDTH 3 /* RTC_PINT_FREQ - [6:4] */ 81 82/* 83 * R16422 (0x4026) - RTC Trim 84 */ 85#define WM831X_RTC_TRIM_MASK 0x03FF /* RTC_TRIM - [9:0] */ 86#define WM831X_RTC_TRIM_SHIFT 0 /* RTC_TRIM - [9:0] */ 87#define WM831X_RTC_TRIM_WIDTH 10 /* RTC_TRIM - [9:0] */ 88 89#define WM831X_SET_TIME_RETRIES 5 90#define WM831X_GET_TIME_RETRIES 5 91 92struct wm831x_rtc { 93 struct wm831x *wm831x; 94 struct rtc_device *rtc; 95 unsigned int alarm_enabled:1; 96}; 97 98/* 99 * Read current time and date in RTC 100 */ 101static int wm831x_rtc_readtime(struct device *dev, struct rtc_time *tm) 102{ 103 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev); 104 struct wm831x *wm831x = wm831x_rtc->wm831x; 105 u16 time1[2], time2[2]; 106 int ret; 107 int count = 0; 108 109 /* Has the RTC been programmed? */ 110 ret = wm831x_reg_read(wm831x, WM831X_RTC_CONTROL); 111 if (ret < 0) { 112 dev_err(dev, "Failed to read RTC control: %d\n", ret); 113 return ret; 114 } 115 if (!(ret & WM831X_RTC_VALID)) { 116 dev_dbg(dev, "RTC not yet configured\n"); 117 return -EINVAL; 118 } 119 120 /* Read twice to make sure we don't read a corrupt, partially 121 * incremented, value. 122 */ 123 do { 124 ret = wm831x_bulk_read(wm831x, WM831X_RTC_TIME_1, 125 2, time1); 126 if (ret != 0) 127 continue; 128 129 ret = wm831x_bulk_read(wm831x, WM831X_RTC_TIME_1, 130 2, time2); 131 if (ret != 0) 132 continue; 133 134 if (memcmp(time1, time2, sizeof(time1)) == 0) { 135 u32 time = (time1[0] << 16) | time1[1]; 136 137 rtc_time_to_tm(time, tm); 138 return rtc_valid_tm(tm); 139 } 140 141 } while (++count < WM831X_GET_TIME_RETRIES); 142 143 dev_err(dev, "Timed out reading current time\n"); 144 145 return -EIO; 146} 147 148/* 149 * Set current time and date in RTC 150 */ 151static int wm831x_rtc_set_mmss(struct device *dev, unsigned long time) 152{ 153 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev); 154 struct wm831x *wm831x = wm831x_rtc->wm831x; 155 struct rtc_time new_tm; 156 unsigned long new_time; 157 int ret; 158 int count = 0; 159 160 ret = wm831x_reg_write(wm831x, WM831X_RTC_TIME_1, 161 (time >> 16) & 0xffff); 162 if (ret < 0) { 163 dev_err(dev, "Failed to write TIME_1: %d\n", ret); 164 return ret; 165 } 166 167 ret = wm831x_reg_write(wm831x, WM831X_RTC_TIME_2, time & 0xffff); 168 if (ret < 0) { 169 dev_err(dev, "Failed to write TIME_2: %d\n", ret); 170 return ret; 171 } 172 173 /* Wait for the update to complete - should happen first time 174 * round but be conservative. 175 */ 176 do { 177 msleep(1); 178 179 ret = wm831x_reg_read(wm831x, WM831X_RTC_CONTROL); 180 if (ret < 0) 181 ret = WM831X_RTC_SYNC_BUSY; 182 } while (!(ret & WM831X_RTC_SYNC_BUSY) && 183 ++count < WM831X_SET_TIME_RETRIES); 184 185 if (ret & WM831X_RTC_SYNC_BUSY) { 186 dev_err(dev, "Timed out writing RTC update\n"); 187 return -EIO; 188 } 189 190 /* Check that the update was accepted; security features may 191 * have caused the update to be ignored. 192 */ 193 ret = wm831x_rtc_readtime(dev, &new_tm); 194 if (ret < 0) 195 return ret; 196 197 ret = rtc_tm_to_time(&new_tm, &new_time); 198 if (ret < 0) { 199 dev_err(dev, "Failed to convert time: %d\n", ret); 200 return ret; 201 } 202 203 /* Allow a second of change in case of tick */ 204 if (new_time - time > 1) { 205 dev_err(dev, "RTC update not permitted by hardware\n"); 206 return -EPERM; 207 } 208 209 return 0; 210} 211 212/* 213 * Read alarm time and date in RTC 214 */ 215static int wm831x_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) 216{ 217 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev); 218 int ret; 219 u16 data[2]; 220 u32 time; 221 222 ret = wm831x_bulk_read(wm831x_rtc->wm831x, WM831X_RTC_ALARM_1, 223 2, data); 224 if (ret != 0) { 225 dev_err(dev, "Failed to read alarm time: %d\n", ret); 226 return ret; 227 } 228 229 time = (data[0] << 16) | data[1]; 230 231 rtc_time_to_tm(time, &alrm->time); 232 233 ret = wm831x_reg_read(wm831x_rtc->wm831x, WM831X_RTC_CONTROL); 234 if (ret < 0) { 235 dev_err(dev, "Failed to read RTC control: %d\n", ret); 236 return ret; 237 } 238 239 if (ret & WM831X_RTC_ALM_ENA) 240 alrm->enabled = 1; 241 else 242 alrm->enabled = 0; 243 244 return 0; 245} 246 247static int wm831x_rtc_stop_alarm(struct wm831x_rtc *wm831x_rtc) 248{ 249 wm831x_rtc->alarm_enabled = 0; 250 251 return wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL, 252 WM831X_RTC_ALM_ENA, 0); 253} 254 255static int wm831x_rtc_start_alarm(struct wm831x_rtc *wm831x_rtc) 256{ 257 wm831x_rtc->alarm_enabled = 1; 258 259 return wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL, 260 WM831X_RTC_ALM_ENA, WM831X_RTC_ALM_ENA); 261} 262 263static int wm831x_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) 264{ 265 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev); 266 struct wm831x *wm831x = wm831x_rtc->wm831x; 267 int ret; 268 unsigned long time; 269 270 ret = rtc_tm_to_time(&alrm->time, &time); 271 if (ret < 0) { 272 dev_err(dev, "Failed to convert time: %d\n", ret); 273 return ret; 274 } 275 276 ret = wm831x_rtc_stop_alarm(wm831x_rtc); 277 if (ret < 0) { 278 dev_err(dev, "Failed to stop alarm: %d\n", ret); 279 return ret; 280 } 281 282 ret = wm831x_reg_write(wm831x, WM831X_RTC_ALARM_1, 283 (time >> 16) & 0xffff); 284 if (ret < 0) { 285 dev_err(dev, "Failed to write ALARM_1: %d\n", ret); 286 return ret; 287 } 288 289 ret = wm831x_reg_write(wm831x, WM831X_RTC_ALARM_2, time & 0xffff); 290 if (ret < 0) { 291 dev_err(dev, "Failed to write ALARM_2: %d\n", ret); 292 return ret; 293 } 294 295 if (alrm->enabled) { 296 ret = wm831x_rtc_start_alarm(wm831x_rtc); 297 if (ret < 0) { 298 dev_err(dev, "Failed to start alarm: %d\n", ret); 299 return ret; 300 } 301 } 302 303 return 0; 304} 305 306static int wm831x_rtc_alarm_irq_enable(struct device *dev, 307 unsigned int enabled) 308{ 309 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev); 310 311 if (enabled) 312 return wm831x_rtc_start_alarm(wm831x_rtc); 313 else 314 return wm831x_rtc_stop_alarm(wm831x_rtc); 315} 316 317static int wm831x_rtc_update_irq_enable(struct device *dev, 318 unsigned int enabled) 319{ 320 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(dev); 321 int val; 322 323 if (enabled) 324 val = 1 << WM831X_RTC_PINT_FREQ_SHIFT; 325 else 326 val = 0; 327 328 return wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL, 329 WM831X_RTC_PINT_FREQ_MASK, val); 330} 331 332static irqreturn_t wm831x_alm_irq(int irq, void *data) 333{ 334 struct wm831x_rtc *wm831x_rtc = data; 335 336 rtc_update_irq(wm831x_rtc->rtc, 1, RTC_IRQF | RTC_AF); 337 338 return IRQ_HANDLED; 339} 340 341static irqreturn_t wm831x_per_irq(int irq, void *data) 342{ 343 struct wm831x_rtc *wm831x_rtc = data; 344 345 rtc_update_irq(wm831x_rtc->rtc, 1, RTC_IRQF | RTC_UF); 346 347 return IRQ_HANDLED; 348} 349 350static const struct rtc_class_ops wm831x_rtc_ops = { 351 .read_time = wm831x_rtc_readtime, 352 .set_mmss = wm831x_rtc_set_mmss, 353 .read_alarm = wm831x_rtc_readalarm, 354 .set_alarm = wm831x_rtc_setalarm, 355 .alarm_irq_enable = wm831x_rtc_alarm_irq_enable, 356 .update_irq_enable = wm831x_rtc_update_irq_enable, 357}; 358 359#ifdef CONFIG_PM 360/* Turn off the alarm if it should not be a wake source. */ 361static int wm831x_rtc_suspend(struct device *dev) 362{ 363 struct platform_device *pdev = to_platform_device(dev); 364 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(&pdev->dev); 365 int ret, enable; 366 367 if (wm831x_rtc->alarm_enabled && device_may_wakeup(&pdev->dev)) 368 enable = WM831X_RTC_ALM_ENA; 369 else 370 enable = 0; 371 372 ret = wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL, 373 WM831X_RTC_ALM_ENA, enable); 374 if (ret != 0) 375 dev_err(&pdev->dev, "Failed to update RTC alarm: %d\n", ret); 376 377 return 0; 378} 379 380/* Enable the alarm if it should be enabled (in case it was disabled to 381 * prevent use as a wake source). 382 */ 383static int wm831x_rtc_resume(struct device *dev) 384{ 385 struct platform_device *pdev = to_platform_device(dev); 386 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(&pdev->dev); 387 int ret; 388 389 if (wm831x_rtc->alarm_enabled) { 390 ret = wm831x_rtc_start_alarm(wm831x_rtc); 391 if (ret != 0) 392 dev_err(&pdev->dev, 393 "Failed to restart RTC alarm: %d\n", ret); 394 } 395 396 return 0; 397} 398 399/* Unconditionally disable the alarm */ 400static int wm831x_rtc_freeze(struct device *dev) 401{ 402 struct platform_device *pdev = to_platform_device(dev); 403 struct wm831x_rtc *wm831x_rtc = dev_get_drvdata(&pdev->dev); 404 int ret; 405 406 ret = wm831x_set_bits(wm831x_rtc->wm831x, WM831X_RTC_CONTROL, 407 WM831X_RTC_ALM_ENA, 0); 408 if (ret != 0) 409 dev_err(&pdev->dev, "Failed to stop RTC alarm: %d\n", ret); 410 411 return 0; 412} 413#else 414#define wm831x_rtc_suspend NULL 415#define wm831x_rtc_resume NULL 416#define wm831x_rtc_freeze NULL 417#endif 418 419static int wm831x_rtc_probe(struct platform_device *pdev) 420{ 421 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); 422 struct wm831x_rtc *wm831x_rtc; 423 int per_irq = platform_get_irq_byname(pdev, "PER"); 424 int alm_irq = platform_get_irq_byname(pdev, "ALM"); 425 int ret = 0; 426 427 wm831x_rtc = kzalloc(sizeof(*wm831x_rtc), GFP_KERNEL); 428 if (wm831x_rtc == NULL) 429 return -ENOMEM; 430 431 platform_set_drvdata(pdev, wm831x_rtc); 432 wm831x_rtc->wm831x = wm831x; 433 434 ret = wm831x_reg_read(wm831x, WM831X_RTC_CONTROL); 435 if (ret < 0) { 436 dev_err(&pdev->dev, "Failed to read RTC control: %d\n", ret); 437 goto err; 438 } 439 if (ret & WM831X_RTC_ALM_ENA) 440 wm831x_rtc->alarm_enabled = 1; 441 442 device_init_wakeup(&pdev->dev, 1); 443 444 wm831x_rtc->rtc = rtc_device_register("wm831x", &pdev->dev, 445 &wm831x_rtc_ops, THIS_MODULE); 446 if (IS_ERR(wm831x_rtc->rtc)) { 447 ret = PTR_ERR(wm831x_rtc->rtc); 448 goto err; 449 } 450 451 ret = wm831x_request_irq(wm831x, per_irq, wm831x_per_irq, 452 IRQF_TRIGGER_RISING, "wm831x_rtc_per", 453 wm831x_rtc); 454 if (ret != 0) { 455 dev_err(&pdev->dev, "Failed to request periodic IRQ %d: %d\n", 456 per_irq, ret); 457 } 458 459 ret = wm831x_request_irq(wm831x, alm_irq, wm831x_alm_irq, 460 IRQF_TRIGGER_RISING, "wm831x_rtc_alm", 461 wm831x_rtc); 462 if (ret != 0) { 463 dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n", 464 alm_irq, ret); 465 } 466 467 return 0; 468 469err: 470 kfree(wm831x_rtc); 471 return ret; 472} 473 474static int __devexit wm831x_rtc_remove(struct platform_device *pdev) 475{ 476 struct wm831x_rtc *wm831x_rtc = platform_get_drvdata(pdev); 477 int per_irq = platform_get_irq_byname(pdev, "PER"); 478 int alm_irq = platform_get_irq_byname(pdev, "ALM"); 479 480 wm831x_free_irq(wm831x_rtc->wm831x, alm_irq, wm831x_rtc); 481 wm831x_free_irq(wm831x_rtc->wm831x, per_irq, wm831x_rtc); 482 rtc_device_unregister(wm831x_rtc->rtc); 483 kfree(wm831x_rtc); 484 485 return 0; 486} 487 488static const struct dev_pm_ops wm831x_rtc_pm_ops = { 489 .suspend = wm831x_rtc_suspend, 490 .resume = wm831x_rtc_resume, 491 492 .freeze = wm831x_rtc_freeze, 493 .thaw = wm831x_rtc_resume, 494 .restore = wm831x_rtc_resume, 495 496 .poweroff = wm831x_rtc_suspend, 497}; 498 499static struct platform_driver wm831x_rtc_driver = { 500 .probe = wm831x_rtc_probe, 501 .remove = __devexit_p(wm831x_rtc_remove), 502 .driver = { 503 .name = "wm831x-rtc", 504 .pm = &wm831x_rtc_pm_ops, 505 }, 506}; 507 508static int __init wm831x_rtc_init(void) 509{ 510 return platform_driver_register(&wm831x_rtc_driver); 511} 512module_init(wm831x_rtc_init); 513 514static void __exit wm831x_rtc_exit(void) 515{ 516 platform_driver_unregister(&wm831x_rtc_driver); 517} 518module_exit(wm831x_rtc_exit); 519 520MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 521MODULE_DESCRIPTION("RTC driver for the WM831x series PMICs"); 522MODULE_LICENSE("GPL"); 523MODULE_ALIAS("platform:wm831x-rtc"); 524