Lines Matching +full:y +full:- +full:rc
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
28 * struct pm8xxx_rtc_regs - describe RTC registers per PMIC versions
34 * @alarm_rw: base address of alarm read-write register
48 * struct pm8xxx_rtc - rtc driver internal structure
78 int rc, i; in pm8xxx_rtc_set_time() local
83 const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; in pm8xxx_rtc_set_time()
85 if (!rtc_dd->allow_set_time) in pm8xxx_rtc_set_time()
86 return -EACCES; in pm8xxx_rtc_set_time()
97 spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); in pm8xxx_rtc_set_time()
99 rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); in pm8xxx_rtc_set_time()
100 if (rc) in pm8xxx_rtc_set_time()
103 if (ctrl_reg & regs->alarm_en) { in pm8xxx_rtc_set_time()
105 ctrl_reg &= ~regs->alarm_en; in pm8xxx_rtc_set_time()
106 rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); in pm8xxx_rtc_set_time()
107 if (rc) { in pm8xxx_rtc_set_time()
114 rc = regmap_read(rtc_dd->regmap, regs->ctrl, &rtc_ctrl_reg); in pm8xxx_rtc_set_time()
115 if (rc) in pm8xxx_rtc_set_time()
121 rc = regmap_write(rtc_dd->regmap, regs->ctrl, rtc_ctrl_reg); in pm8xxx_rtc_set_time()
122 if (rc) { in pm8xxx_rtc_set_time()
129 rc = regmap_write(rtc_dd->regmap, regs->write, 0); in pm8xxx_rtc_set_time()
130 if (rc) { in pm8xxx_rtc_set_time()
136 rc = regmap_bulk_write(rtc_dd->regmap, regs->write + 1, in pm8xxx_rtc_set_time()
137 &value[1], sizeof(value) - 1); in pm8xxx_rtc_set_time()
138 if (rc) { in pm8xxx_rtc_set_time()
144 rc = regmap_write(rtc_dd->regmap, regs->write, value[0]); in pm8xxx_rtc_set_time()
145 if (rc) { in pm8xxx_rtc_set_time()
153 rc = regmap_write(rtc_dd->regmap, regs->ctrl, rtc_ctrl_reg); in pm8xxx_rtc_set_time()
154 if (rc) { in pm8xxx_rtc_set_time()
161 ctrl_reg |= regs->alarm_en; in pm8xxx_rtc_set_time()
162 rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); in pm8xxx_rtc_set_time()
163 if (rc) { in pm8xxx_rtc_set_time()
170 spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); in pm8xxx_rtc_set_time()
172 return rc; in pm8xxx_rtc_set_time()
177 int rc; in pm8xxx_rtc_read_time() local
182 const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; in pm8xxx_rtc_read_time()
184 rc = regmap_bulk_read(rtc_dd->regmap, regs->read, value, sizeof(value)); in pm8xxx_rtc_read_time()
185 if (rc) { in pm8xxx_rtc_read_time()
187 return rc; in pm8xxx_rtc_read_time()
194 rc = regmap_read(rtc_dd->regmap, regs->read, ®); in pm8xxx_rtc_read_time()
195 if (rc < 0) { in pm8xxx_rtc_read_time()
197 return rc; in pm8xxx_rtc_read_time()
201 rc = regmap_bulk_read(rtc_dd->regmap, regs->read, in pm8xxx_rtc_read_time()
203 if (rc) { in pm8xxx_rtc_read_time()
205 return rc; in pm8xxx_rtc_read_time()
214 dev_dbg(dev, "secs = %lu, h:m:s == %ptRt, y-m-d = %ptRdr\n", secs, tm, tm); in pm8xxx_rtc_read_time()
221 int rc, i; in pm8xxx_rtc_set_alarm() local
226 const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; in pm8xxx_rtc_set_alarm()
228 secs = rtc_tm_to_time64(&alarm->time); in pm8xxx_rtc_set_alarm()
235 spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); in pm8xxx_rtc_set_alarm()
237 rc = regmap_bulk_write(rtc_dd->regmap, regs->alarm_rw, value, in pm8xxx_rtc_set_alarm()
239 if (rc) { in pm8xxx_rtc_set_alarm()
244 rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); in pm8xxx_rtc_set_alarm()
245 if (rc) in pm8xxx_rtc_set_alarm()
248 if (alarm->enabled) in pm8xxx_rtc_set_alarm()
249 ctrl_reg |= regs->alarm_en; in pm8xxx_rtc_set_alarm()
251 ctrl_reg &= ~regs->alarm_en; in pm8xxx_rtc_set_alarm()
253 rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); in pm8xxx_rtc_set_alarm()
254 if (rc) { in pm8xxx_rtc_set_alarm()
259 dev_dbg(dev, "Alarm Set for h:m:s=%ptRt, y-m-d=%ptRdr\n", in pm8xxx_rtc_set_alarm()
260 &alarm->time, &alarm->time); in pm8xxx_rtc_set_alarm()
262 spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); in pm8xxx_rtc_set_alarm()
263 return rc; in pm8xxx_rtc_set_alarm()
268 int rc; in pm8xxx_rtc_read_alarm() local
273 const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; in pm8xxx_rtc_read_alarm()
275 rc = regmap_bulk_read(rtc_dd->regmap, regs->alarm_rw, value, in pm8xxx_rtc_read_alarm()
277 if (rc) { in pm8xxx_rtc_read_alarm()
279 return rc; in pm8xxx_rtc_read_alarm()
285 rtc_time64_to_tm(secs, &alarm->time); in pm8xxx_rtc_read_alarm()
287 rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); in pm8xxx_rtc_read_alarm()
288 if (rc) { in pm8xxx_rtc_read_alarm()
290 return rc; in pm8xxx_rtc_read_alarm()
292 alarm->enabled = !!(ctrl_reg & PM8xxx_RTC_ALARM_ENABLE); in pm8xxx_rtc_read_alarm()
294 dev_dbg(dev, "Alarm set for - h:m:s=%ptRt, y-m-d=%ptRdr\n", in pm8xxx_rtc_read_alarm()
295 &alarm->time, &alarm->time); in pm8xxx_rtc_read_alarm()
302 int rc; in pm8xxx_rtc_alarm_irq_enable() local
305 const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; in pm8xxx_rtc_alarm_irq_enable()
309 spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); in pm8xxx_rtc_alarm_irq_enable()
311 rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); in pm8xxx_rtc_alarm_irq_enable()
312 if (rc) in pm8xxx_rtc_alarm_irq_enable()
316 ctrl_reg |= regs->alarm_en; in pm8xxx_rtc_alarm_irq_enable()
318 ctrl_reg &= ~regs->alarm_en; in pm8xxx_rtc_alarm_irq_enable()
320 rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); in pm8xxx_rtc_alarm_irq_enable()
321 if (rc) { in pm8xxx_rtc_alarm_irq_enable()
328 rc = regmap_bulk_write(rtc_dd->regmap, regs->alarm_rw, value, in pm8xxx_rtc_alarm_irq_enable()
330 if (rc) { in pm8xxx_rtc_alarm_irq_enable()
337 spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); in pm8xxx_rtc_alarm_irq_enable()
338 return rc; in pm8xxx_rtc_alarm_irq_enable()
352 const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; in pm8xxx_alarm_trigger()
354 int rc; in pm8xxx_alarm_trigger() local
356 rtc_update_irq(rtc_dd->rtc, 1, RTC_IRQF | RTC_AF); in pm8xxx_alarm_trigger()
358 spin_lock(&rtc_dd->ctrl_reg_lock); in pm8xxx_alarm_trigger()
361 rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); in pm8xxx_alarm_trigger()
362 if (rc) { in pm8xxx_alarm_trigger()
363 spin_unlock(&rtc_dd->ctrl_reg_lock); in pm8xxx_alarm_trigger()
367 ctrl_reg &= ~regs->alarm_en; in pm8xxx_alarm_trigger()
369 rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); in pm8xxx_alarm_trigger()
370 if (rc) { in pm8xxx_alarm_trigger()
371 spin_unlock(&rtc_dd->ctrl_reg_lock); in pm8xxx_alarm_trigger()
372 dev_err(rtc_dd->rtc_dev, in pm8xxx_alarm_trigger()
377 spin_unlock(&rtc_dd->ctrl_reg_lock); in pm8xxx_alarm_trigger()
380 rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl2, &ctrl_reg); in pm8xxx_alarm_trigger()
381 if (rc) { in pm8xxx_alarm_trigger()
382 dev_err(rtc_dd->rtc_dev, in pm8xxx_alarm_trigger()
388 rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl2, ctrl_reg); in pm8xxx_alarm_trigger()
389 if (rc) in pm8xxx_alarm_trigger()
390 dev_err(rtc_dd->rtc_dev, in pm8xxx_alarm_trigger()
399 const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; in pm8xxx_rtc_enable()
401 int rc; in pm8xxx_rtc_enable() local
404 rc = regmap_read(rtc_dd->regmap, regs->ctrl, &ctrl_reg); in pm8xxx_rtc_enable()
405 if (rc) in pm8xxx_rtc_enable()
406 return rc; in pm8xxx_rtc_enable()
410 rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg); in pm8xxx_rtc_enable()
411 if (rc) in pm8xxx_rtc_enable()
412 return rc; in pm8xxx_rtc_enable()
462 { .compatible = "qcom,pm8921-rtc", .data = &pm8921_regs },
463 { .compatible = "qcom,pm8018-rtc", .data = &pm8921_regs },
464 { .compatible = "qcom,pm8058-rtc", .data = &pm8058_regs },
465 { .compatible = "qcom,pm8941-rtc", .data = &pm8941_regs },
466 { .compatible = "qcom,pmk8350-rtc", .data = &pmk8350_regs },
473 int rc; in pm8xxx_rtc_probe() local
477 match = of_match_node(pm8xxx_id_table, pdev->dev.of_node); in pm8xxx_rtc_probe()
479 return -ENXIO; in pm8xxx_rtc_probe()
481 rtc_dd = devm_kzalloc(&pdev->dev, sizeof(*rtc_dd), GFP_KERNEL); in pm8xxx_rtc_probe()
483 return -ENOMEM; in pm8xxx_rtc_probe()
486 spin_lock_init(&rtc_dd->ctrl_reg_lock); in pm8xxx_rtc_probe()
488 rtc_dd->regmap = dev_get_regmap(pdev->dev.parent, NULL); in pm8xxx_rtc_probe()
489 if (!rtc_dd->regmap) { in pm8xxx_rtc_probe()
490 dev_err(&pdev->dev, "Parent regmap unavailable.\n"); in pm8xxx_rtc_probe()
491 return -ENXIO; in pm8xxx_rtc_probe()
494 rtc_dd->rtc_alarm_irq = platform_get_irq(pdev, 0); in pm8xxx_rtc_probe()
495 if (rtc_dd->rtc_alarm_irq < 0) in pm8xxx_rtc_probe()
496 return -ENXIO; in pm8xxx_rtc_probe()
498 rtc_dd->allow_set_time = of_property_read_bool(pdev->dev.of_node, in pm8xxx_rtc_probe()
499 "allow-set-time"); in pm8xxx_rtc_probe()
501 rtc_dd->regs = match->data; in pm8xxx_rtc_probe()
502 rtc_dd->rtc_dev = &pdev->dev; in pm8xxx_rtc_probe()
504 rc = pm8xxx_rtc_enable(rtc_dd); in pm8xxx_rtc_probe()
505 if (rc) in pm8xxx_rtc_probe()
506 return rc; in pm8xxx_rtc_probe()
510 device_init_wakeup(&pdev->dev, 1); in pm8xxx_rtc_probe()
513 rtc_dd->rtc = devm_rtc_allocate_device(&pdev->dev); in pm8xxx_rtc_probe()
514 if (IS_ERR(rtc_dd->rtc)) in pm8xxx_rtc_probe()
515 return PTR_ERR(rtc_dd->rtc); in pm8xxx_rtc_probe()
517 rtc_dd->rtc->ops = &pm8xxx_rtc_ops; in pm8xxx_rtc_probe()
518 rtc_dd->rtc->range_max = U32_MAX; in pm8xxx_rtc_probe()
521 rc = devm_request_any_context_irq(&pdev->dev, rtc_dd->rtc_alarm_irq, in pm8xxx_rtc_probe()
525 if (rc < 0) { in pm8xxx_rtc_probe()
526 dev_err(&pdev->dev, "Request IRQ failed (%d)\n", rc); in pm8xxx_rtc_probe()
527 return rc; in pm8xxx_rtc_probe()
530 return devm_rtc_register_device(rtc_dd->rtc); in pm8xxx_rtc_probe()
539 disable_irq_wake(rtc_dd->rtc_alarm_irq); in pm8xxx_rtc_resume()
549 enable_irq_wake(rtc_dd->rtc_alarm_irq); in pm8xxx_rtc_suspend()
562 .name = "rtc-pm8xxx",
570 MODULE_ALIAS("platform:rtc-pm8xxx");