Lines Matching full:pcf2127

3  * An I2C and SPI driver for the NXP PCF2127/29 RTC
13 * Datasheet: https://www.nxp.com/docs/en/data-sheet/PCF2127.pdf
83 * PCF2127 has 512 bytes general-purpose static RAM (SRAM) that is
104 struct pcf2127 { struct
114 * In the routines that deal directly with the pcf2127 hardware, we use argument
119 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_read_time() local
127 ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_CTRL3, in pcf2127_rtc_read_time()
178 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_set_time() local
202 err = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_SC, buf, i); in pcf2127_rtc_set_time()
215 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_ioctl() local
221 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &val); in pcf2127_rtc_ioctl()
234 return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3, in pcf2127_rtc_ioctl()
245 struct pcf2127 *pcf2127 = priv; in pcf2127_nvmem_read() local
249 ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_ADDR_MSB, in pcf2127_nvmem_read()
254 return regmap_bulk_read(pcf2127->regmap, PCF2127_REG_RAM_RD_CMD, in pcf2127_nvmem_read()
261 struct pcf2127 *pcf2127 = priv; in pcf2127_nvmem_write() local
265 ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_ADDR_MSB, in pcf2127_nvmem_write()
270 return regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_WRT_CMD, in pcf2127_nvmem_write()
278 struct pcf2127 *pcf2127 = watchdog_get_drvdata(wdd); in pcf2127_wdt_ping() local
280 return regmap_write(pcf2127->regmap, PCF2127_REG_WD_VAL, wdd->timeout); in pcf2127_wdt_ping()
312 struct pcf2127 *pcf2127 = watchdog_get_drvdata(wdd); in pcf2127_wdt_stop() local
314 return regmap_write(pcf2127->regmap, PCF2127_REG_WD_VAL, in pcf2127_wdt_stop()
330 .identity = "NXP PCF2127/PCF2129 Watchdog",
342 static int pcf2127_watchdog_init(struct device *dev, struct pcf2127 *pcf2127) in pcf2127_watchdog_init() argument
351 pcf2127->wdd.parent = dev; in pcf2127_watchdog_init()
352 pcf2127->wdd.info = &pcf2127_wdt_info; in pcf2127_watchdog_init()
353 pcf2127->wdd.ops = &pcf2127_watchdog_ops; in pcf2127_watchdog_init()
354 pcf2127->wdd.min_timeout = PCF2127_WD_VAL_MIN; in pcf2127_watchdog_init()
355 pcf2127->wdd.max_timeout = PCF2127_WD_VAL_MAX; in pcf2127_watchdog_init()
356 pcf2127->wdd.timeout = PCF2127_WD_VAL_DEFAULT; in pcf2127_watchdog_init()
357 pcf2127->wdd.min_hw_heartbeat_ms = 500; in pcf2127_watchdog_init()
358 pcf2127->wdd.status = WATCHDOG_NOWAYOUT_INIT_STATUS; in pcf2127_watchdog_init()
360 watchdog_set_drvdata(&pcf2127->wdd, pcf2127); in pcf2127_watchdog_init()
363 ret = regmap_read(pcf2127->regmap, PCF2127_REG_WD_VAL, &wdd_timeout); in pcf2127_watchdog_init()
368 set_bit(WDOG_HW_RUNNING, &pcf2127->wdd.status); in pcf2127_watchdog_init()
370 return devm_watchdog_register_device(dev, &pcf2127->wdd); in pcf2127_watchdog_init()
376 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_read_alarm() local
380 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL2, &ctrl2); in pcf2127_rtc_read_alarm()
384 ret = pcf2127_wdt_active_ping(&pcf2127->wdd); in pcf2127_rtc_read_alarm()
388 ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_ALARM_SC, buf, in pcf2127_rtc_read_alarm()
406 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_alarm_irq_enable() local
409 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2, in pcf2127_rtc_alarm_irq_enable()
415 return pcf2127_wdt_active_ping(&pcf2127->wdd); in pcf2127_rtc_alarm_irq_enable()
420 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_set_alarm() local
424 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2, in pcf2127_rtc_set_alarm()
429 ret = pcf2127_wdt_active_ping(&pcf2127->wdd); in pcf2127_rtc_set_alarm()
439 ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_ALARM_SC, buf, in pcf2127_rtc_set_alarm()
453 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_ts_read() local
458 ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_CTRL1, data, in pcf2127_rtc_ts_read()
495 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_ts_snapshot() local
499 if (pcf2127->ts_valid) in pcf2127_rtc_ts_snapshot()
502 ret = pcf2127_rtc_ts_read(dev, &pcf2127->ts); in pcf2127_rtc_ts_snapshot()
504 pcf2127->ts_valid = true; in pcf2127_rtc_ts_snapshot()
509 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_irq() local
513 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1, &ctrl1); in pcf2127_rtc_irq()
517 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL2, &ctrl2); in pcf2127_rtc_irq()
528 regmap_write(pcf2127->regmap, PCF2127_REG_CTRL1, in pcf2127_rtc_irq()
532 regmap_write(pcf2127->regmap, PCF2127_REG_CTRL2, in pcf2127_rtc_irq()
536 rtc_update_irq(pcf2127->rtc, 1, RTC_IRQF | RTC_AF); in pcf2127_rtc_irq()
538 pcf2127_wdt_active_ping(&pcf2127->wdd); in pcf2127_rtc_irq()
558 struct pcf2127 *pcf2127 = dev_get_drvdata(dev->parent); in timestamp0_store() local
561 if (pcf2127->irq_enabled) { in timestamp0_store()
562 pcf2127->ts_valid = false; in timestamp0_store()
564 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL1, in timestamp0_store()
571 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2, in timestamp0_store()
578 ret = pcf2127_wdt_active_ping(&pcf2127->wdd); in timestamp0_store()
589 struct pcf2127 *pcf2127 = dev_get_drvdata(dev->parent); in timestamp0_show() local
594 if (pcf2127->irq_enabled) { in timestamp0_show()
595 if (!pcf2127->ts_valid) in timestamp0_show()
597 ts = pcf2127->ts; in timestamp0_show()
599 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1, &ctrl1); in timestamp0_show()
603 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL2, &ctrl2); in timestamp0_show()
615 ret = pcf2127_wdt_active_ping(&pcf2127->wdd); in timestamp0_show()
636 struct pcf2127 *pcf2127; in pcf2127_probe() local
642 pcf2127 = devm_kzalloc(dev, sizeof(*pcf2127), GFP_KERNEL); in pcf2127_probe()
643 if (!pcf2127) in pcf2127_probe()
646 pcf2127->regmap = regmap; in pcf2127_probe()
648 dev_set_drvdata(dev, pcf2127); in pcf2127_probe()
650 pcf2127->rtc = devm_rtc_allocate_device(dev); in pcf2127_probe()
651 if (IS_ERR(pcf2127->rtc)) in pcf2127_probe()
652 return PTR_ERR(pcf2127->rtc); in pcf2127_probe()
654 pcf2127->rtc->ops = &pcf2127_rtc_ops; in pcf2127_probe()
655 pcf2127->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in pcf2127_probe()
656 pcf2127->rtc->range_max = RTC_TIMESTAMP_END_2099; in pcf2127_probe()
657 pcf2127->rtc->set_start_time = true; /* Sets actual start to 1970 */ in pcf2127_probe()
658 pcf2127->rtc->uie_unsupported = 1; in pcf2127_probe()
659 clear_bit(RTC_FEATURE_ALARM, pcf2127->rtc->features); in pcf2127_probe()
670 pcf2127->irq_enabled = true; in pcf2127_probe()
675 set_bit(RTC_FEATURE_ALARM, pcf2127->rtc->features); in pcf2127_probe()
680 .priv = pcf2127, in pcf2127_probe()
686 ret = devm_rtc_nvmem_register(pcf2127->rtc, &nvmem_cfg); in pcf2127_probe()
693 regmap_clear_bits(pcf2127->regmap, PCF2127_REG_CTRL1, in pcf2127_probe()
696 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CLKOUT, &val); in pcf2127_probe()
701 ret = regmap_set_bits(pcf2127->regmap, PCF2127_REG_CLKOUT, in pcf2127_probe()
718 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_WD_CTL, in pcf2127_probe()
731 pcf2127_watchdog_init(dev, pcf2127); in pcf2127_probe()
739 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3, in pcf2127_probe()
753 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_TS_CTRL, in pcf2127_probe()
768 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2, in pcf2127_probe()
777 ret = rtc_add_group(pcf2127->rtc, &pcf2127_attr_group); in pcf2127_probe()
784 return devm_rtc_register_device(pcf2127->rtc); in pcf2127_probe()
789 { .compatible = "nxp,pcf2127" },
901 { "pcf2127", 1 },
910 .name = "rtc-pcf2127-i2c",
968 { "pcf2127", 1 },
977 .name = "rtc-pcf2127-spi",
1013 pr_err("Failed to register pcf2127 i2c driver: %d\n", ret); in pcf2127_init()
1019 pr_err("Failed to register pcf2127 spi driver: %d\n", ret); in pcf2127_init()
1035 MODULE_DESCRIPTION("NXP PCF2127/29 RTC driver");