pcf2127
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
if (ts_id >= pcf2127->cfg->ts_count) {
ret = regmap_update_bits(pcf2127->regmap,
pcf2127->cfg->ts[ts_id].reg_base,
ret = regmap_update_bits(pcf2127->regmap, pcf2127->cfg->ts[ts_id].ie_reg,
pcf2127->cfg->ts[ts_id].ie_bit,
pcf2127->cfg->ts[ts_id].ie_bit);
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
ret = regmap_write(pcf2127->regmap,
ret = regmap_write(pcf2127->regmap,
struct pcf2127 *pcf2127;
pcf2127 = devm_kzalloc(dev, sizeof(*pcf2127), GFP_KERNEL);
if (!pcf2127)
pcf2127->regmap = regmap;
pcf2127->cfg = config;
dev_set_drvdata(dev, pcf2127);
pcf2127->rtc = devm_rtc_allocate_device(dev);
if (IS_ERR(pcf2127->rtc))
return PTR_ERR(pcf2127->rtc);
pcf2127->rtc->ops = &pcf2127_rtc_ops;
pcf2127->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
pcf2127->rtc->range_max = RTC_TIMESTAMP_END_2099;
pcf2127->rtc->set_start_time = true; /* Sets actual start to 1970 */
if (pcf2127->cfg->type == PCF2127 || pcf2127->cfg->type == PCF2129) {
set_bit(RTC_FEATURE_ALARM_RES_2S, pcf2127->rtc->features);
clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, pcf2127->rtc->features);
clear_bit(RTC_FEATURE_ALARM, pcf2127->rtc->features);
pcf2127->irq_enabled = true;
set_bit(RTC_FEATURE_ALARM, pcf2127->rtc->features);
if (pcf2127->cfg->has_int_a_b) {
if (pcf2127->cfg->has_nvmem) {
.priv = pcf2127,
ret = devm_rtc_nvmem_register(pcf2127->rtc, &nvmem_cfg);
ret = regmap_clear_bits(pcf2127->regmap, PCF2127_REG_CTRL1,
ret = regmap_read(pcf2127->regmap, pcf2127->cfg->reg_clkout, &val);
ret = regmap_set_bits(pcf2127->regmap, pcf2127->cfg->reg_clkout,
ret = regmap_update_bits(pcf2127->regmap, pcf2127->cfg->reg_wd_ctl,
(pcf2127->cfg->has_bit_wd_ctl_cd0 ? PCF2127_BIT_WD_CTL_CD0 : 0) |
pcf2127_watchdog_init(dev, pcf2127);
ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3,
for (int i = 0; i < pcf2127->cfg->ts_count; i++) {
ret = rtc_add_group(pcf2127->rtc, &pcf2127->cfg->attribute_group);
return devm_rtc_register_device(pcf2127->rtc);
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
ret = regmap_bulk_read(pcf2127->regmap, pcf2127->cfg->reg_time_base,
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
if (pcf2127->cfg->type == PCF2131) {
err = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL1,
err = regmap_write(pcf2127->regmap, PCF2131_REG_SR_RESET,
err = regmap_bulk_write(pcf2127->regmap, pcf2127->cfg->reg_time_base, buf, i);
if (pcf2127->cfg->type == PCF2131) {
err = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL1,
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value);
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value);
return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3,
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &val);
return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3,
struct pcf2127 *pcf2127 = priv;
ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_ADDR_MSB,
return regmap_bulk_read(pcf2127->regmap, PCF2127_REG_RAM_RD_CMD,
struct pcf2127 *pcf2127 = priv;
ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_ADDR_MSB,
return regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_WRT_CMD,
struct pcf2127 *pcf2127 = watchdog_get_drvdata(wdd);
wd_val = ((wdd->timeout * pcf2127->cfg->wdd_clock_hz_x1000) / 1000) + 1;
return regmap_write(pcf2127->regmap, pcf2127->cfg->reg_wd_val, wd_val);
struct pcf2127 *pcf2127 = watchdog_get_drvdata(wdd);
return regmap_write(pcf2127->regmap, pcf2127->cfg->reg_wd_val,
static int pcf2127_watchdog_init(struct device *dev, struct pcf2127 *pcf2127)
pcf2127->wdd.parent = dev;
pcf2127->wdd.info = &pcf2127_wdt_info;
pcf2127->wdd.ops = &pcf2127_watchdog_ops;
pcf2127->wdd.min_timeout =
2, pcf2127->cfg->wdd_clock_hz_x1000);
pcf2127->wdd.max_timeout =
255, pcf2127->cfg->wdd_clock_hz_x1000);
pcf2127->wdd.timeout = PCF2127_WD_DEFAULT_TIMEOUT_S;
pcf2127->cfg->wdd_clock_hz_x1000);
pcf2127->wdd.min_hw_heartbeat_ms = pcf2127->cfg->wdd_min_hw_heartbeat_ms;
pcf2127->wdd.status = WATCHDOG_NOWAYOUT_INIT_STATUS;
watchdog_set_drvdata(&pcf2127->wdd, pcf2127);
if (pcf2127->cfg->wd_val_reg_readable) {
ret = regmap_read(pcf2127->regmap, pcf2127->cfg->reg_wd_val,
set_bit(WDOG_HW_RUNNING, &pcf2127->wdd.status);
if (pcf2127->cfg->type == PCF2131) {
ret = regmap_write(pcf2127->regmap,
return devm_watchdog_register_device(dev, &pcf2127->wdd);
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL2, &ctrl2);
ret = pcf2127_wdt_active_ping(&pcf2127->wdd);
ret = regmap_bulk_read(pcf2127->regmap, pcf2127->cfg->regs_alarm_base,
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2,
return pcf2127_wdt_active_ping(&pcf2127->wdd);
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2,
ret = pcf2127_wdt_active_ping(&pcf2127->wdd);
ret = regmap_bulk_write(pcf2127->regmap, pcf2127->cfg->regs_alarm_base,
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
ret = regmap_bulk_read(pcf2127->regmap, pcf2127->cfg->ts[ts_id].reg_base,
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
if (ts_id >= pcf2127->cfg->ts_count)
if (pcf2127->ts_valid[ts_id])
ret = pcf2127_rtc_ts_read(dev, &pcf2127->ts[ts_id], ts_id);
pcf2127->ts_valid[ts_id] = true;
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL2, &ctrl2);
if (pcf2127->cfg->ts_count == 1) {
ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1, &ctrl1);
regmap_write(pcf2127->regmap, PCF2127_REG_CTRL1,
regmap_write(pcf2127->regmap, PCF2127_REG_CTRL2,
ret = regmap_read(pcf2127->regmap, PCF2131_REG_CTRL4, &ctrl4);
for (i = 0; i < pcf2127->cfg->ts_count; i++) {
regmap_write(pcf2127->regmap, PCF2131_REG_CTRL4,
regmap_write(pcf2127->regmap, PCF2127_REG_CTRL2,
rtc_update_irq(pcf2127->rtc, 1, RTC_IRQF | RTC_AF);
pcf2127_wdt_active_ping(&pcf2127->wdd);
struct pcf2127 *pcf2127 = dev_get_drvdata(dev->parent);
if (ts_id >= pcf2127->cfg->ts_count)
if (pcf2127->irq_enabled) {
pcf2127->ts_valid[ts_id] = false;
ret = regmap_update_bits(pcf2127->regmap,
pcf2127->cfg->ts[ts_id].gnd_detect_reg,
pcf2127->cfg->ts[ts_id].gnd_detect_bit,
if (pcf2127->cfg->ts[ts_id].inter_detect_bit) {
ret = regmap_update_bits(pcf2127->regmap,
pcf2127->cfg->ts[ts_id].inter_detect_reg,
pcf2127->cfg->ts[ts_id].inter_detect_bit,
ret = pcf2127_wdt_active_ping(&pcf2127->wdd);
struct pcf2127 *pcf2127 = dev_get_drvdata(dev->parent);
if (ts_id >= pcf2127->cfg->ts_count)
if (pcf2127->irq_enabled) {
if (!pcf2127->ts_valid[ts_id])
ts = pcf2127->ts[ts_id];
ret = regmap_read(pcf2127->regmap,
pcf2127->cfg->ts[ts_id].gnd_detect_reg,
valid_low = ctrl & pcf2127->cfg->ts[ts_id].gnd_detect_bit;
if (pcf2127->cfg->ts[ts_id].inter_detect_bit) {
ret = regmap_read(pcf2127->regmap,
pcf2127->cfg->ts[ts_id].inter_detect_reg,
valid_inter = ctrl & pcf2127->cfg->ts[ts_id].inter_detect_bit;
ret = pcf2127_wdt_active_ping(&pcf2127->wdd);