Lines Matching full:pcf2127
3 * An I2C and SPI driver for the NXP PCF2127/29/31 RTC
16 * Datasheets: https://www.nxp.com/docs/en/data-sheet/PCF2127.pdf
76 * PCF2127 has 512 bytes general-purpose static RAM (SRAM) that is
86 /* PCF2127/29 watchdog timer value constants */
159 PCF2127, enumerator
206 struct pcf2127 { struct
217 * In the routines that deal directly with the pcf2127 hardware, we use argument
222 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_read_time() local
230 ret = regmap_bulk_read(pcf2127->regmap, pcf2127->cfg->reg_time_base, in pcf2127_rtc_read_time()
273 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_set_time() local
297 * PCF2127/29: no special action required. in pcf2127_rtc_set_time()
301 if (pcf2127->cfg->type == PCF2131) { in pcf2127_rtc_set_time()
302 err = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL1, in pcf2127_rtc_set_time()
310 err = regmap_write(pcf2127->regmap, PCF2131_REG_SR_RESET, in pcf2127_rtc_set_time()
319 err = regmap_bulk_write(pcf2127->regmap, pcf2127->cfg->reg_time_base, buf, i); in pcf2127_rtc_set_time()
325 if (pcf2127->cfg->type == PCF2131) { in pcf2127_rtc_set_time()
327 err = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL1, in pcf2127_rtc_set_time()
340 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_param_get() local
346 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value); in pcf2127_param_get()
370 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_param_set() local
377 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value); in pcf2127_param_set()
403 return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3, in pcf2127_param_set()
419 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_ioctl() local
425 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &val); in pcf2127_rtc_ioctl()
438 return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3, in pcf2127_rtc_ioctl()
449 struct pcf2127 *pcf2127 = priv; in pcf2127_nvmem_read() local
453 ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_ADDR_MSB, in pcf2127_nvmem_read()
458 return regmap_bulk_read(pcf2127->regmap, PCF2127_REG_RAM_RD_CMD, in pcf2127_nvmem_read()
465 struct pcf2127 *pcf2127 = priv; in pcf2127_nvmem_write() local
469 ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_ADDR_MSB, in pcf2127_nvmem_write()
474 return regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_WRT_CMD, in pcf2127_nvmem_write()
483 struct pcf2127 *pcf2127 = watchdog_get_drvdata(wdd); in pcf2127_wdt_ping() local
489 wd_val = ((wdd->timeout * pcf2127->cfg->wdd_clock_hz_x1000) / 1000) + 1; in pcf2127_wdt_ping()
491 return regmap_write(pcf2127->regmap, pcf2127->cfg->reg_wd_val, wd_val); in pcf2127_wdt_ping()
523 struct pcf2127 *pcf2127 = watchdog_get_drvdata(wdd); in pcf2127_wdt_stop() local
525 return regmap_write(pcf2127->regmap, pcf2127->cfg->reg_wd_val, in pcf2127_wdt_stop()
541 .identity = "NXP PCF2127/PCF2129 Watchdog",
557 * The PCF2127/29 datasheet gives t as:
570 static int pcf2127_watchdog_init(struct device *dev, struct pcf2127 *pcf2127) in pcf2127_watchdog_init() argument
578 pcf2127->wdd.parent = dev; in pcf2127_watchdog_init()
579 pcf2127->wdd.info = &pcf2127_wdt_info; in pcf2127_watchdog_init()
580 pcf2127->wdd.ops = &pcf2127_watchdog_ops; in pcf2127_watchdog_init()
582 pcf2127->wdd.min_timeout = in pcf2127_watchdog_init()
584 2, pcf2127->cfg->wdd_clock_hz_x1000); in pcf2127_watchdog_init()
585 pcf2127->wdd.max_timeout = in pcf2127_watchdog_init()
587 255, pcf2127->cfg->wdd_clock_hz_x1000); in pcf2127_watchdog_init()
588 pcf2127->wdd.timeout = PCF2127_WD_DEFAULT_TIMEOUT_S; in pcf2127_watchdog_init()
591 pcf2127->cfg->wdd_clock_hz_x1000); in pcf2127_watchdog_init()
593 pcf2127->wdd.min_hw_heartbeat_ms = pcf2127->cfg->wdd_min_hw_heartbeat_ms; in pcf2127_watchdog_init()
594 pcf2127->wdd.status = WATCHDOG_NOWAYOUT_INIT_STATUS; in pcf2127_watchdog_init()
596 watchdog_set_drvdata(&pcf2127->wdd, pcf2127); in pcf2127_watchdog_init()
599 if (pcf2127->cfg->wd_val_reg_readable) { in pcf2127_watchdog_init()
602 ret = regmap_read(pcf2127->regmap, pcf2127->cfg->reg_wd_val, in pcf2127_watchdog_init()
608 set_bit(WDOG_HW_RUNNING, &pcf2127->wdd.status); in pcf2127_watchdog_init()
616 if (pcf2127->cfg->type == PCF2131) { in pcf2127_watchdog_init()
617 ret = regmap_write(pcf2127->regmap, in pcf2127_watchdog_init()
626 return devm_watchdog_register_device(dev, &pcf2127->wdd); in pcf2127_watchdog_init()
632 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_read_alarm() local
637 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL2, &ctrl2); in pcf2127_rtc_read_alarm()
641 ret = pcf2127_wdt_active_ping(&pcf2127->wdd); in pcf2127_rtc_read_alarm()
645 ret = regmap_bulk_read(pcf2127->regmap, pcf2127->cfg->regs_alarm_base, in pcf2127_rtc_read_alarm()
663 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_alarm_irq_enable() local
666 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2, in pcf2127_rtc_alarm_irq_enable()
672 return pcf2127_wdt_active_ping(&pcf2127->wdd); in pcf2127_rtc_alarm_irq_enable()
677 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_set_alarm() local
681 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2, in pcf2127_rtc_set_alarm()
686 ret = pcf2127_wdt_active_ping(&pcf2127->wdd); in pcf2127_rtc_set_alarm()
696 ret = regmap_bulk_write(pcf2127->regmap, pcf2127->cfg->regs_alarm_base, in pcf2127_rtc_set_alarm()
711 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_ts_read() local
716 ret = regmap_bulk_read(pcf2127->regmap, pcf2127->cfg->ts[ts_id].reg_base, in pcf2127_rtc_ts_read()
749 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_ts_snapshot() local
752 if (ts_id >= pcf2127->cfg->ts_count) in pcf2127_rtc_ts_snapshot()
756 if (pcf2127->ts_valid[ts_id]) in pcf2127_rtc_ts_snapshot()
759 ret = pcf2127_rtc_ts_read(dev, &pcf2127->ts[ts_id], ts_id); in pcf2127_rtc_ts_snapshot()
761 pcf2127->ts_valid[ts_id] = true; in pcf2127_rtc_ts_snapshot()
766 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_rtc_irq() local
770 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL2, &ctrl2); in pcf2127_rtc_irq()
774 if (pcf2127->cfg->ts_count == 1) { in pcf2127_rtc_irq()
775 /* PCF2127/29 */ in pcf2127_rtc_irq()
778 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1, &ctrl1); in pcf2127_rtc_irq()
789 regmap_write(pcf2127->regmap, PCF2127_REG_CTRL1, in pcf2127_rtc_irq()
793 regmap_write(pcf2127->regmap, PCF2127_REG_CTRL2, in pcf2127_rtc_irq()
799 ret = regmap_read(pcf2127->regmap, PCF2131_REG_CTRL4, &ctrl4); in pcf2127_rtc_irq()
810 for (i = 0; i < pcf2127->cfg->ts_count; i++) { in pcf2127_rtc_irq()
817 regmap_write(pcf2127->regmap, PCF2131_REG_CTRL4, in pcf2127_rtc_irq()
822 regmap_write(pcf2127->regmap, PCF2127_REG_CTRL2, in pcf2127_rtc_irq()
827 rtc_update_irq(pcf2127->rtc, 1, RTC_IRQF | RTC_AF); in pcf2127_rtc_irq()
829 pcf2127_wdt_active_ping(&pcf2127->wdd); in pcf2127_rtc_irq()
851 struct pcf2127 *pcf2127 = dev_get_drvdata(dev->parent); in timestamp_store() local
854 if (ts_id >= pcf2127->cfg->ts_count) in timestamp_store()
857 if (pcf2127->irq_enabled) { in timestamp_store()
858 pcf2127->ts_valid[ts_id] = false; in timestamp_store()
861 ret = regmap_update_bits(pcf2127->regmap, in timestamp_store()
862 pcf2127->cfg->ts[ts_id].gnd_detect_reg, in timestamp_store()
863 pcf2127->cfg->ts[ts_id].gnd_detect_bit, in timestamp_store()
871 if (pcf2127->cfg->ts[ts_id].inter_detect_bit) { in timestamp_store()
873 ret = regmap_update_bits(pcf2127->regmap, in timestamp_store()
874 pcf2127->cfg->ts[ts_id].inter_detect_reg, in timestamp_store()
875 pcf2127->cfg->ts[ts_id].inter_detect_bit, in timestamp_store()
884 ret = pcf2127_wdt_active_ping(&pcf2127->wdd); in timestamp_store()
924 struct pcf2127 *pcf2127 = dev_get_drvdata(dev->parent); in timestamp_show() local
928 if (ts_id >= pcf2127->cfg->ts_count) in timestamp_show()
931 if (pcf2127->irq_enabled) { in timestamp_show()
932 if (!pcf2127->ts_valid[ts_id]) in timestamp_show()
934 ts = pcf2127->ts[ts_id]; in timestamp_show()
943 ret = regmap_read(pcf2127->regmap, in timestamp_show()
944 pcf2127->cfg->ts[ts_id].gnd_detect_reg, in timestamp_show()
949 valid_low = ctrl & pcf2127->cfg->ts[ts_id].gnd_detect_bit; in timestamp_show()
951 if (pcf2127->cfg->ts[ts_id].inter_detect_bit) { in timestamp_show()
955 ret = regmap_read(pcf2127->regmap, in timestamp_show()
956 pcf2127->cfg->ts[ts_id].inter_detect_reg, in timestamp_show()
961 valid_inter = ctrl & pcf2127->cfg->ts[ts_id].inter_detect_bit; in timestamp_show()
971 ret = pcf2127_wdt_active_ping(&pcf2127->wdd); in timestamp_show()
1021 [PCF2127] = {
1022 .type = PCF2127,
1135 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_enable_ts() local
1138 if (ts_id >= pcf2127->cfg->ts_count) { in pcf2127_enable_ts()
1145 ret = regmap_update_bits(pcf2127->regmap, in pcf2127_enable_ts()
1146 pcf2127->cfg->ts[ts_id].reg_base, in pcf2127_enable_ts()
1161 ret = regmap_update_bits(pcf2127->regmap, pcf2127->cfg->ts[ts_id].ie_reg, in pcf2127_enable_ts()
1162 pcf2127->cfg->ts[ts_id].ie_bit, in pcf2127_enable_ts()
1163 pcf2127->cfg->ts[ts_id].ie_bit); in pcf2127_enable_ts()
1176 struct pcf2127 *pcf2127 = dev_get_drvdata(dev); in pcf2127_configure_interrupt_pins() local
1182 ret = regmap_write(pcf2127->regmap, in pcf2127_configure_interrupt_pins()
1187 ret = regmap_write(pcf2127->regmap, in pcf2127_configure_interrupt_pins()
1198 struct pcf2127 *pcf2127; in pcf2127_probe() local
1204 pcf2127 = devm_kzalloc(dev, sizeof(*pcf2127), GFP_KERNEL); in pcf2127_probe()
1205 if (!pcf2127) in pcf2127_probe()
1208 pcf2127->regmap = regmap; in pcf2127_probe()
1209 pcf2127->cfg = config; in pcf2127_probe()
1211 dev_set_drvdata(dev, pcf2127); in pcf2127_probe()
1213 pcf2127->rtc = devm_rtc_allocate_device(dev); in pcf2127_probe()
1214 if (IS_ERR(pcf2127->rtc)) in pcf2127_probe()
1215 return PTR_ERR(pcf2127->rtc); in pcf2127_probe()
1217 pcf2127->rtc->ops = &pcf2127_rtc_ops; in pcf2127_probe()
1218 pcf2127->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in pcf2127_probe()
1219 pcf2127->rtc->range_max = RTC_TIMESTAMP_END_2099; in pcf2127_probe()
1220 pcf2127->rtc->set_start_time = true; /* Sets actual start to 1970 */ in pcf2127_probe()
1223 * PCF2127/29 do not work correctly when setting alarms at 1s intervals. in pcf2127_probe()
1226 if (pcf2127->cfg->type == PCF2127 || pcf2127->cfg->type == PCF2129) { in pcf2127_probe()
1227 set_bit(RTC_FEATURE_ALARM_RES_2S, pcf2127->rtc->features); in pcf2127_probe()
1228 clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, pcf2127->rtc->features); in pcf2127_probe()
1231 clear_bit(RTC_FEATURE_ALARM, pcf2127->rtc->features); in pcf2127_probe()
1253 pcf2127->irq_enabled = true; in pcf2127_probe()
1258 set_bit(RTC_FEATURE_ALARM, pcf2127->rtc->features); in pcf2127_probe()
1261 if (pcf2127->cfg->has_int_a_b) { in pcf2127_probe()
1270 if (pcf2127->cfg->has_nvmem) { in pcf2127_probe()
1272 .priv = pcf2127, in pcf2127_probe()
1278 ret = devm_rtc_nvmem_register(pcf2127->rtc, &nvmem_cfg); in pcf2127_probe()
1285 ret = regmap_clear_bits(pcf2127->regmap, PCF2127_REG_CTRL1, in pcf2127_probe()
1290 ret = regmap_read(pcf2127->regmap, pcf2127->cfg->reg_clkout, &val); in pcf2127_probe()
1295 ret = regmap_set_bits(pcf2127->regmap, pcf2127->cfg->reg_clkout, in pcf2127_probe()
1312 ret = regmap_update_bits(pcf2127->regmap, pcf2127->cfg->reg_wd_ctl, in pcf2127_probe()
1318 (pcf2127->cfg->has_bit_wd_ctl_cd0 ? PCF2127_BIT_WD_CTL_CD0 : 0) | in pcf2127_probe()
1325 pcf2127_watchdog_init(dev, pcf2127); in pcf2127_probe()
1333 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3, in pcf2127_probe()
1346 for (int i = 0; i < pcf2127->cfg->ts_count; i++) { in pcf2127_probe()
1352 ret = rtc_add_group(pcf2127->rtc, &pcf2127->cfg->attribute_group); in pcf2127_probe()
1359 return devm_rtc_register_device(pcf2127->rtc); in pcf2127_probe()
1364 { .compatible = "nxp,pcf2127", .data = &pcf21xx_cfg[PCF2127] },
1452 { "pcf2127", PCF2127 },
1500 .name = "rtc-pcf2127-i2c",
1576 { "pcf2127", PCF2127 },
1586 .name = "rtc-pcf2127-spi",
1622 pr_err("Failed to register pcf2127 i2c driver: %d\n", ret); in pcf2127_init()
1628 pr_err("Failed to register pcf2127 spi driver: %d\n", ret); in pcf2127_init()
1644 MODULE_DESCRIPTION("NXP PCF2127/29/31 RTC driver");