0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include <linux/i2c.h>
0017 #include <linux/spi/spi.h>
0018 #include <linux/bcd.h>
0019 #include <linux/rtc.h>
0020 #include <linux/slab.h>
0021 #include <linux/module.h>
0022 #include <linux/of.h>
0023 #include <linux/of_irq.h>
0024 #include <linux/regmap.h>
0025 #include <linux/watchdog.h>
0026
0027
0028 #define PCF2127_REG_CTRL1 0x00
0029 #define PCF2127_BIT_CTRL1_POR_OVRD BIT(3)
0030 #define PCF2127_BIT_CTRL1_TSF1 BIT(4)
0031
0032 #define PCF2127_REG_CTRL2 0x01
0033 #define PCF2127_BIT_CTRL2_AIE BIT(1)
0034 #define PCF2127_BIT_CTRL2_TSIE BIT(2)
0035 #define PCF2127_BIT_CTRL2_AF BIT(4)
0036 #define PCF2127_BIT_CTRL2_TSF2 BIT(5)
0037 #define PCF2127_BIT_CTRL2_WDTF BIT(6)
0038
0039 #define PCF2127_REG_CTRL3 0x02
0040 #define PCF2127_BIT_CTRL3_BLIE BIT(0)
0041 #define PCF2127_BIT_CTRL3_BIE BIT(1)
0042 #define PCF2127_BIT_CTRL3_BLF BIT(2)
0043 #define PCF2127_BIT_CTRL3_BF BIT(3)
0044 #define PCF2127_BIT_CTRL3_BTSE BIT(4)
0045
0046 #define PCF2127_REG_SC 0x03
0047 #define PCF2127_BIT_SC_OSF BIT(7)
0048 #define PCF2127_REG_MN 0x04
0049 #define PCF2127_REG_HR 0x05
0050 #define PCF2127_REG_DM 0x06
0051 #define PCF2127_REG_DW 0x07
0052 #define PCF2127_REG_MO 0x08
0053 #define PCF2127_REG_YR 0x09
0054
0055 #define PCF2127_REG_ALARM_SC 0x0A
0056 #define PCF2127_REG_ALARM_MN 0x0B
0057 #define PCF2127_REG_ALARM_HR 0x0C
0058 #define PCF2127_REG_ALARM_DM 0x0D
0059 #define PCF2127_REG_ALARM_DW 0x0E
0060 #define PCF2127_BIT_ALARM_AE BIT(7)
0061
0062 #define PCF2127_REG_CLKOUT 0x0f
0063 #define PCF2127_BIT_CLKOUT_OTPR BIT(5)
0064
0065 #define PCF2127_REG_WD_CTL 0x10
0066 #define PCF2127_BIT_WD_CTL_TF0 BIT(0)
0067 #define PCF2127_BIT_WD_CTL_TF1 BIT(1)
0068 #define PCF2127_BIT_WD_CTL_CD0 BIT(6)
0069 #define PCF2127_BIT_WD_CTL_CD1 BIT(7)
0070 #define PCF2127_REG_WD_VAL 0x11
0071
0072 #define PCF2127_REG_TS_CTRL 0x12
0073 #define PCF2127_BIT_TS_CTRL_TSOFF BIT(6)
0074 #define PCF2127_BIT_TS_CTRL_TSM BIT(7)
0075 #define PCF2127_REG_TS_SC 0x13
0076 #define PCF2127_REG_TS_MN 0x14
0077 #define PCF2127_REG_TS_HR 0x15
0078 #define PCF2127_REG_TS_DM 0x16
0079 #define PCF2127_REG_TS_MO 0x17
0080 #define PCF2127_REG_TS_YR 0x18
0081
0082
0083
0084
0085
0086
0087 #define PCF2127_REG_RAM_ADDR_MSB 0x1A
0088 #define PCF2127_REG_RAM_WRT_CMD 0x1C
0089 #define PCF2127_REG_RAM_RD_CMD 0x1D
0090
0091
0092 #define PCF2127_WD_VAL_STOP 0
0093 #define PCF2127_WD_VAL_MIN 2
0094 #define PCF2127_WD_VAL_MAX 255
0095 #define PCF2127_WD_VAL_DEFAULT 60
0096
0097
0098 #define PCF2127_CTRL1_IRQ_MASK (PCF2127_BIT_CTRL1_TSF1)
0099 #define PCF2127_CTRL2_IRQ_MASK ( \
0100 PCF2127_BIT_CTRL2_AF | \
0101 PCF2127_BIT_CTRL2_WDTF | \
0102 PCF2127_BIT_CTRL2_TSF2)
0103
0104 struct pcf2127 {
0105 struct rtc_device *rtc;
0106 struct watchdog_device wdd;
0107 struct regmap *regmap;
0108 time64_t ts;
0109 bool ts_valid;
0110 bool irq_enabled;
0111 };
0112
0113
0114
0115
0116
0117 static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm)
0118 {
0119 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
0120 unsigned char buf[10];
0121 int ret;
0122
0123
0124
0125
0126
0127 ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_CTRL3,
0128 (buf + PCF2127_REG_CTRL3),
0129 ARRAY_SIZE(buf) - PCF2127_REG_CTRL3);
0130 if (ret) {
0131 dev_err(dev, "%s: read error\n", __func__);
0132 return ret;
0133 }
0134
0135 if (buf[PCF2127_REG_CTRL3] & PCF2127_BIT_CTRL3_BLF)
0136 dev_info(dev,
0137 "low voltage detected, check/replace RTC battery.\n");
0138
0139
0140 if (buf[PCF2127_REG_SC] & PCF2127_BIT_SC_OSF) {
0141
0142
0143
0144
0145 dev_warn(dev,
0146 "oscillator stop detected, date/time is not reliable\n");
0147 return -EINVAL;
0148 }
0149
0150 dev_dbg(dev,
0151 "%s: raw data is cr3=%02x, sec=%02x, min=%02x, hr=%02x, "
0152 "mday=%02x, wday=%02x, mon=%02x, year=%02x\n",
0153 __func__, buf[PCF2127_REG_CTRL3], buf[PCF2127_REG_SC],
0154 buf[PCF2127_REG_MN], buf[PCF2127_REG_HR],
0155 buf[PCF2127_REG_DM], buf[PCF2127_REG_DW],
0156 buf[PCF2127_REG_MO], buf[PCF2127_REG_YR]);
0157
0158 tm->tm_sec = bcd2bin(buf[PCF2127_REG_SC] & 0x7F);
0159 tm->tm_min = bcd2bin(buf[PCF2127_REG_MN] & 0x7F);
0160 tm->tm_hour = bcd2bin(buf[PCF2127_REG_HR] & 0x3F);
0161 tm->tm_mday = bcd2bin(buf[PCF2127_REG_DM] & 0x3F);
0162 tm->tm_wday = buf[PCF2127_REG_DW] & 0x07;
0163 tm->tm_mon = bcd2bin(buf[PCF2127_REG_MO] & 0x1F) - 1;
0164 tm->tm_year = bcd2bin(buf[PCF2127_REG_YR]);
0165 tm->tm_year += 100;
0166
0167 dev_dbg(dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
0168 "mday=%d, mon=%d, year=%d, wday=%d\n",
0169 __func__,
0170 tm->tm_sec, tm->tm_min, tm->tm_hour,
0171 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
0172
0173 return 0;
0174 }
0175
0176 static int pcf2127_rtc_set_time(struct device *dev, struct rtc_time *tm)
0177 {
0178 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
0179 unsigned char buf[7];
0180 int i = 0, err;
0181
0182 dev_dbg(dev, "%s: secs=%d, mins=%d, hours=%d, "
0183 "mday=%d, mon=%d, year=%d, wday=%d\n",
0184 __func__,
0185 tm->tm_sec, tm->tm_min, tm->tm_hour,
0186 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
0187
0188
0189 buf[i++] = bin2bcd(tm->tm_sec);
0190 buf[i++] = bin2bcd(tm->tm_min);
0191 buf[i++] = bin2bcd(tm->tm_hour);
0192 buf[i++] = bin2bcd(tm->tm_mday);
0193 buf[i++] = tm->tm_wday & 0x07;
0194
0195
0196 buf[i++] = bin2bcd(tm->tm_mon + 1);
0197
0198
0199 buf[i++] = bin2bcd(tm->tm_year - 100);
0200
0201
0202 err = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_SC, buf, i);
0203 if (err) {
0204 dev_err(dev,
0205 "%s: err=%d", __func__, err);
0206 return err;
0207 }
0208
0209 return 0;
0210 }
0211
0212 static int pcf2127_rtc_ioctl(struct device *dev,
0213 unsigned int cmd, unsigned long arg)
0214 {
0215 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
0216 int val, touser = 0;
0217 int ret;
0218
0219 switch (cmd) {
0220 case RTC_VL_READ:
0221 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &val);
0222 if (ret)
0223 return ret;
0224
0225 if (val & PCF2127_BIT_CTRL3_BLF)
0226 touser |= RTC_VL_BACKUP_LOW;
0227
0228 if (val & PCF2127_BIT_CTRL3_BF)
0229 touser |= RTC_VL_BACKUP_SWITCH;
0230
0231 return put_user(touser, (unsigned int __user *)arg);
0232
0233 case RTC_VL_CLR:
0234 return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3,
0235 PCF2127_BIT_CTRL3_BF, 0);
0236
0237 default:
0238 return -ENOIOCTLCMD;
0239 }
0240 }
0241
0242 static int pcf2127_nvmem_read(void *priv, unsigned int offset,
0243 void *val, size_t bytes)
0244 {
0245 struct pcf2127 *pcf2127 = priv;
0246 int ret;
0247 unsigned char offsetbuf[] = { offset >> 8, offset };
0248
0249 ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_ADDR_MSB,
0250 offsetbuf, 2);
0251 if (ret)
0252 return ret;
0253
0254 return regmap_bulk_read(pcf2127->regmap, PCF2127_REG_RAM_RD_CMD,
0255 val, bytes);
0256 }
0257
0258 static int pcf2127_nvmem_write(void *priv, unsigned int offset,
0259 void *val, size_t bytes)
0260 {
0261 struct pcf2127 *pcf2127 = priv;
0262 int ret;
0263 unsigned char offsetbuf[] = { offset >> 8, offset };
0264
0265 ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_ADDR_MSB,
0266 offsetbuf, 2);
0267 if (ret)
0268 return ret;
0269
0270 return regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_WRT_CMD,
0271 val, bytes);
0272 }
0273
0274
0275
0276 static int pcf2127_wdt_ping(struct watchdog_device *wdd)
0277 {
0278 struct pcf2127 *pcf2127 = watchdog_get_drvdata(wdd);
0279
0280 return regmap_write(pcf2127->regmap, PCF2127_REG_WD_VAL, wdd->timeout);
0281 }
0282
0283
0284
0285
0286
0287
0288
0289
0290 static int pcf2127_wdt_active_ping(struct watchdog_device *wdd)
0291 {
0292 int ret = 0;
0293
0294 if (watchdog_active(wdd)) {
0295 ret = pcf2127_wdt_ping(wdd);
0296 if (ret)
0297 dev_err(wdd->parent,
0298 "%s: watchdog restart failed, ret=%d\n",
0299 __func__, ret);
0300 }
0301
0302 return ret;
0303 }
0304
0305 static int pcf2127_wdt_start(struct watchdog_device *wdd)
0306 {
0307 return pcf2127_wdt_ping(wdd);
0308 }
0309
0310 static int pcf2127_wdt_stop(struct watchdog_device *wdd)
0311 {
0312 struct pcf2127 *pcf2127 = watchdog_get_drvdata(wdd);
0313
0314 return regmap_write(pcf2127->regmap, PCF2127_REG_WD_VAL,
0315 PCF2127_WD_VAL_STOP);
0316 }
0317
0318 static int pcf2127_wdt_set_timeout(struct watchdog_device *wdd,
0319 unsigned int new_timeout)
0320 {
0321 dev_dbg(wdd->parent, "new watchdog timeout: %is (old: %is)\n",
0322 new_timeout, wdd->timeout);
0323
0324 wdd->timeout = new_timeout;
0325
0326 return pcf2127_wdt_active_ping(wdd);
0327 }
0328
0329 static const struct watchdog_info pcf2127_wdt_info = {
0330 .identity = "NXP PCF2127/PCF2129 Watchdog",
0331 .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT,
0332 };
0333
0334 static const struct watchdog_ops pcf2127_watchdog_ops = {
0335 .owner = THIS_MODULE,
0336 .start = pcf2127_wdt_start,
0337 .stop = pcf2127_wdt_stop,
0338 .ping = pcf2127_wdt_ping,
0339 .set_timeout = pcf2127_wdt_set_timeout,
0340 };
0341
0342 static int pcf2127_watchdog_init(struct device *dev, struct pcf2127 *pcf2127)
0343 {
0344 u32 wdd_timeout;
0345 int ret;
0346
0347 if (!IS_ENABLED(CONFIG_WATCHDOG) ||
0348 !device_property_read_bool(dev, "reset-source"))
0349 return 0;
0350
0351 pcf2127->wdd.parent = dev;
0352 pcf2127->wdd.info = &pcf2127_wdt_info;
0353 pcf2127->wdd.ops = &pcf2127_watchdog_ops;
0354 pcf2127->wdd.min_timeout = PCF2127_WD_VAL_MIN;
0355 pcf2127->wdd.max_timeout = PCF2127_WD_VAL_MAX;
0356 pcf2127->wdd.timeout = PCF2127_WD_VAL_DEFAULT;
0357 pcf2127->wdd.min_hw_heartbeat_ms = 500;
0358 pcf2127->wdd.status = WATCHDOG_NOWAYOUT_INIT_STATUS;
0359
0360 watchdog_set_drvdata(&pcf2127->wdd, pcf2127);
0361
0362
0363 ret = regmap_read(pcf2127->regmap, PCF2127_REG_WD_VAL, &wdd_timeout);
0364 if (ret)
0365 return ret;
0366
0367 if (wdd_timeout)
0368 set_bit(WDOG_HW_RUNNING, &pcf2127->wdd.status);
0369
0370 return devm_watchdog_register_device(dev, &pcf2127->wdd);
0371 }
0372
0373
0374 static int pcf2127_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0375 {
0376 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
0377 u8 buf[5];
0378 unsigned int ctrl2;
0379 int ret;
0380
0381 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL2, &ctrl2);
0382 if (ret)
0383 return ret;
0384
0385 ret = pcf2127_wdt_active_ping(&pcf2127->wdd);
0386 if (ret)
0387 return ret;
0388
0389 ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_ALARM_SC, buf,
0390 sizeof(buf));
0391 if (ret)
0392 return ret;
0393
0394 alrm->enabled = ctrl2 & PCF2127_BIT_CTRL2_AIE;
0395 alrm->pending = ctrl2 & PCF2127_BIT_CTRL2_AF;
0396
0397 alrm->time.tm_sec = bcd2bin(buf[0] & 0x7F);
0398 alrm->time.tm_min = bcd2bin(buf[1] & 0x7F);
0399 alrm->time.tm_hour = bcd2bin(buf[2] & 0x3F);
0400 alrm->time.tm_mday = bcd2bin(buf[3] & 0x3F);
0401
0402 return 0;
0403 }
0404
0405 static int pcf2127_rtc_alarm_irq_enable(struct device *dev, u32 enable)
0406 {
0407 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
0408 int ret;
0409
0410 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2,
0411 PCF2127_BIT_CTRL2_AIE,
0412 enable ? PCF2127_BIT_CTRL2_AIE : 0);
0413 if (ret)
0414 return ret;
0415
0416 return pcf2127_wdt_active_ping(&pcf2127->wdd);
0417 }
0418
0419 static int pcf2127_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0420 {
0421 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
0422 uint8_t buf[5];
0423 int ret;
0424
0425 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2,
0426 PCF2127_BIT_CTRL2_AF, 0);
0427 if (ret)
0428 return ret;
0429
0430 ret = pcf2127_wdt_active_ping(&pcf2127->wdd);
0431 if (ret)
0432 return ret;
0433
0434 buf[0] = bin2bcd(alrm->time.tm_sec);
0435 buf[1] = bin2bcd(alrm->time.tm_min);
0436 buf[2] = bin2bcd(alrm->time.tm_hour);
0437 buf[3] = bin2bcd(alrm->time.tm_mday);
0438 buf[4] = PCF2127_BIT_ALARM_AE;
0439
0440 ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_ALARM_SC, buf,
0441 sizeof(buf));
0442 if (ret)
0443 return ret;
0444
0445 return pcf2127_rtc_alarm_irq_enable(dev, alrm->enabled);
0446 }
0447
0448
0449
0450
0451
0452 static int pcf2127_rtc_ts_read(struct device *dev, time64_t *ts)
0453 {
0454 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
0455 struct rtc_time tm;
0456 int ret;
0457 unsigned char data[25];
0458
0459 ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_CTRL1, data,
0460 sizeof(data));
0461 if (ret) {
0462 dev_err(dev, "%s: read error ret=%d\n", __func__, ret);
0463 return ret;
0464 }
0465
0466 dev_dbg(dev,
0467 "%s: raw data is cr1=%02x, cr2=%02x, cr3=%02x, ts_sc=%02x, ts_mn=%02x, ts_hr=%02x, ts_dm=%02x, ts_mo=%02x, ts_yr=%02x\n",
0468 __func__, data[PCF2127_REG_CTRL1], data[PCF2127_REG_CTRL2],
0469 data[PCF2127_REG_CTRL3], data[PCF2127_REG_TS_SC],
0470 data[PCF2127_REG_TS_MN], data[PCF2127_REG_TS_HR],
0471 data[PCF2127_REG_TS_DM], data[PCF2127_REG_TS_MO],
0472 data[PCF2127_REG_TS_YR]);
0473
0474 tm.tm_sec = bcd2bin(data[PCF2127_REG_TS_SC] & 0x7F);
0475 tm.tm_min = bcd2bin(data[PCF2127_REG_TS_MN] & 0x7F);
0476 tm.tm_hour = bcd2bin(data[PCF2127_REG_TS_HR] & 0x3F);
0477 tm.tm_mday = bcd2bin(data[PCF2127_REG_TS_DM] & 0x3F);
0478
0479 tm.tm_mon = bcd2bin(data[PCF2127_REG_TS_MO] & 0x1F) - 1;
0480 tm.tm_year = bcd2bin(data[PCF2127_REG_TS_YR]);
0481 if (tm.tm_year < 70)
0482 tm.tm_year += 100;
0483
0484 ret = rtc_valid_tm(&tm);
0485 if (ret) {
0486 dev_err(dev, "Invalid timestamp. ret=%d\n", ret);
0487 return ret;
0488 }
0489
0490 *ts = rtc_tm_to_time64(&tm);
0491 return 0;
0492 };
0493
0494 static void pcf2127_rtc_ts_snapshot(struct device *dev)
0495 {
0496 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
0497 int ret;
0498
0499
0500 if (pcf2127->ts_valid)
0501 return;
0502
0503 ret = pcf2127_rtc_ts_read(dev, &pcf2127->ts);
0504 if (!ret)
0505 pcf2127->ts_valid = true;
0506 }
0507
0508 static irqreturn_t pcf2127_rtc_irq(int irq, void *dev)
0509 {
0510 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
0511 unsigned int ctrl1, ctrl2;
0512 int ret = 0;
0513
0514 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1, &ctrl1);
0515 if (ret)
0516 return IRQ_NONE;
0517
0518 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL2, &ctrl2);
0519 if (ret)
0520 return IRQ_NONE;
0521
0522 if (!(ctrl1 & PCF2127_CTRL1_IRQ_MASK || ctrl2 & PCF2127_CTRL2_IRQ_MASK))
0523 return IRQ_NONE;
0524
0525 if (ctrl1 & PCF2127_BIT_CTRL1_TSF1 || ctrl2 & PCF2127_BIT_CTRL2_TSF2)
0526 pcf2127_rtc_ts_snapshot(dev);
0527
0528 if (ctrl1 & PCF2127_CTRL1_IRQ_MASK)
0529 regmap_write(pcf2127->regmap, PCF2127_REG_CTRL1,
0530 ctrl1 & ~PCF2127_CTRL1_IRQ_MASK);
0531
0532 if (ctrl2 & PCF2127_CTRL2_IRQ_MASK)
0533 regmap_write(pcf2127->regmap, PCF2127_REG_CTRL2,
0534 ctrl2 & ~PCF2127_CTRL2_IRQ_MASK);
0535
0536 if (ctrl2 & PCF2127_BIT_CTRL2_AF)
0537 rtc_update_irq(pcf2127->rtc, 1, RTC_IRQF | RTC_AF);
0538
0539 pcf2127_wdt_active_ping(&pcf2127->wdd);
0540
0541 return IRQ_HANDLED;
0542 }
0543
0544 static const struct rtc_class_ops pcf2127_rtc_ops = {
0545 .ioctl = pcf2127_rtc_ioctl,
0546 .read_time = pcf2127_rtc_read_time,
0547 .set_time = pcf2127_rtc_set_time,
0548 .read_alarm = pcf2127_rtc_read_alarm,
0549 .set_alarm = pcf2127_rtc_set_alarm,
0550 .alarm_irq_enable = pcf2127_rtc_alarm_irq_enable,
0551 };
0552
0553
0554
0555 static ssize_t timestamp0_store(struct device *dev,
0556 struct device_attribute *attr,
0557 const char *buf, size_t count)
0558 {
0559 struct pcf2127 *pcf2127 = dev_get_drvdata(dev->parent);
0560 int ret;
0561
0562 if (pcf2127->irq_enabled) {
0563 pcf2127->ts_valid = false;
0564 } else {
0565 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL1,
0566 PCF2127_BIT_CTRL1_TSF1, 0);
0567 if (ret) {
0568 dev_err(dev, "%s: update ctrl1 ret=%d\n", __func__, ret);
0569 return ret;
0570 }
0571
0572 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2,
0573 PCF2127_BIT_CTRL2_TSF2, 0);
0574 if (ret) {
0575 dev_err(dev, "%s: update ctrl2 ret=%d\n", __func__, ret);
0576 return ret;
0577 }
0578
0579 ret = pcf2127_wdt_active_ping(&pcf2127->wdd);
0580 if (ret)
0581 return ret;
0582 }
0583
0584 return count;
0585 };
0586
0587 static ssize_t timestamp0_show(struct device *dev,
0588 struct device_attribute *attr, char *buf)
0589 {
0590 struct pcf2127 *pcf2127 = dev_get_drvdata(dev->parent);
0591 unsigned int ctrl1, ctrl2;
0592 int ret;
0593 time64_t ts;
0594
0595 if (pcf2127->irq_enabled) {
0596 if (!pcf2127->ts_valid)
0597 return 0;
0598 ts = pcf2127->ts;
0599 } else {
0600 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1, &ctrl1);
0601 if (ret)
0602 return 0;
0603
0604 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL2, &ctrl2);
0605 if (ret)
0606 return 0;
0607
0608 if (!(ctrl1 & PCF2127_BIT_CTRL1_TSF1) &&
0609 !(ctrl2 & PCF2127_BIT_CTRL2_TSF2))
0610 return 0;
0611
0612 ret = pcf2127_rtc_ts_read(dev->parent, &ts);
0613 if (ret)
0614 return 0;
0615
0616 ret = pcf2127_wdt_active_ping(&pcf2127->wdd);
0617 if (ret)
0618 return ret;
0619 }
0620 return sprintf(buf, "%llu\n", (unsigned long long)ts);
0621 };
0622
0623 static DEVICE_ATTR_RW(timestamp0);
0624
0625 static struct attribute *pcf2127_attrs[] = {
0626 &dev_attr_timestamp0.attr,
0627 NULL
0628 };
0629
0630 static const struct attribute_group pcf2127_attr_group = {
0631 .attrs = pcf2127_attrs,
0632 };
0633
0634 static int pcf2127_probe(struct device *dev, struct regmap *regmap,
0635 int alarm_irq, const char *name, bool is_pcf2127)
0636 {
0637 struct pcf2127 *pcf2127;
0638 int ret = 0;
0639 unsigned int val;
0640
0641 dev_dbg(dev, "%s\n", __func__);
0642
0643 pcf2127 = devm_kzalloc(dev, sizeof(*pcf2127), GFP_KERNEL);
0644 if (!pcf2127)
0645 return -ENOMEM;
0646
0647 pcf2127->regmap = regmap;
0648
0649 dev_set_drvdata(dev, pcf2127);
0650
0651 pcf2127->rtc = devm_rtc_allocate_device(dev);
0652 if (IS_ERR(pcf2127->rtc))
0653 return PTR_ERR(pcf2127->rtc);
0654
0655 pcf2127->rtc->ops = &pcf2127_rtc_ops;
0656 pcf2127->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
0657 pcf2127->rtc->range_max = RTC_TIMESTAMP_END_2099;
0658 pcf2127->rtc->set_start_time = true;
0659 set_bit(RTC_FEATURE_ALARM_RES_2S, pcf2127->rtc->features);
0660 clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, pcf2127->rtc->features);
0661 clear_bit(RTC_FEATURE_ALARM, pcf2127->rtc->features);
0662
0663 if (alarm_irq > 0) {
0664 unsigned long flags;
0665
0666
0667
0668
0669
0670 if (dev_fwnode(dev))
0671 flags = 0;
0672 else
0673 flags = IRQF_TRIGGER_LOW;
0674
0675 ret = devm_request_threaded_irq(dev, alarm_irq, NULL,
0676 pcf2127_rtc_irq,
0677 flags | IRQF_ONESHOT,
0678 dev_name(dev), dev);
0679 if (ret) {
0680 dev_err(dev, "failed to request alarm irq\n");
0681 return ret;
0682 }
0683 pcf2127->irq_enabled = true;
0684 }
0685
0686 if (alarm_irq > 0 || device_property_read_bool(dev, "wakeup-source")) {
0687 device_init_wakeup(dev, true);
0688 set_bit(RTC_FEATURE_ALARM, pcf2127->rtc->features);
0689 }
0690
0691 if (is_pcf2127) {
0692 struct nvmem_config nvmem_cfg = {
0693 .priv = pcf2127,
0694 .reg_read = pcf2127_nvmem_read,
0695 .reg_write = pcf2127_nvmem_write,
0696 .size = 512,
0697 };
0698
0699 ret = devm_rtc_nvmem_register(pcf2127->rtc, &nvmem_cfg);
0700 }
0701
0702
0703
0704
0705
0706 regmap_clear_bits(pcf2127->regmap, PCF2127_REG_CTRL1,
0707 PCF2127_BIT_CTRL1_POR_OVRD);
0708
0709 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CLKOUT, &val);
0710 if (ret < 0)
0711 return ret;
0712
0713 if (!(val & PCF2127_BIT_CLKOUT_OTPR)) {
0714 ret = regmap_set_bits(pcf2127->regmap, PCF2127_REG_CLKOUT,
0715 PCF2127_BIT_CLKOUT_OTPR);
0716 if (ret < 0)
0717 return ret;
0718
0719 msleep(100);
0720 }
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_WD_CTL,
0732 PCF2127_BIT_WD_CTL_CD1 |
0733 PCF2127_BIT_WD_CTL_CD0 |
0734 PCF2127_BIT_WD_CTL_TF1 |
0735 PCF2127_BIT_WD_CTL_TF0,
0736 PCF2127_BIT_WD_CTL_CD1 |
0737 (is_pcf2127 ? PCF2127_BIT_WD_CTL_CD0 : 0) |
0738 PCF2127_BIT_WD_CTL_TF1);
0739 if (ret) {
0740 dev_err(dev, "%s: watchdog config (wd_ctl) failed\n", __func__);
0741 return ret;
0742 }
0743
0744 pcf2127_watchdog_init(dev, pcf2127);
0745
0746
0747
0748
0749
0750
0751
0752 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3,
0753 PCF2127_BIT_CTRL3_BTSE |
0754 PCF2127_BIT_CTRL3_BIE |
0755 PCF2127_BIT_CTRL3_BLIE, 0);
0756 if (ret) {
0757 dev_err(dev, "%s: interrupt config (ctrl3) failed\n",
0758 __func__);
0759 return ret;
0760 }
0761
0762
0763
0764
0765
0766 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_TS_CTRL,
0767 PCF2127_BIT_TS_CTRL_TSOFF |
0768 PCF2127_BIT_TS_CTRL_TSM,
0769 PCF2127_BIT_TS_CTRL_TSM);
0770 if (ret) {
0771 dev_err(dev, "%s: tamper detection config (ts_ctrl) failed\n",
0772 __func__);
0773 return ret;
0774 }
0775
0776
0777
0778
0779
0780
0781 ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL2,
0782 PCF2127_BIT_CTRL2_TSIE,
0783 PCF2127_BIT_CTRL2_TSIE);
0784 if (ret) {
0785 dev_err(dev, "%s: tamper detection config (ctrl2) failed\n",
0786 __func__);
0787 return ret;
0788 }
0789
0790 ret = rtc_add_group(pcf2127->rtc, &pcf2127_attr_group);
0791 if (ret) {
0792 dev_err(dev, "%s: tamper sysfs registering failed\n",
0793 __func__);
0794 return ret;
0795 }
0796
0797 return devm_rtc_register_device(pcf2127->rtc);
0798 }
0799
0800 #ifdef CONFIG_OF
0801 static const struct of_device_id pcf2127_of_match[] = {
0802 { .compatible = "nxp,pcf2127" },
0803 { .compatible = "nxp,pcf2129" },
0804 { .compatible = "nxp,pca2129" },
0805 {}
0806 };
0807 MODULE_DEVICE_TABLE(of, pcf2127_of_match);
0808 #endif
0809
0810 #if IS_ENABLED(CONFIG_I2C)
0811
0812 static int pcf2127_i2c_write(void *context, const void *data, size_t count)
0813 {
0814 struct device *dev = context;
0815 struct i2c_client *client = to_i2c_client(dev);
0816 int ret;
0817
0818 ret = i2c_master_send(client, data, count);
0819 if (ret != count)
0820 return ret < 0 ? ret : -EIO;
0821
0822 return 0;
0823 }
0824
0825 static int pcf2127_i2c_gather_write(void *context,
0826 const void *reg, size_t reg_size,
0827 const void *val, size_t val_size)
0828 {
0829 struct device *dev = context;
0830 struct i2c_client *client = to_i2c_client(dev);
0831 int ret;
0832 void *buf;
0833
0834 if (WARN_ON(reg_size != 1))
0835 return -EINVAL;
0836
0837 buf = kmalloc(val_size + 1, GFP_KERNEL);
0838 if (!buf)
0839 return -ENOMEM;
0840
0841 memcpy(buf, reg, 1);
0842 memcpy(buf + 1, val, val_size);
0843
0844 ret = i2c_master_send(client, buf, val_size + 1);
0845
0846 kfree(buf);
0847
0848 if (ret != val_size + 1)
0849 return ret < 0 ? ret : -EIO;
0850
0851 return 0;
0852 }
0853
0854 static int pcf2127_i2c_read(void *context, const void *reg, size_t reg_size,
0855 void *val, size_t val_size)
0856 {
0857 struct device *dev = context;
0858 struct i2c_client *client = to_i2c_client(dev);
0859 int ret;
0860
0861 if (WARN_ON(reg_size != 1))
0862 return -EINVAL;
0863
0864 ret = i2c_master_send(client, reg, 1);
0865 if (ret != 1)
0866 return ret < 0 ? ret : -EIO;
0867
0868 ret = i2c_master_recv(client, val, val_size);
0869 if (ret != val_size)
0870 return ret < 0 ? ret : -EIO;
0871
0872 return 0;
0873 }
0874
0875
0876
0877
0878
0879
0880 static const struct regmap_bus pcf2127_i2c_regmap = {
0881 .write = pcf2127_i2c_write,
0882 .gather_write = pcf2127_i2c_gather_write,
0883 .read = pcf2127_i2c_read,
0884 };
0885
0886 static struct i2c_driver pcf2127_i2c_driver;
0887
0888 static int pcf2127_i2c_probe(struct i2c_client *client,
0889 const struct i2c_device_id *id)
0890 {
0891 struct regmap *regmap;
0892 static const struct regmap_config config = {
0893 .reg_bits = 8,
0894 .val_bits = 8,
0895 .max_register = 0x1d,
0896 };
0897
0898 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
0899 return -ENODEV;
0900
0901 regmap = devm_regmap_init(&client->dev, &pcf2127_i2c_regmap,
0902 &client->dev, &config);
0903 if (IS_ERR(regmap)) {
0904 dev_err(&client->dev, "%s: regmap allocation failed: %ld\n",
0905 __func__, PTR_ERR(regmap));
0906 return PTR_ERR(regmap);
0907 }
0908
0909 return pcf2127_probe(&client->dev, regmap, client->irq,
0910 pcf2127_i2c_driver.driver.name, id->driver_data);
0911 }
0912
0913 static const struct i2c_device_id pcf2127_i2c_id[] = {
0914 { "pcf2127", 1 },
0915 { "pcf2129", 0 },
0916 { "pca2129", 0 },
0917 { }
0918 };
0919 MODULE_DEVICE_TABLE(i2c, pcf2127_i2c_id);
0920
0921 static struct i2c_driver pcf2127_i2c_driver = {
0922 .driver = {
0923 .name = "rtc-pcf2127-i2c",
0924 .of_match_table = of_match_ptr(pcf2127_of_match),
0925 },
0926 .probe = pcf2127_i2c_probe,
0927 .id_table = pcf2127_i2c_id,
0928 };
0929
0930 static int pcf2127_i2c_register_driver(void)
0931 {
0932 return i2c_add_driver(&pcf2127_i2c_driver);
0933 }
0934
0935 static void pcf2127_i2c_unregister_driver(void)
0936 {
0937 i2c_del_driver(&pcf2127_i2c_driver);
0938 }
0939
0940 #else
0941
0942 static int pcf2127_i2c_register_driver(void)
0943 {
0944 return 0;
0945 }
0946
0947 static void pcf2127_i2c_unregister_driver(void)
0948 {
0949 }
0950
0951 #endif
0952
0953 #if IS_ENABLED(CONFIG_SPI_MASTER)
0954
0955 static struct spi_driver pcf2127_spi_driver;
0956
0957 static int pcf2127_spi_probe(struct spi_device *spi)
0958 {
0959 static const struct regmap_config config = {
0960 .reg_bits = 8,
0961 .val_bits = 8,
0962 .read_flag_mask = 0xa0,
0963 .write_flag_mask = 0x20,
0964 .max_register = 0x1d,
0965 };
0966 struct regmap *regmap;
0967
0968 regmap = devm_regmap_init_spi(spi, &config);
0969 if (IS_ERR(regmap)) {
0970 dev_err(&spi->dev, "%s: regmap allocation failed: %ld\n",
0971 __func__, PTR_ERR(regmap));
0972 return PTR_ERR(regmap);
0973 }
0974
0975 return pcf2127_probe(&spi->dev, regmap, spi->irq,
0976 pcf2127_spi_driver.driver.name,
0977 spi_get_device_id(spi)->driver_data);
0978 }
0979
0980 static const struct spi_device_id pcf2127_spi_id[] = {
0981 { "pcf2127", 1 },
0982 { "pcf2129", 0 },
0983 { "pca2129", 0 },
0984 { }
0985 };
0986 MODULE_DEVICE_TABLE(spi, pcf2127_spi_id);
0987
0988 static struct spi_driver pcf2127_spi_driver = {
0989 .driver = {
0990 .name = "rtc-pcf2127-spi",
0991 .of_match_table = of_match_ptr(pcf2127_of_match),
0992 },
0993 .probe = pcf2127_spi_probe,
0994 .id_table = pcf2127_spi_id,
0995 };
0996
0997 static int pcf2127_spi_register_driver(void)
0998 {
0999 return spi_register_driver(&pcf2127_spi_driver);
1000 }
1001
1002 static void pcf2127_spi_unregister_driver(void)
1003 {
1004 spi_unregister_driver(&pcf2127_spi_driver);
1005 }
1006
1007 #else
1008
1009 static int pcf2127_spi_register_driver(void)
1010 {
1011 return 0;
1012 }
1013
1014 static void pcf2127_spi_unregister_driver(void)
1015 {
1016 }
1017
1018 #endif
1019
1020 static int __init pcf2127_init(void)
1021 {
1022 int ret;
1023
1024 ret = pcf2127_i2c_register_driver();
1025 if (ret) {
1026 pr_err("Failed to register pcf2127 i2c driver: %d\n", ret);
1027 return ret;
1028 }
1029
1030 ret = pcf2127_spi_register_driver();
1031 if (ret) {
1032 pr_err("Failed to register pcf2127 spi driver: %d\n", ret);
1033 pcf2127_i2c_unregister_driver();
1034 }
1035
1036 return ret;
1037 }
1038 module_init(pcf2127_init)
1039
1040 static void __exit pcf2127_exit(void)
1041 {
1042 pcf2127_spi_unregister_driver();
1043 pcf2127_i2c_unregister_driver();
1044 }
1045 module_exit(pcf2127_exit)
1046
1047 MODULE_AUTHOR("Renaud Cerrato <r.cerrato@til-technologies.fr>");
1048 MODULE_DESCRIPTION("NXP PCF2127/29 RTC driver");
1049 MODULE_LICENSE("GPL v2");