1 /* 2 * rtc-tps65910.c -- TPS65910 Real Time Clock interface 3 * 4 * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. 5 * Author: Venu Byravarasu <vbyravarasu@nvidia.com> 6 * 7 * Based on original TI driver rtc-twl.c 8 * Copyright (C) 2007 MontaVista Software, Inc 9 * Author: Alexandre Rusev <source@mvista.com> 10 * 11 * This program is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU General Public License 13 * as published by the Free Software Foundation; either version 14 * 2 of the License, or (at your option) any later version. 15 */ 16 17 #include <linux/kernel.h> 18 #include <linux/errno.h> 19 #include <linux/init.h> 20 #include <linux/module.h> 21 #include <linux/types.h> 22 #include <linux/rtc.h> 23 #include <linux/bcd.h> 24 #include <linux/math64.h> 25 #include <linux/platform_device.h> 26 #include <linux/interrupt.h> 27 #include <linux/mfd/tps65910.h> 28 29 struct tps65910_rtc { 30 struct rtc_device *rtc; 31 int irq; 32 }; 33 34 /* Total number of RTC registers needed to set time*/ 35 #define NUM_TIME_REGS (TPS65910_YEARS - TPS65910_SECONDS + 1) 36 37 /* Total number of RTC registers needed to set compensation registers */ 38 #define NUM_COMP_REGS (TPS65910_RTC_COMP_MSB - TPS65910_RTC_COMP_LSB + 1) 39 40 /* Min and max values supported with 'offset' interface (swapped sign) */ 41 #define MIN_OFFSET (-277761) 42 #define MAX_OFFSET (277778) 43 44 /* Number of ticks per hour */ 45 #define TICKS_PER_HOUR (32768 * 3600) 46 47 /* Multiplier for ppb conversions */ 48 #define PPB_MULT (1000000000LL) 49 50 static int tps65910_rtc_alarm_irq_enable(struct device *dev, 51 unsigned int enabled) 52 { 53 struct tps65910 *tps = dev_get_drvdata(dev->parent); 54 u8 val = 0; 55 56 if (enabled) 57 val = TPS65910_RTC_INTERRUPTS_IT_ALARM; 58 59 return regmap_write(tps->regmap, TPS65910_RTC_INTERRUPTS, val); 60 } 61 62 /* 63 * Gets current tps65910 RTC time and date parameters. 64 * 65 * The RTC's time/alarm representation is not what gmtime(3) requires 66 * Linux to use: 67 * 68 * - Months are 1..12 vs Linux 0-11 69 * - Years are 0..99 vs Linux 1900..N (we assume 21st century) 70 */ 71 static int tps65910_rtc_read_time(struct device *dev, struct rtc_time *tm) 72 { 73 unsigned char rtc_data[NUM_TIME_REGS]; 74 struct tps65910 *tps = dev_get_drvdata(dev->parent); 75 int ret; 76 77 /* Copy RTC counting registers to static registers or latches */ 78 ret = regmap_update_bits(tps->regmap, TPS65910_RTC_CTRL, 79 TPS65910_RTC_CTRL_GET_TIME, TPS65910_RTC_CTRL_GET_TIME); 80 if (ret < 0) { 81 dev_err(dev, "RTC CTRL reg update failed with err:%d\n", ret); 82 return ret; 83 } 84 85 ret = regmap_bulk_read(tps->regmap, TPS65910_SECONDS, rtc_data, 86 NUM_TIME_REGS); 87 if (ret < 0) { 88 dev_err(dev, "reading from RTC failed with err:%d\n", ret); 89 return ret; 90 } 91 92 tm->tm_sec = bcd2bin(rtc_data[0]); 93 tm->tm_min = bcd2bin(rtc_data[1]); 94 tm->tm_hour = bcd2bin(rtc_data[2]); 95 tm->tm_mday = bcd2bin(rtc_data[3]); 96 tm->tm_mon = bcd2bin(rtc_data[4]) - 1; 97 tm->tm_year = bcd2bin(rtc_data[5]) + 100; 98 99 return ret; 100 } 101 102 static int tps65910_rtc_set_time(struct device *dev, struct rtc_time *tm) 103 { 104 unsigned char rtc_data[NUM_TIME_REGS]; 105 struct tps65910 *tps = dev_get_drvdata(dev->parent); 106 int ret; 107 108 rtc_data[0] = bin2bcd(tm->tm_sec); 109 rtc_data[1] = bin2bcd(tm->tm_min); 110 rtc_data[2] = bin2bcd(tm->tm_hour); 111 rtc_data[3] = bin2bcd(tm->tm_mday); 112 rtc_data[4] = bin2bcd(tm->tm_mon + 1); 113 rtc_data[5] = bin2bcd(tm->tm_year - 100); 114 115 /* Stop RTC while updating the RTC time registers */ 116 ret = regmap_update_bits(tps->regmap, TPS65910_RTC_CTRL, 117 TPS65910_RTC_CTRL_STOP_RTC, 0); 118 if (ret < 0) { 119 dev_err(dev, "RTC stop failed with err:%d\n", ret); 120 return ret; 121 } 122 123 /* update all the time registers in one shot */ 124 ret = regmap_bulk_write(tps->regmap, TPS65910_SECONDS, rtc_data, 125 NUM_TIME_REGS); 126 if (ret < 0) { 127 dev_err(dev, "rtc_set_time error %d\n", ret); 128 return ret; 129 } 130 131 /* Start back RTC */ 132 ret = regmap_update_bits(tps->regmap, TPS65910_RTC_CTRL, 133 TPS65910_RTC_CTRL_STOP_RTC, 1); 134 if (ret < 0) 135 dev_err(dev, "RTC start failed with err:%d\n", ret); 136 137 return ret; 138 } 139 140 /* 141 * Gets current tps65910 RTC alarm time. 142 */ 143 static int tps65910_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) 144 { 145 unsigned char alarm_data[NUM_TIME_REGS]; 146 u32 int_val; 147 struct tps65910 *tps = dev_get_drvdata(dev->parent); 148 int ret; 149 150 ret = regmap_bulk_read(tps->regmap, TPS65910_SECONDS, alarm_data, 151 NUM_TIME_REGS); 152 if (ret < 0) { 153 dev_err(dev, "rtc_read_alarm error %d\n", ret); 154 return ret; 155 } 156 157 alm->time.tm_sec = bcd2bin(alarm_data[0]); 158 alm->time.tm_min = bcd2bin(alarm_data[1]); 159 alm->time.tm_hour = bcd2bin(alarm_data[2]); 160 alm->time.tm_mday = bcd2bin(alarm_data[3]); 161 alm->time.tm_mon = bcd2bin(alarm_data[4]) - 1; 162 alm->time.tm_year = bcd2bin(alarm_data[5]) + 100; 163 164 ret = regmap_read(tps->regmap, TPS65910_RTC_INTERRUPTS, &int_val); 165 if (ret < 0) 166 return ret; 167 168 if (int_val & TPS65910_RTC_INTERRUPTS_IT_ALARM) 169 alm->enabled = 1; 170 171 return ret; 172 } 173 174 static int tps65910_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) 175 { 176 unsigned char alarm_data[NUM_TIME_REGS]; 177 struct tps65910 *tps = dev_get_drvdata(dev->parent); 178 int ret; 179 180 ret = tps65910_rtc_alarm_irq_enable(dev, 0); 181 if (ret) 182 return ret; 183 184 alarm_data[0] = bin2bcd(alm->time.tm_sec); 185 alarm_data[1] = bin2bcd(alm->time.tm_min); 186 alarm_data[2] = bin2bcd(alm->time.tm_hour); 187 alarm_data[3] = bin2bcd(alm->time.tm_mday); 188 alarm_data[4] = bin2bcd(alm->time.tm_mon + 1); 189 alarm_data[5] = bin2bcd(alm->time.tm_year - 100); 190 191 /* update all the alarm registers in one shot */ 192 ret = regmap_bulk_write(tps->regmap, TPS65910_ALARM_SECONDS, 193 alarm_data, NUM_TIME_REGS); 194 if (ret) { 195 dev_err(dev, "rtc_set_alarm error %d\n", ret); 196 return ret; 197 } 198 199 if (alm->enabled) 200 ret = tps65910_rtc_alarm_irq_enable(dev, 1); 201 202 return ret; 203 } 204 205 static int tps65910_rtc_set_calibration(struct device *dev, int calibration) 206 { 207 unsigned char comp_data[NUM_COMP_REGS]; 208 struct tps65910 *tps = dev_get_drvdata(dev->parent); 209 s16 value; 210 int ret; 211 212 /* 213 * TPS65910 uses two's complement 16 bit value for compensation for RTC 214 * crystal inaccuracies. One time every hour when seconds counter 215 * increments from 0 to 1 compensation value will be added to internal 216 * RTC counter value. 217 * 218 * Compensation value 0x7FFF is prohibited value. 219 * 220 * Valid range for compensation value: [-32768 .. 32766] 221 */ 222 if ((calibration < -32768) || (calibration > 32766)) { 223 dev_err(dev, "RTC calibration value out of range: %d\n", 224 calibration); 225 return -EINVAL; 226 } 227 228 value = (s16)calibration; 229 230 comp_data[0] = (u16)value & 0xFF; 231 comp_data[1] = ((u16)value >> 8) & 0xFF; 232 233 /* Update all the compensation registers in one shot */ 234 ret = regmap_bulk_write(tps->regmap, TPS65910_RTC_COMP_LSB, 235 comp_data, NUM_COMP_REGS); 236 if (ret < 0) { 237 dev_err(dev, "rtc_set_calibration error: %d\n", ret); 238 return ret; 239 } 240 241 /* Enable automatic compensation */ 242 ret = regmap_update_bits(tps->regmap, TPS65910_RTC_CTRL, 243 TPS65910_RTC_CTRL_AUTO_COMP, TPS65910_RTC_CTRL_AUTO_COMP); 244 if (ret < 0) 245 dev_err(dev, "auto_comp enable failed with error: %d\n", ret); 246 247 return ret; 248 } 249 250 static int tps65910_rtc_get_calibration(struct device *dev, int *calibration) 251 { 252 unsigned char comp_data[NUM_COMP_REGS]; 253 struct tps65910 *tps = dev_get_drvdata(dev->parent); 254 unsigned int ctrl; 255 u16 value; 256 int ret; 257 258 ret = regmap_read(tps->regmap, TPS65910_RTC_CTRL, &ctrl); 259 if (ret < 0) 260 return ret; 261 262 /* If automatic compensation is not enabled report back zero */ 263 if (!(ctrl & TPS65910_RTC_CTRL_AUTO_COMP)) { 264 *calibration = 0; 265 return 0; 266 } 267 268 ret = regmap_bulk_read(tps->regmap, TPS65910_RTC_COMP_LSB, comp_data, 269 NUM_COMP_REGS); 270 if (ret < 0) { 271 dev_err(dev, "rtc_get_calibration error: %d\n", ret); 272 return ret; 273 } 274 275 value = (u16)comp_data[0] | ((u16)comp_data[1] << 8); 276 277 *calibration = (s16)value; 278 279 return 0; 280 } 281 282 static int tps65910_read_offset(struct device *dev, long *offset) 283 { 284 int calibration; 285 s64 tmp; 286 int ret; 287 288 ret = tps65910_rtc_get_calibration(dev, &calibration); 289 if (ret < 0) 290 return ret; 291 292 /* Convert from RTC calibration register format to ppb format */ 293 tmp = calibration * (s64)PPB_MULT; 294 if (tmp < 0) 295 tmp -= TICKS_PER_HOUR / 2LL; 296 else 297 tmp += TICKS_PER_HOUR / 2LL; 298 tmp = div_s64(tmp, TICKS_PER_HOUR); 299 300 /* Offset value operates in negative way, so swap sign */ 301 *offset = (long)-tmp; 302 303 return 0; 304 } 305 306 static int tps65910_set_offset(struct device *dev, long offset) 307 { 308 int calibration; 309 s64 tmp; 310 int ret; 311 312 /* Make sure offset value is within supported range */ 313 if (offset < MIN_OFFSET || offset > MAX_OFFSET) 314 return -ERANGE; 315 316 /* Convert from ppb format to RTC calibration register format */ 317 tmp = offset * (s64)TICKS_PER_HOUR; 318 if (tmp < 0) 319 tmp -= PPB_MULT / 2LL; 320 else 321 tmp += PPB_MULT / 2LL; 322 tmp = div_s64(tmp, PPB_MULT); 323 324 /* Offset value operates in negative way, so swap sign */ 325 calibration = (int)-tmp; 326 327 ret = tps65910_rtc_set_calibration(dev, calibration); 328 329 return ret; 330 } 331 332 static irqreturn_t tps65910_rtc_interrupt(int irq, void *rtc) 333 { 334 struct device *dev = rtc; 335 unsigned long events = 0; 336 struct tps65910 *tps = dev_get_drvdata(dev->parent); 337 struct tps65910_rtc *tps_rtc = dev_get_drvdata(dev); 338 int ret; 339 u32 rtc_reg; 340 341 ret = regmap_read(tps->regmap, TPS65910_RTC_STATUS, &rtc_reg); 342 if (ret) 343 return IRQ_NONE; 344 345 if (rtc_reg & TPS65910_RTC_STATUS_ALARM) 346 events = RTC_IRQF | RTC_AF; 347 348 ret = regmap_write(tps->regmap, TPS65910_RTC_STATUS, rtc_reg); 349 if (ret) 350 return IRQ_NONE; 351 352 /* Notify RTC core on event */ 353 rtc_update_irq(tps_rtc->rtc, 1, events); 354 355 return IRQ_HANDLED; 356 } 357 358 static const struct rtc_class_ops tps65910_rtc_ops = { 359 .read_time = tps65910_rtc_read_time, 360 .set_time = tps65910_rtc_set_time, 361 .read_alarm = tps65910_rtc_read_alarm, 362 .set_alarm = tps65910_rtc_set_alarm, 363 .alarm_irq_enable = tps65910_rtc_alarm_irq_enable, 364 .read_offset = tps65910_read_offset, 365 .set_offset = tps65910_set_offset, 366 }; 367 368 static int tps65910_rtc_probe(struct platform_device *pdev) 369 { 370 struct tps65910 *tps65910 = NULL; 371 struct tps65910_rtc *tps_rtc = NULL; 372 int ret; 373 int irq; 374 u32 rtc_reg; 375 376 tps65910 = dev_get_drvdata(pdev->dev.parent); 377 378 tps_rtc = devm_kzalloc(&pdev->dev, sizeof(struct tps65910_rtc), 379 GFP_KERNEL); 380 if (!tps_rtc) 381 return -ENOMEM; 382 383 /* Clear pending interrupts */ 384 ret = regmap_read(tps65910->regmap, TPS65910_RTC_STATUS, &rtc_reg); 385 if (ret < 0) 386 return ret; 387 388 ret = regmap_write(tps65910->regmap, TPS65910_RTC_STATUS, rtc_reg); 389 if (ret < 0) 390 return ret; 391 392 dev_dbg(&pdev->dev, "Enabling rtc-tps65910.\n"); 393 394 /* Enable RTC digital power domain */ 395 ret = regmap_update_bits(tps65910->regmap, TPS65910_DEVCTRL, 396 DEVCTRL_RTC_PWDN_MASK, 0 << DEVCTRL_RTC_PWDN_SHIFT); 397 if (ret < 0) 398 return ret; 399 400 rtc_reg = TPS65910_RTC_CTRL_STOP_RTC; 401 ret = regmap_write(tps65910->regmap, TPS65910_RTC_CTRL, rtc_reg); 402 if (ret < 0) 403 return ret; 404 405 platform_set_drvdata(pdev, tps_rtc); 406 407 irq = platform_get_irq(pdev, 0); 408 if (irq <= 0) { 409 dev_warn(&pdev->dev, "Wake up is not possible as irq = %d\n", 410 irq); 411 return -ENXIO; 412 } 413 414 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, 415 tps65910_rtc_interrupt, IRQF_TRIGGER_LOW, 416 dev_name(&pdev->dev), &pdev->dev); 417 if (ret < 0) { 418 dev_err(&pdev->dev, "IRQ is not free.\n"); 419 return ret; 420 } 421 tps_rtc->irq = irq; 422 device_set_wakeup_capable(&pdev->dev, 1); 423 424 tps_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, 425 &tps65910_rtc_ops, THIS_MODULE); 426 if (IS_ERR(tps_rtc->rtc)) { 427 ret = PTR_ERR(tps_rtc->rtc); 428 dev_err(&pdev->dev, "RTC device register: err %d\n", ret); 429 return ret; 430 } 431 432 return 0; 433 } 434 435 /* 436 * Disable tps65910 RTC interrupts. 437 * Sets status flag to free. 438 */ 439 static int tps65910_rtc_remove(struct platform_device *pdev) 440 { 441 tps65910_rtc_alarm_irq_enable(&pdev->dev, 0); 442 443 return 0; 444 } 445 446 #ifdef CONFIG_PM_SLEEP 447 static int tps65910_rtc_suspend(struct device *dev) 448 { 449 struct tps65910_rtc *tps_rtc = dev_get_drvdata(dev); 450 451 if (device_may_wakeup(dev)) 452 enable_irq_wake(tps_rtc->irq); 453 return 0; 454 } 455 456 static int tps65910_rtc_resume(struct device *dev) 457 { 458 struct tps65910_rtc *tps_rtc = dev_get_drvdata(dev); 459 460 if (device_may_wakeup(dev)) 461 disable_irq_wake(tps_rtc->irq); 462 return 0; 463 } 464 #endif 465 466 static SIMPLE_DEV_PM_OPS(tps65910_rtc_pm_ops, tps65910_rtc_suspend, 467 tps65910_rtc_resume); 468 469 static struct platform_driver tps65910_rtc_driver = { 470 .probe = tps65910_rtc_probe, 471 .remove = tps65910_rtc_remove, 472 .driver = { 473 .name = "tps65910-rtc", 474 .pm = &tps65910_rtc_pm_ops, 475 }, 476 }; 477 478 module_platform_driver(tps65910_rtc_driver); 479 MODULE_ALIAS("platform:rtc-tps65910"); 480 MODULE_AUTHOR("Venu Byravarasu <vbyravarasu@nvidia.com>"); 481 MODULE_LICENSE("GPL"); 482