Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers/rtc/rtc-pm8xxx.c: rework to support pm8941 rtc

Adds support for RTC device inside PM8941 PMIC. The RTC in this PMIC
have two register spaces. Thus the rtc-pm8xxx is slightly reworked to
reflect these differences.

The register set for different PMIC chips are selected on DT compatible
string base.

[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: simplify and fix locking in pm8xxx_rtc_set_time()]
Signed-off-by: Stanimir Varbanov <svarbanov@mm-sol.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: Stephen Boyd <sboyd@codeaurora.org>
Cc: Josh Cartwright <joshc@codeaurora.org>
Cc: Stanimir Varbanov <svarbanov@mm-sol.com>
Cc: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Stanimir Varbanov and committed by
Linus Torvalds
c8d523a4 6d50e60c

+135 -89
+1 -1
drivers/rtc/Kconfig
··· 1320 1320 1321 1321 config RTC_DRV_PM8XXX 1322 1322 tristate "Qualcomm PMIC8XXX RTC" 1323 - depends on MFD_PM8XXX 1323 + depends on MFD_PM8XXX || MFD_SPMI_PMIC 1324 1324 help 1325 1325 If you say yes here you get support for the 1326 1326 Qualcomm PMIC8XXX RTC.
+134 -88
drivers/rtc/rtc-pm8xxx.c
··· 27 27 28 28 /* RTC_CTRL register bit fields */ 29 29 #define PM8xxx_RTC_ENABLE BIT(7) 30 - #define PM8xxx_RTC_ALARM_ENABLE BIT(1) 31 30 #define PM8xxx_RTC_ALARM_CLEAR BIT(0) 32 31 33 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 + */ 44 + struct 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 + }; 34 53 35 54 /** 36 55 * struct pm8xxx_rtc - rtc driver internal structure ··· 57 38 * @regmap: regmap used to access RTC registers 58 39 * @allow_set_time: indicates whether writing to the RTC is allowed 59 40 * @rtc_alarm_irq: rtc alarm irq number. 60 - * @rtc_base: address of rtc control register. 61 - * @rtc_read_base: base address of read registers. 62 - * @rtc_write_base: base address of write registers. 63 - * @alarm_rw_base: base address of alarm registers. 64 41 * @ctrl_reg: rtc control register. 65 42 * @rtc_dev: device structure. 66 43 * @ctrl_reg_lock: spinlock protecting access to ctrl_reg. ··· 66 51 struct regmap *regmap; 67 52 bool allow_set_time; 68 53 int rtc_alarm_irq; 69 - int rtc_base; 70 - int rtc_read_base; 71 - int rtc_write_base; 72 - int alarm_rw_base; 73 - u8 ctrl_reg; 54 + const struct pm8xxx_rtc_regs *regs; 74 55 struct device *rtc_dev; 75 56 spinlock_t ctrl_reg_lock; 76 57 }; ··· 82 71 { 83 72 int rc, i; 84 73 unsigned long secs, irq_flags; 85 - u8 value[NUM_8_BIT_RTC_REGS], alarm_enabled = 0, ctrl_reg; 74 + u8 value[NUM_8_BIT_RTC_REGS], alarm_enabled = 0; 75 + unsigned int ctrl_reg; 86 76 struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); 77 + const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; 87 78 88 79 if (!rtc_dd->allow_set_time) 89 80 return -EACCES; ··· 100 87 dev_dbg(dev, "Seconds value to be written to RTC = %lu\n", secs); 101 88 102 89 spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); 103 - ctrl_reg = rtc_dd->ctrl_reg; 104 90 105 - if (ctrl_reg & PM8xxx_RTC_ALARM_ENABLE) { 91 + rc = regmap_read(rtc_dd->regmap, regs->ctrl, &ctrl_reg); 92 + if (rc) 93 + goto rtc_rw_fail; 94 + 95 + if (ctrl_reg & regs->alarm_en) { 106 96 alarm_enabled = 1; 107 - ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; 108 - rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); 97 + ctrl_reg &= ~regs->alarm_en; 98 + rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg); 109 99 if (rc) { 110 100 dev_err(dev, "Write to RTC control register failed\n"); 111 101 goto rtc_rw_fail; 112 102 } 113 - rtc_dd->ctrl_reg = ctrl_reg; 114 - } else { 115 - spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); 116 103 } 117 104 118 105 /* Write 0 to Byte[0] */ 119 - rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_write_base, 0); 106 + rc = regmap_write(rtc_dd->regmap, regs->write, 0); 120 107 if (rc) { 121 108 dev_err(dev, "Write to RTC write data register failed\n"); 122 109 goto rtc_rw_fail; 123 110 } 124 111 125 112 /* Write Byte[1], Byte[2], Byte[3] */ 126 - rc = regmap_bulk_write(rtc_dd->regmap, rtc_dd->rtc_write_base + 1, 113 + rc = regmap_bulk_write(rtc_dd->regmap, regs->write + 1, 127 114 &value[1], sizeof(value) - 1); 128 115 if (rc) { 129 116 dev_err(dev, "Write to RTC write data register failed\n"); ··· 131 118 } 132 119 133 120 /* Write Byte[0] */ 134 - rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_write_base, value[0]); 121 + rc = regmap_write(rtc_dd->regmap, regs->write, value[0]); 135 122 if (rc) { 136 123 dev_err(dev, "Write to RTC write data register failed\n"); 137 124 goto rtc_rw_fail; 138 125 } 139 126 140 127 if (alarm_enabled) { 141 - ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE; 142 - rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); 128 + ctrl_reg |= regs->alarm_en; 129 + rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg); 143 130 if (rc) { 144 131 dev_err(dev, "Write to RTC control register failed\n"); 145 132 goto rtc_rw_fail; 146 133 } 147 - rtc_dd->ctrl_reg = ctrl_reg; 148 134 } 149 135 150 136 rtc_rw_fail: 151 - if (alarm_enabled) 152 - spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); 137 + spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); 153 138 154 139 return rc; 155 140 } ··· 159 148 unsigned long secs; 160 149 unsigned int reg; 161 150 struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); 151 + const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; 162 152 163 - rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->rtc_read_base, 164 - value, sizeof(value)); 153 + rc = regmap_bulk_read(rtc_dd->regmap, regs->read, value, sizeof(value)); 165 154 if (rc) { 166 155 dev_err(dev, "RTC read data register failed\n"); 167 156 return rc; ··· 171 160 * Read the LSB again and check if there has been a carry over. 172 161 * If there is, redo the read operation. 173 162 */ 174 - rc = regmap_read(rtc_dd->regmap, rtc_dd->rtc_read_base, &reg); 163 + rc = regmap_read(rtc_dd->regmap, regs->read, &reg); 175 164 if (rc < 0) { 176 165 dev_err(dev, "RTC read data register failed\n"); 177 166 return rc; 178 167 } 179 168 180 169 if (unlikely(reg < value[0])) { 181 - rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->rtc_read_base, 170 + rc = regmap_bulk_read(rtc_dd->regmap, regs->read, 182 171 value, sizeof(value)); 183 172 if (rc) { 184 173 dev_err(dev, "RTC read data register failed\n"); ··· 206 195 static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) 207 196 { 208 197 int rc, i; 209 - u8 value[NUM_8_BIT_RTC_REGS], ctrl_reg; 198 + u8 value[NUM_8_BIT_RTC_REGS]; 199 + unsigned int ctrl_reg; 210 200 unsigned long secs, irq_flags; 211 201 struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); 202 + const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; 212 203 213 204 rtc_tm_to_time(&alarm->time, &secs); 214 205 ··· 221 208 222 209 spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); 223 210 224 - rc = regmap_bulk_write(rtc_dd->regmap, rtc_dd->alarm_rw_base, value, 211 + rc = regmap_bulk_write(rtc_dd->regmap, regs->alarm_rw, value, 225 212 sizeof(value)); 226 213 if (rc) { 227 214 dev_err(dev, "Write to RTC ALARM register failed\n"); 228 215 goto rtc_rw_fail; 229 216 } 230 217 231 - ctrl_reg = rtc_dd->ctrl_reg; 218 + rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); 219 + if (rc) 220 + goto rtc_rw_fail; 232 221 233 222 if (alarm->enabled) 234 - ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE; 223 + ctrl_reg |= regs->alarm_en; 235 224 else 236 - ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; 225 + ctrl_reg &= ~regs->alarm_en; 237 226 238 - rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); 227 + rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); 239 228 if (rc) { 240 - dev_err(dev, "Write to RTC control register failed\n"); 229 + dev_err(dev, "Write to RTC alarm control register failed\n"); 241 230 goto rtc_rw_fail; 242 231 } 243 - 244 - rtc_dd->ctrl_reg = ctrl_reg; 245 232 246 233 dev_dbg(dev, "Alarm Set for h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n", 247 234 alarm->time.tm_hour, alarm->time.tm_min, ··· 258 245 u8 value[NUM_8_BIT_RTC_REGS]; 259 246 unsigned long secs; 260 247 struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); 248 + const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; 261 249 262 - rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->alarm_rw_base, value, 250 + rc = regmap_bulk_read(rtc_dd->regmap, regs->alarm_rw, value, 263 251 sizeof(value)); 264 252 if (rc) { 265 253 dev_err(dev, "RTC alarm time read failed\n"); ··· 290 276 int rc; 291 277 unsigned long irq_flags; 292 278 struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); 293 - u8 ctrl_reg; 279 + const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; 280 + unsigned int ctrl_reg; 294 281 295 282 spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); 296 283 297 - ctrl_reg = rtc_dd->ctrl_reg; 284 + rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); 285 + if (rc) 286 + goto rtc_rw_fail; 298 287 299 288 if (enable) 300 - ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE; 289 + ctrl_reg |= regs->alarm_en; 301 290 else 302 - ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; 291 + ctrl_reg &= ~regs->alarm_en; 303 292 304 - rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); 293 + rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); 305 294 if (rc) { 306 295 dev_err(dev, "Write to RTC control register failed\n"); 307 296 goto rtc_rw_fail; 308 297 } 309 - 310 - rtc_dd->ctrl_reg = ctrl_reg; 311 298 312 299 rtc_rw_fail: 313 300 spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); ··· 326 311 static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id) 327 312 { 328 313 struct pm8xxx_rtc *rtc_dd = dev_id; 314 + const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; 329 315 unsigned int ctrl_reg; 330 316 int rc; 331 317 unsigned long irq_flags; ··· 336 320 spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); 337 321 338 322 /* Clear the alarm enable bit */ 339 - ctrl_reg = rtc_dd->ctrl_reg; 340 - ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; 323 + rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); 324 + if (rc) { 325 + spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); 326 + goto rtc_alarm_handled; 327 + } 341 328 342 - rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); 329 + ctrl_reg &= ~regs->alarm_en; 330 + 331 + rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); 343 332 if (rc) { 344 333 spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); 345 334 dev_err(rtc_dd->rtc_dev, 346 - "Write to RTC control register failed\n"); 335 + "Write to alarm control register failed\n"); 347 336 goto rtc_alarm_handled; 348 337 } 349 338 350 - rtc_dd->ctrl_reg = ctrl_reg; 351 339 spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); 352 340 353 341 /* Clear RTC alarm register */ 354 - rc = regmap_read(rtc_dd->regmap, 355 - rtc_dd->rtc_base + PM8XXX_ALARM_CTRL_OFFSET, 356 - &ctrl_reg); 342 + rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl2, &ctrl_reg); 357 343 if (rc) { 358 344 dev_err(rtc_dd->rtc_dev, 359 - "RTC Alarm control register read failed\n"); 345 + "RTC Alarm control2 register read failed\n"); 360 346 goto rtc_alarm_handled; 361 347 } 362 348 363 - ctrl_reg &= ~PM8xxx_RTC_ALARM_CLEAR; 364 - rc = regmap_write(rtc_dd->regmap, 365 - rtc_dd->rtc_base + PM8XXX_ALARM_CTRL_OFFSET, 366 - ctrl_reg); 349 + ctrl_reg |= PM8xxx_RTC_ALARM_CLEAR; 350 + rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl2, ctrl_reg); 367 351 if (rc) 368 352 dev_err(rtc_dd->rtc_dev, 369 - "Write to RTC Alarm control register failed\n"); 353 + "Write to RTC Alarm control2 register failed\n"); 370 354 371 355 rtc_alarm_handled: 372 356 return IRQ_HANDLED; 373 357 } 374 358 359 + static int pm8xxx_rtc_enable(struct pm8xxx_rtc *rtc_dd) 360 + { 361 + const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; 362 + unsigned int ctrl_reg; 363 + int rc; 364 + 365 + /* Check if the RTC is on, else turn it on */ 366 + rc = regmap_read(rtc_dd->regmap, regs->ctrl, &ctrl_reg); 367 + if (rc) 368 + return rc; 369 + 370 + if (!(ctrl_reg & PM8xxx_RTC_ENABLE)) { 371 + ctrl_reg |= PM8xxx_RTC_ENABLE; 372 + rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg); 373 + if (rc) 374 + return rc; 375 + } 376 + 377 + return 0; 378 + } 379 + 380 + static const struct pm8xxx_rtc_regs pm8921_regs = { 381 + .ctrl = 0x11d, 382 + .write = 0x11f, 383 + .read = 0x123, 384 + .alarm_rw = 0x127, 385 + .alarm_ctrl = 0x11d, 386 + .alarm_ctrl2 = 0x11e, 387 + .alarm_en = BIT(1), 388 + }; 389 + 390 + static const struct pm8xxx_rtc_regs pm8058_regs = { 391 + .ctrl = 0x1e8, 392 + .write = 0x1ea, 393 + .read = 0x1ee, 394 + .alarm_rw = 0x1f2, 395 + .alarm_ctrl = 0x1e8, 396 + .alarm_ctrl2 = 0x1e9, 397 + .alarm_en = BIT(1), 398 + }; 399 + 400 + static const struct pm8xxx_rtc_regs pm8941_regs = { 401 + .ctrl = 0x6046, 402 + .write = 0x6040, 403 + .read = 0x6048, 404 + .alarm_rw = 0x6140, 405 + .alarm_ctrl = 0x6146, 406 + .alarm_ctrl2 = 0x6148, 407 + .alarm_en = BIT(7), 408 + }; 409 + 375 410 /* 376 411 * Hardcoded RTC bases until IORESOURCE_REG mapping is figured out 377 412 */ 378 413 static const struct of_device_id pm8xxx_id_table[] = { 379 - { .compatible = "qcom,pm8921-rtc", .data = (void *) 0x11D }, 380 - { .compatible = "qcom,pm8058-rtc", .data = (void *) 0x1E8 }, 414 + { .compatible = "qcom,pm8921-rtc", .data = &pm8921_regs }, 415 + { .compatible = "qcom,pm8058-rtc", .data = &pm8058_regs }, 416 + { .compatible = "qcom,pm8941-rtc", .data = &pm8941_regs }, 381 417 { }, 382 418 }; 383 419 MODULE_DEVICE_TABLE(of, pm8xxx_id_table); ··· 437 369 static int pm8xxx_rtc_probe(struct platform_device *pdev) 438 370 { 439 371 int rc; 440 - unsigned int ctrl_reg; 441 372 struct pm8xxx_rtc *rtc_dd; 442 373 const struct of_device_id *match; 443 374 ··· 466 399 rtc_dd->allow_set_time = of_property_read_bool(pdev->dev.of_node, 467 400 "allow-set-time"); 468 401 469 - rtc_dd->rtc_base = (long) match->data; 470 - 471 - /* Setup RTC register addresses */ 472 - rtc_dd->rtc_write_base = rtc_dd->rtc_base + PM8XXX_RTC_WRITE_OFFSET; 473 - rtc_dd->rtc_read_base = rtc_dd->rtc_base + PM8XXX_RTC_READ_OFFSET; 474 - rtc_dd->alarm_rw_base = rtc_dd->rtc_base + PM8XXX_ALARM_RW_OFFSET; 475 - 402 + rtc_dd->regs = match->data; 476 403 rtc_dd->rtc_dev = &pdev->dev; 477 404 478 - /* Check if the RTC is on, else turn it on */ 479 - rc = regmap_read(rtc_dd->regmap, rtc_dd->rtc_base, &ctrl_reg); 480 - if (rc) { 481 - dev_err(&pdev->dev, "RTC control register read failed!\n"); 405 + rc = pm8xxx_rtc_enable(rtc_dd); 406 + if (rc) 482 407 return rc; 483 - } 484 - 485 - if (!(ctrl_reg & PM8xxx_RTC_ENABLE)) { 486 - ctrl_reg |= PM8xxx_RTC_ENABLE; 487 - rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); 488 - if (rc) { 489 - dev_err(&pdev->dev, 490 - "Write to RTC control register failed\n"); 491 - return rc; 492 - } 493 - } 494 - 495 - rtc_dd->ctrl_reg = ctrl_reg; 496 408 497 409 platform_set_drvdata(pdev, rtc_dd); 498 410