linux/drivers/rtc/rtc-pm8xxx.c
<<
>>
Prefs
   1/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
   2 *
   3 * This program is free software; you can redistribute it and/or modify
   4 * it under the terms of the GNU General Public License version 2 and
   5 * only version 2 as published by the Free Software Foundation.
   6 *
   7 * This program is distributed in the hope that it will be useful,
   8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
   9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10 * GNU General Public License for more details.
  11 */
  12#include <linux/of.h>
  13#include <linux/module.h>
  14#include <linux/init.h>
  15#include <linux/rtc.h>
  16#include <linux/platform_device.h>
  17#include <linux/pm.h>
  18#include <linux/regmap.h>
  19#include <linux/slab.h>
  20#include <linux/spinlock.h>
  21
  22/* RTC Register offsets from RTC CTRL REG */
  23#define PM8XXX_ALARM_CTRL_OFFSET        0x01
  24#define PM8XXX_RTC_WRITE_OFFSET         0x02
  25#define PM8XXX_RTC_READ_OFFSET          0x06
  26#define PM8XXX_ALARM_RW_OFFSET          0x0A
  27
  28/* RTC_CTRL register bit fields */
  29#define PM8xxx_RTC_ENABLE               BIT(7)
  30#define PM8xxx_RTC_ALARM_CLEAR          BIT(0)
  31
  32#define NUM_8_BIT_RTC_REGS              0x4
  33
  34/**
  35 * struct pm8xxx_rtc_regs - describe RTC registers per PMIC versions
  36 * @ctrl: base address of control register
  37 * @write: base address of write register
  38 * @read: base address of read register
  39 * @alarm_ctrl: base address of alarm control register
  40 * @alarm_ctrl2: base address of alarm control2 register
  41 * @alarm_rw: base address of alarm read-write register
  42 * @alarm_en: alarm enable mask
  43 */
  44struct pm8xxx_rtc_regs {
  45        unsigned int ctrl;
  46        unsigned int write;
  47        unsigned int read;
  48        unsigned int alarm_ctrl;
  49        unsigned int alarm_ctrl2;
  50        unsigned int alarm_rw;
  51        unsigned int alarm_en;
  52};
  53
  54/**
  55 * struct pm8xxx_rtc -  rtc driver internal structure
  56 * @rtc:                rtc device for this driver.
  57 * @regmap:             regmap used to access RTC registers
  58 * @allow_set_time:     indicates whether writing to the RTC is allowed
  59 * @rtc_alarm_irq:      rtc alarm irq number.
  60 * @ctrl_reg:           rtc control register.
  61 * @rtc_dev:            device structure.
  62 * @ctrl_reg_lock:      spinlock protecting access to ctrl_reg.
  63 */
  64struct pm8xxx_rtc {
  65        struct rtc_device *rtc;
  66        struct regmap *regmap;
  67        bool allow_set_time;
  68        int rtc_alarm_irq;
  69        const struct pm8xxx_rtc_regs *regs;
  70        struct device *rtc_dev;
  71        spinlock_t ctrl_reg_lock;
  72};
  73
  74/*
  75 * Steps to write the RTC registers.
  76 * 1. Disable alarm if enabled.
  77 * 2. Write 0x00 to LSB.
  78 * 3. Write Byte[1], Byte[2], Byte[3] then Byte[0].
  79 * 4. Enable alarm if disabled in step 1.
  80 */
  81static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm)
  82{
  83        int rc, i;
  84        unsigned long secs, irq_flags;
  85        u8 value[NUM_8_BIT_RTC_REGS], alarm_enabled = 0;
  86        unsigned int ctrl_reg;
  87        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
  88        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
  89
  90        if (!rtc_dd->allow_set_time)
  91                return -EACCES;
  92
  93        rtc_tm_to_time(tm, &secs);
  94
  95        for (i = 0; i < NUM_8_BIT_RTC_REGS; i++) {
  96                value[i] = secs & 0xFF;
  97                secs >>= 8;
  98        }
  99
 100        dev_dbg(dev, "Seconds value to be written to RTC = %lu\n", secs);
 101
 102        spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
 103
 104        rc = regmap_read(rtc_dd->regmap, regs->ctrl, &ctrl_reg);
 105        if (rc)
 106                goto rtc_rw_fail;
 107
 108        if (ctrl_reg & regs->alarm_en) {
 109                alarm_enabled = 1;
 110                ctrl_reg &= ~regs->alarm_en;
 111                rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg);
 112                if (rc) {
 113                        dev_err(dev, "Write to RTC control register failed\n");
 114                        goto rtc_rw_fail;
 115                }
 116        }
 117
 118        /* Write 0 to Byte[0] */
 119        rc = regmap_write(rtc_dd->regmap, regs->write, 0);
 120        if (rc) {
 121                dev_err(dev, "Write to RTC write data register failed\n");
 122                goto rtc_rw_fail;
 123        }
 124
 125        /* Write Byte[1], Byte[2], Byte[3] */
 126        rc = regmap_bulk_write(rtc_dd->regmap, regs->write + 1,
 127                               &value[1], sizeof(value) - 1);
 128        if (rc) {
 129                dev_err(dev, "Write to RTC write data register failed\n");
 130                goto rtc_rw_fail;
 131        }
 132
 133        /* Write Byte[0] */
 134        rc = regmap_write(rtc_dd->regmap, regs->write, value[0]);
 135        if (rc) {
 136                dev_err(dev, "Write to RTC write data register failed\n");
 137                goto rtc_rw_fail;
 138        }
 139
 140        if (alarm_enabled) {
 141                ctrl_reg |= regs->alarm_en;
 142                rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg);
 143                if (rc) {
 144                        dev_err(dev, "Write to RTC control register failed\n");
 145                        goto rtc_rw_fail;
 146                }
 147        }
 148
 149rtc_rw_fail:
 150        spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
 151
 152        return rc;
 153}
 154
 155static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm)
 156{
 157        int rc;
 158        u8 value[NUM_8_BIT_RTC_REGS];
 159        unsigned long secs;
 160        unsigned int reg;
 161        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
 162        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
 163
 164        rc = regmap_bulk_read(rtc_dd->regmap, regs->read, value, sizeof(value));
 165        if (rc) {
 166                dev_err(dev, "RTC read data register failed\n");
 167                return rc;
 168        }
 169
 170        /*
 171         * Read the LSB again and check if there has been a carry over.
 172         * If there is, redo the read operation.
 173         */
 174        rc = regmap_read(rtc_dd->regmap, regs->read, &reg);
 175        if (rc < 0) {
 176                dev_err(dev, "RTC read data register failed\n");
 177                return rc;
 178        }
 179
 180        if (unlikely(reg < value[0])) {
 181                rc = regmap_bulk_read(rtc_dd->regmap, regs->read,
 182                                      value, sizeof(value));
 183                if (rc) {
 184                        dev_err(dev, "RTC read data register failed\n");
 185                        return rc;
 186                }
 187        }
 188
 189        secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24);
 190
 191        rtc_time_to_tm(secs, tm);
 192
 193        rc = rtc_valid_tm(tm);
 194        if (rc < 0) {
 195                dev_err(dev, "Invalid time read from RTC\n");
 196                return rc;
 197        }
 198
 199        dev_dbg(dev, "secs = %lu, h:m:s == %d:%d:%d, d/m/y = %d/%d/%d\n",
 200                secs, tm->tm_hour, tm->tm_min, tm->tm_sec,
 201                tm->tm_mday, tm->tm_mon, tm->tm_year);
 202
 203        return 0;
 204}
 205
 206static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
 207{
 208        int rc, i;
 209        u8 value[NUM_8_BIT_RTC_REGS];
 210        unsigned int ctrl_reg;
 211        unsigned long secs, irq_flags;
 212        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
 213        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
 214
 215        rtc_tm_to_time(&alarm->time, &secs);
 216
 217        for (i = 0; i < NUM_8_BIT_RTC_REGS; i++) {
 218                value[i] = secs & 0xFF;
 219                secs >>= 8;
 220        }
 221
 222        spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
 223
 224        rc = regmap_bulk_write(rtc_dd->regmap, regs->alarm_rw, value,
 225                               sizeof(value));
 226        if (rc) {
 227                dev_err(dev, "Write to RTC ALARM register failed\n");
 228                goto rtc_rw_fail;
 229        }
 230
 231        rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg);
 232        if (rc)
 233                goto rtc_rw_fail;
 234
 235        if (alarm->enabled)
 236                ctrl_reg |= regs->alarm_en;
 237        else
 238                ctrl_reg &= ~regs->alarm_en;
 239
 240        rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg);
 241        if (rc) {
 242                dev_err(dev, "Write to RTC alarm control register failed\n");
 243                goto rtc_rw_fail;
 244        }
 245
 246        dev_dbg(dev, "Alarm Set for h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n",
 247                alarm->time.tm_hour, alarm->time.tm_min,
 248                alarm->time.tm_sec, alarm->time.tm_mday,
 249                alarm->time.tm_mon, alarm->time.tm_year);
 250rtc_rw_fail:
 251        spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
 252        return rc;
 253}
 254
 255static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
 256{
 257        int rc;
 258        u8 value[NUM_8_BIT_RTC_REGS];
 259        unsigned long secs;
 260        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
 261        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
 262
 263        rc = regmap_bulk_read(rtc_dd->regmap, regs->alarm_rw, value,
 264                              sizeof(value));
 265        if (rc) {
 266                dev_err(dev, "RTC alarm time read failed\n");
 267                return rc;
 268        }
 269
 270        secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24);
 271
 272        rtc_time_to_tm(secs, &alarm->time);
 273
 274        rc = rtc_valid_tm(&alarm->time);
 275        if (rc < 0) {
 276                dev_err(dev, "Invalid alarm time read from RTC\n");
 277                return rc;
 278        }
 279
 280        dev_dbg(dev, "Alarm set for - h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n",
 281                alarm->time.tm_hour, alarm->time.tm_min,
 282                alarm->time.tm_sec, alarm->time.tm_mday,
 283                alarm->time.tm_mon, alarm->time.tm_year);
 284
 285        return 0;
 286}
 287
 288static int pm8xxx_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
 289{
 290        int rc;
 291        unsigned long irq_flags;
 292        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
 293        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
 294        unsigned int ctrl_reg;
 295
 296        spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
 297
 298        rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg);
 299        if (rc)
 300                goto rtc_rw_fail;
 301
 302        if (enable)
 303                ctrl_reg |= regs->alarm_en;
 304        else
 305                ctrl_reg &= ~regs->alarm_en;
 306
 307        rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg);
 308        if (rc) {
 309                dev_err(dev, "Write to RTC control register failed\n");
 310                goto rtc_rw_fail;
 311        }
 312
 313rtc_rw_fail:
 314        spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
 315        return rc;
 316}
 317
 318static const struct rtc_class_ops pm8xxx_rtc_ops = {
 319        .read_time      = pm8xxx_rtc_read_time,
 320        .set_time       = pm8xxx_rtc_set_time,
 321        .set_alarm      = pm8xxx_rtc_set_alarm,
 322        .read_alarm     = pm8xxx_rtc_read_alarm,
 323        .alarm_irq_enable = pm8xxx_rtc_alarm_irq_enable,
 324};
 325
 326static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id)
 327{
 328        struct pm8xxx_rtc *rtc_dd = dev_id;
 329        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
 330        unsigned int ctrl_reg;
 331        int rc;
 332        unsigned long irq_flags;
 333
 334        rtc_update_irq(rtc_dd->rtc, 1, RTC_IRQF | RTC_AF);
 335
 336        spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
 337
 338        /* Clear the alarm enable bit */
 339        rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg);
 340        if (rc) {
 341                spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
 342                goto rtc_alarm_handled;
 343        }
 344
 345        ctrl_reg &= ~regs->alarm_en;
 346
 347        rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg);
 348        if (rc) {
 349                spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
 350                dev_err(rtc_dd->rtc_dev,
 351                        "Write to alarm control register failed\n");
 352                goto rtc_alarm_handled;
 353        }
 354
 355        spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
 356
 357        /* Clear RTC alarm register */
 358        rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl2, &ctrl_reg);
 359        if (rc) {
 360                dev_err(rtc_dd->rtc_dev,
 361                        "RTC Alarm control2 register read failed\n");
 362                goto rtc_alarm_handled;
 363        }
 364
 365        ctrl_reg |= PM8xxx_RTC_ALARM_CLEAR;
 366        rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl2, ctrl_reg);
 367        if (rc)
 368                dev_err(rtc_dd->rtc_dev,
 369                        "Write to RTC Alarm control2 register failed\n");
 370
 371rtc_alarm_handled:
 372        return IRQ_HANDLED;
 373}
 374
 375static int pm8xxx_rtc_enable(struct pm8xxx_rtc *rtc_dd)
 376{
 377        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
 378        unsigned int ctrl_reg;
 379        int rc;
 380
 381        /* Check if the RTC is on, else turn it on */
 382        rc = regmap_read(rtc_dd->regmap, regs->ctrl, &ctrl_reg);
 383        if (rc)
 384                return rc;
 385
 386        if (!(ctrl_reg & PM8xxx_RTC_ENABLE)) {
 387                ctrl_reg |= PM8xxx_RTC_ENABLE;
 388                rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg);
 389                if (rc)
 390                        return rc;
 391        }
 392
 393        return 0;
 394}
 395
 396static const struct pm8xxx_rtc_regs pm8921_regs = {
 397        .ctrl           = 0x11d,
 398        .write          = 0x11f,
 399        .read           = 0x123,
 400        .alarm_rw       = 0x127,
 401        .alarm_ctrl     = 0x11d,
 402        .alarm_ctrl2    = 0x11e,
 403        .alarm_en       = BIT(1),
 404};
 405
 406static const struct pm8xxx_rtc_regs pm8058_regs = {
 407        .ctrl           = 0x1e8,
 408        .write          = 0x1ea,
 409        .read           = 0x1ee,
 410        .alarm_rw       = 0x1f2,
 411        .alarm_ctrl     = 0x1e8,
 412        .alarm_ctrl2    = 0x1e9,
 413        .alarm_en       = BIT(1),
 414};
 415
 416static const struct pm8xxx_rtc_regs pm8941_regs = {
 417        .ctrl           = 0x6046,
 418        .write          = 0x6040,
 419        .read           = 0x6048,
 420        .alarm_rw       = 0x6140,
 421        .alarm_ctrl     = 0x6146,
 422        .alarm_ctrl2    = 0x6148,
 423        .alarm_en       = BIT(7),
 424};
 425
 426/*
 427 * Hardcoded RTC bases until IORESOURCE_REG mapping is figured out
 428 */
 429static const struct of_device_id pm8xxx_id_table[] = {
 430        { .compatible = "qcom,pm8921-rtc", .data = &pm8921_regs },
 431        { .compatible = "qcom,pm8058-rtc", .data = &pm8058_regs },
 432        { .compatible = "qcom,pm8941-rtc", .data = &pm8941_regs },
 433        { },
 434};
 435MODULE_DEVICE_TABLE(of, pm8xxx_id_table);
 436
 437static int pm8xxx_rtc_probe(struct platform_device *pdev)
 438{
 439        int rc;
 440        struct pm8xxx_rtc *rtc_dd;
 441        const struct of_device_id *match;
 442
 443        match = of_match_node(pm8xxx_id_table, pdev->dev.of_node);
 444        if (!match)
 445                return -ENXIO;
 446
 447        rtc_dd = devm_kzalloc(&pdev->dev, sizeof(*rtc_dd), GFP_KERNEL);
 448        if (rtc_dd == NULL)
 449                return -ENOMEM;
 450
 451        /* Initialise spinlock to protect RTC control register */
 452        spin_lock_init(&rtc_dd->ctrl_reg_lock);
 453
 454        rtc_dd->regmap = dev_get_regmap(pdev->dev.parent, NULL);
 455        if (!rtc_dd->regmap) {
 456                dev_err(&pdev->dev, "Parent regmap unavailable.\n");
 457                return -ENXIO;
 458        }
 459
 460        rtc_dd->rtc_alarm_irq = platform_get_irq(pdev, 0);
 461        if (rtc_dd->rtc_alarm_irq < 0) {
 462                dev_err(&pdev->dev, "Alarm IRQ resource absent!\n");
 463                return -ENXIO;
 464        }
 465
 466        rtc_dd->allow_set_time = of_property_read_bool(pdev->dev.of_node,
 467                                                      "allow-set-time");
 468
 469        rtc_dd->regs = match->data;
 470        rtc_dd->rtc_dev = &pdev->dev;
 471
 472        rc = pm8xxx_rtc_enable(rtc_dd);
 473        if (rc)
 474                return rc;
 475
 476        platform_set_drvdata(pdev, rtc_dd);
 477
 478        device_init_wakeup(&pdev->dev, 1);
 479
 480        /* Register the RTC device */
 481        rtc_dd->rtc = devm_rtc_device_register(&pdev->dev, "pm8xxx_rtc",
 482                                               &pm8xxx_rtc_ops, THIS_MODULE);
 483        if (IS_ERR(rtc_dd->rtc)) {
 484                dev_err(&pdev->dev, "%s: RTC registration failed (%ld)\n",
 485                        __func__, PTR_ERR(rtc_dd->rtc));
 486                return PTR_ERR(rtc_dd->rtc);
 487        }
 488
 489        /* Request the alarm IRQ */
 490        rc = devm_request_any_context_irq(&pdev->dev, rtc_dd->rtc_alarm_irq,
 491                                          pm8xxx_alarm_trigger,
 492                                          IRQF_TRIGGER_RISING,
 493                                          "pm8xxx_rtc_alarm", rtc_dd);
 494        if (rc < 0) {
 495                dev_err(&pdev->dev, "Request IRQ failed (%d)\n", rc);
 496                return rc;
 497        }
 498
 499        dev_dbg(&pdev->dev, "Probe success !!\n");
 500
 501        return 0;
 502}
 503
 504#ifdef CONFIG_PM_SLEEP
 505static int pm8xxx_rtc_resume(struct device *dev)
 506{
 507        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
 508
 509        if (device_may_wakeup(dev))
 510                disable_irq_wake(rtc_dd->rtc_alarm_irq);
 511
 512        return 0;
 513}
 514
 515static int pm8xxx_rtc_suspend(struct device *dev)
 516{
 517        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
 518
 519        if (device_may_wakeup(dev))
 520                enable_irq_wake(rtc_dd->rtc_alarm_irq);
 521
 522        return 0;
 523}
 524#endif
 525
 526static SIMPLE_DEV_PM_OPS(pm8xxx_rtc_pm_ops,
 527                         pm8xxx_rtc_suspend,
 528                         pm8xxx_rtc_resume);
 529
 530static struct platform_driver pm8xxx_rtc_driver = {
 531        .probe          = pm8xxx_rtc_probe,
 532        .driver = {
 533                .name           = "rtc-pm8xxx",
 534                .pm             = &pm8xxx_rtc_pm_ops,
 535                .of_match_table = pm8xxx_id_table,
 536        },
 537};
 538
 539module_platform_driver(pm8xxx_rtc_driver);
 540
 541MODULE_ALIAS("platform:rtc-pm8xxx");
 542MODULE_DESCRIPTION("PMIC8xxx RTC driver");
 543MODULE_LICENSE("GPL v2");
 544MODULE_AUTHOR("Anirudh Ghayal <aghayal@codeaurora.org>");
 545