rtc-rx8025.c (14454B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Driver for Epson's RTC module RX-8025 SA/NB 4 * 5 * Copyright (C) 2009 Wolfgang Grandegger <wg@grandegger.com> 6 * 7 * Copyright (C) 2005 by Digi International Inc. 8 * All rights reserved. 9 * 10 * Modified by fengjh at rising.com.cn 11 * <lm-sensors@lm-sensors.org> 12 * 2006.11 13 * 14 * Code cleanup by Sergei Poselenov, <sposelenov@emcraft.com> 15 * Converted to new style by Wolfgang Grandegger <wg@grandegger.com> 16 * Alarm and periodic interrupt added by Dmitry Rakhchev <rda@emcraft.com> 17 */ 18#include <linux/bcd.h> 19#include <linux/bitops.h> 20#include <linux/i2c.h> 21#include <linux/kernel.h> 22#include <linux/module.h> 23#include <linux/rtc.h> 24 25/* Register definitions */ 26#define RX8025_REG_SEC 0x00 27#define RX8025_REG_MIN 0x01 28#define RX8025_REG_HOUR 0x02 29#define RX8025_REG_WDAY 0x03 30#define RX8025_REG_MDAY 0x04 31#define RX8025_REG_MONTH 0x05 32#define RX8025_REG_YEAR 0x06 33#define RX8025_REG_DIGOFF 0x07 34#define RX8025_REG_ALWMIN 0x08 35#define RX8025_REG_ALWHOUR 0x09 36#define RX8025_REG_ALWWDAY 0x0a 37#define RX8025_REG_ALDMIN 0x0b 38#define RX8025_REG_ALDHOUR 0x0c 39/* 0x0d is reserved */ 40#define RX8025_REG_CTRL1 0x0e 41#define RX8025_REG_CTRL2 0x0f 42 43#define RX8025_BIT_CTRL1_CT (7 << 0) 44/* 1 Hz periodic level irq */ 45#define RX8025_BIT_CTRL1_CT_1HZ 4 46#define RX8025_BIT_CTRL1_TEST BIT(3) 47#define RX8025_BIT_CTRL1_1224 BIT(5) 48#define RX8025_BIT_CTRL1_DALE BIT(6) 49#define RX8025_BIT_CTRL1_WALE BIT(7) 50 51#define RX8025_BIT_CTRL2_DAFG BIT(0) 52#define RX8025_BIT_CTRL2_WAFG BIT(1) 53#define RX8025_BIT_CTRL2_CTFG BIT(2) 54#define RX8025_BIT_CTRL2_PON BIT(4) 55#define RX8025_BIT_CTRL2_XST BIT(5) 56#define RX8025_BIT_CTRL2_VDET BIT(6) 57 58/* Clock precision adjustment */ 59#define RX8025_ADJ_RESOLUTION 3050 /* in ppb */ 60#define RX8025_ADJ_DATA_MAX 62 61#define RX8025_ADJ_DATA_MIN -62 62 63enum rx_model { 64 model_rx_unknown, 65 model_rx_8025, 66 model_rx_8035, 67 model_last 68}; 69 70static const struct i2c_device_id rx8025_id[] = { 71 { "rx8025", model_rx_8025 }, 72 { "rx8035", model_rx_8035 }, 73 { } 74}; 75MODULE_DEVICE_TABLE(i2c, rx8025_id); 76 77struct rx8025_data { 78 struct rtc_device *rtc; 79 enum rx_model model; 80 u8 ctrl1; 81}; 82 83static s32 rx8025_read_reg(const struct i2c_client *client, u8 number) 84{ 85 return i2c_smbus_read_byte_data(client, number << 4); 86} 87 88static int rx8025_read_regs(const struct i2c_client *client, 89 u8 number, u8 length, u8 *values) 90{ 91 int ret = i2c_smbus_read_i2c_block_data(client, number << 4, length, 92 values); 93 if (ret != length) 94 return ret < 0 ? ret : -EIO; 95 96 return 0; 97} 98 99static s32 rx8025_write_reg(const struct i2c_client *client, u8 number, 100 u8 value) 101{ 102 return i2c_smbus_write_byte_data(client, number << 4, value); 103} 104 105static s32 rx8025_write_regs(const struct i2c_client *client, 106 u8 number, u8 length, const u8 *values) 107{ 108 return i2c_smbus_write_i2c_block_data(client, number << 4, 109 length, values); 110} 111 112static int rx8025_is_osc_stopped(enum rx_model model, int ctrl2) 113{ 114 int xstp = ctrl2 & RX8025_BIT_CTRL2_XST; 115 /* XSTP bit has different polarity on RX-8025 vs RX-8035. 116 * RX-8025: 0 == oscillator stopped 117 * RX-8035: 1 == oscillator stopped 118 */ 119 120 if (model == model_rx_8025) 121 xstp = !xstp; 122 123 return xstp; 124} 125 126static int rx8025_check_validity(struct device *dev) 127{ 128 struct i2c_client *client = to_i2c_client(dev); 129 struct rx8025_data *drvdata = dev_get_drvdata(dev); 130 int ctrl2; 131 int xstp; 132 133 ctrl2 = rx8025_read_reg(client, RX8025_REG_CTRL2); 134 if (ctrl2 < 0) 135 return ctrl2; 136 137 if (ctrl2 & RX8025_BIT_CTRL2_VDET) 138 dev_warn(dev, "power voltage drop detected\n"); 139 140 if (ctrl2 & RX8025_BIT_CTRL2_PON) { 141 dev_warn(dev, "power-on reset detected, date is invalid\n"); 142 return -EINVAL; 143 } 144 145 xstp = rx8025_is_osc_stopped(drvdata->model, ctrl2); 146 if (xstp) { 147 dev_warn(dev, "crystal stopped, date is invalid\n"); 148 return -EINVAL; 149 } 150 151 return 0; 152} 153 154static int rx8025_reset_validity(struct i2c_client *client) 155{ 156 struct rx8025_data *drvdata = i2c_get_clientdata(client); 157 int ctrl2 = rx8025_read_reg(client, RX8025_REG_CTRL2); 158 159 if (ctrl2 < 0) 160 return ctrl2; 161 162 ctrl2 &= ~(RX8025_BIT_CTRL2_PON | RX8025_BIT_CTRL2_VDET); 163 164 if (drvdata->model == model_rx_8025) 165 ctrl2 |= RX8025_BIT_CTRL2_XST; 166 else 167 ctrl2 &= ~(RX8025_BIT_CTRL2_XST); 168 169 return rx8025_write_reg(client, RX8025_REG_CTRL2, 170 ctrl2); 171} 172 173static irqreturn_t rx8025_handle_irq(int irq, void *dev_id) 174{ 175 struct i2c_client *client = dev_id; 176 struct rx8025_data *rx8025 = i2c_get_clientdata(client); 177 int status, xstp; 178 179 rtc_lock(rx8025->rtc); 180 status = rx8025_read_reg(client, RX8025_REG_CTRL2); 181 if (status < 0) 182 goto out; 183 184 xstp = rx8025_is_osc_stopped(rx8025->model, status); 185 if (xstp) 186 dev_warn(&client->dev, "Oscillation stop was detected," 187 "you may have to readjust the clock\n"); 188 189 if (status & RX8025_BIT_CTRL2_CTFG) { 190 /* periodic */ 191 status &= ~RX8025_BIT_CTRL2_CTFG; 192 rtc_update_irq(rx8025->rtc, 1, RTC_PF | RTC_IRQF); 193 } 194 195 if (status & RX8025_BIT_CTRL2_DAFG) { 196 /* alarm */ 197 status &= RX8025_BIT_CTRL2_DAFG; 198 if (rx8025_write_reg(client, RX8025_REG_CTRL1, 199 rx8025->ctrl1 & ~RX8025_BIT_CTRL1_DALE)) 200 goto out; 201 rtc_update_irq(rx8025->rtc, 1, RTC_AF | RTC_IRQF); 202 } 203 204out: 205 rtc_unlock(rx8025->rtc); 206 207 return IRQ_HANDLED; 208} 209 210static int rx8025_get_time(struct device *dev, struct rtc_time *dt) 211{ 212 struct i2c_client *client = to_i2c_client(dev); 213 struct rx8025_data *rx8025 = dev_get_drvdata(dev); 214 u8 date[7]; 215 int err; 216 217 err = rx8025_check_validity(dev); 218 if (err) 219 return err; 220 221 err = rx8025_read_regs(client, RX8025_REG_SEC, 7, date); 222 if (err) 223 return err; 224 225 dev_dbg(dev, "%s: read %7ph\n", __func__, date); 226 227 dt->tm_sec = bcd2bin(date[RX8025_REG_SEC] & 0x7f); 228 dt->tm_min = bcd2bin(date[RX8025_REG_MIN] & 0x7f); 229 if (rx8025->ctrl1 & RX8025_BIT_CTRL1_1224) 230 dt->tm_hour = bcd2bin(date[RX8025_REG_HOUR] & 0x3f); 231 else 232 dt->tm_hour = bcd2bin(date[RX8025_REG_HOUR] & 0x1f) % 12 233 + (date[RX8025_REG_HOUR] & 0x20 ? 12 : 0); 234 235 dt->tm_mday = bcd2bin(date[RX8025_REG_MDAY] & 0x3f); 236 dt->tm_mon = bcd2bin(date[RX8025_REG_MONTH] & 0x1f) - 1; 237 dt->tm_year = bcd2bin(date[RX8025_REG_YEAR]) + 100; 238 239 dev_dbg(dev, "%s: date %ptRr\n", __func__, dt); 240 241 return 0; 242} 243 244static int rx8025_set_time(struct device *dev, struct rtc_time *dt) 245{ 246 struct i2c_client *client = to_i2c_client(dev); 247 struct rx8025_data *rx8025 = dev_get_drvdata(dev); 248 u8 date[7]; 249 int ret; 250 251 /* 252 * Here the read-only bits are written as "0". I'm not sure if that 253 * is sound. 254 */ 255 date[RX8025_REG_SEC] = bin2bcd(dt->tm_sec); 256 date[RX8025_REG_MIN] = bin2bcd(dt->tm_min); 257 if (rx8025->ctrl1 & RX8025_BIT_CTRL1_1224) 258 date[RX8025_REG_HOUR] = bin2bcd(dt->tm_hour); 259 else 260 date[RX8025_REG_HOUR] = (dt->tm_hour >= 12 ? 0x20 : 0) 261 | bin2bcd((dt->tm_hour + 11) % 12 + 1); 262 263 date[RX8025_REG_WDAY] = bin2bcd(dt->tm_wday); 264 date[RX8025_REG_MDAY] = bin2bcd(dt->tm_mday); 265 date[RX8025_REG_MONTH] = bin2bcd(dt->tm_mon + 1); 266 date[RX8025_REG_YEAR] = bin2bcd(dt->tm_year - 100); 267 268 dev_dbg(dev, "%s: write %7ph\n", __func__, date); 269 270 ret = rx8025_write_regs(client, RX8025_REG_SEC, 7, date); 271 if (ret < 0) 272 return ret; 273 274 return rx8025_reset_validity(client); 275} 276 277static int rx8025_init_client(struct i2c_client *client) 278{ 279 struct rx8025_data *rx8025 = i2c_get_clientdata(client); 280 u8 ctrl[2], ctrl2; 281 int need_clear = 0; 282 int err; 283 284 err = rx8025_read_regs(client, RX8025_REG_CTRL1, 2, ctrl); 285 if (err) 286 goto out; 287 288 /* Keep test bit zero ! */ 289 rx8025->ctrl1 = ctrl[0] & ~RX8025_BIT_CTRL1_TEST; 290 291 if (ctrl[1] & (RX8025_BIT_CTRL2_DAFG | RX8025_BIT_CTRL2_WAFG)) { 292 dev_warn(&client->dev, "Alarm was detected\n"); 293 need_clear = 1; 294 } 295 296 if (ctrl[1] & RX8025_BIT_CTRL2_CTFG) 297 need_clear = 1; 298 299 if (need_clear) { 300 ctrl2 = ctrl[1]; 301 ctrl2 &= ~(RX8025_BIT_CTRL2_CTFG | RX8025_BIT_CTRL2_WAFG | 302 RX8025_BIT_CTRL2_DAFG); 303 304 err = rx8025_write_reg(client, RX8025_REG_CTRL2, ctrl2); 305 } 306out: 307 return err; 308} 309 310/* Alarm support */ 311static int rx8025_read_alarm(struct device *dev, struct rtc_wkalrm *t) 312{ 313 struct i2c_client *client = to_i2c_client(dev); 314 struct rx8025_data *rx8025 = dev_get_drvdata(dev); 315 u8 ald[2]; 316 int ctrl2, err; 317 318 err = rx8025_read_regs(client, RX8025_REG_ALDMIN, 2, ald); 319 if (err) 320 return err; 321 322 ctrl2 = rx8025_read_reg(client, RX8025_REG_CTRL2); 323 if (ctrl2 < 0) 324 return ctrl2; 325 326 dev_dbg(dev, "%s: read alarm 0x%02x 0x%02x ctrl2 %02x\n", 327 __func__, ald[0], ald[1], ctrl2); 328 329 /* Hardware alarms precision is 1 minute! */ 330 t->time.tm_sec = 0; 331 t->time.tm_min = bcd2bin(ald[0] & 0x7f); 332 if (rx8025->ctrl1 & RX8025_BIT_CTRL1_1224) 333 t->time.tm_hour = bcd2bin(ald[1] & 0x3f); 334 else 335 t->time.tm_hour = bcd2bin(ald[1] & 0x1f) % 12 336 + (ald[1] & 0x20 ? 12 : 0); 337 338 dev_dbg(dev, "%s: date: %ptRr\n", __func__, &t->time); 339 t->enabled = !!(rx8025->ctrl1 & RX8025_BIT_CTRL1_DALE); 340 t->pending = (ctrl2 & RX8025_BIT_CTRL2_DAFG) && t->enabled; 341 342 return err; 343} 344 345static int rx8025_set_alarm(struct device *dev, struct rtc_wkalrm *t) 346{ 347 struct i2c_client *client = to_i2c_client(dev); 348 struct rx8025_data *rx8025 = dev_get_drvdata(dev); 349 u8 ald[2]; 350 int err; 351 352 ald[0] = bin2bcd(t->time.tm_min); 353 if (rx8025->ctrl1 & RX8025_BIT_CTRL1_1224) 354 ald[1] = bin2bcd(t->time.tm_hour); 355 else 356 ald[1] = (t->time.tm_hour >= 12 ? 0x20 : 0) 357 | bin2bcd((t->time.tm_hour + 11) % 12 + 1); 358 359 dev_dbg(dev, "%s: write 0x%02x 0x%02x\n", __func__, ald[0], ald[1]); 360 361 if (rx8025->ctrl1 & RX8025_BIT_CTRL1_DALE) { 362 rx8025->ctrl1 &= ~RX8025_BIT_CTRL1_DALE; 363 err = rx8025_write_reg(client, RX8025_REG_CTRL1, 364 rx8025->ctrl1); 365 if (err) 366 return err; 367 } 368 err = rx8025_write_regs(client, RX8025_REG_ALDMIN, 2, ald); 369 if (err) 370 return err; 371 372 if (t->enabled) { 373 rx8025->ctrl1 |= RX8025_BIT_CTRL1_DALE; 374 err = rx8025_write_reg(client, RX8025_REG_CTRL1, 375 rx8025->ctrl1); 376 if (err) 377 return err; 378 } 379 380 return 0; 381} 382 383static int rx8025_alarm_irq_enable(struct device *dev, unsigned int enabled) 384{ 385 struct i2c_client *client = to_i2c_client(dev); 386 struct rx8025_data *rx8025 = dev_get_drvdata(dev); 387 u8 ctrl1; 388 int err; 389 390 ctrl1 = rx8025->ctrl1; 391 if (enabled) 392 ctrl1 |= RX8025_BIT_CTRL1_DALE; 393 else 394 ctrl1 &= ~RX8025_BIT_CTRL1_DALE; 395 396 if (ctrl1 != rx8025->ctrl1) { 397 rx8025->ctrl1 = ctrl1; 398 err = rx8025_write_reg(client, RX8025_REG_CTRL1, 399 rx8025->ctrl1); 400 if (err) 401 return err; 402 } 403 return 0; 404} 405 406/* 407 * According to the RX8025 SA/NB application manual the frequency and 408 * temperature characteristics can be approximated using the following 409 * equation: 410 * 411 * df = a * (ut - t)**2 412 * 413 * df: Frequency deviation in any temperature 414 * a : Coefficient = (-35 +-5) * 10**-9 415 * ut: Ultimate temperature in degree = +25 +-5 degree 416 * t : Any temperature in degree 417 */ 418static int rx8025_read_offset(struct device *dev, long *offset) 419{ 420 struct i2c_client *client = to_i2c_client(dev); 421 int digoff; 422 423 digoff = rx8025_read_reg(client, RX8025_REG_DIGOFF); 424 if (digoff < 0) 425 return digoff; 426 427 *offset = digoff >= 64 ? digoff - 128 : digoff; 428 if (*offset > 0) 429 (*offset)--; 430 *offset *= RX8025_ADJ_RESOLUTION; 431 432 return 0; 433} 434 435static int rx8025_set_offset(struct device *dev, long offset) 436{ 437 struct i2c_client *client = to_i2c_client(dev); 438 u8 digoff; 439 440 offset /= RX8025_ADJ_RESOLUTION; 441 if (offset > RX8025_ADJ_DATA_MAX) 442 offset = RX8025_ADJ_DATA_MAX; 443 else if (offset < RX8025_ADJ_DATA_MIN) 444 offset = RX8025_ADJ_DATA_MIN; 445 else if (offset > 0) 446 offset++; 447 else if (offset < 0) 448 offset += 128; 449 digoff = offset; 450 451 return rx8025_write_reg(client, RX8025_REG_DIGOFF, digoff); 452} 453 454static const struct rtc_class_ops rx8025_rtc_ops = { 455 .read_time = rx8025_get_time, 456 .set_time = rx8025_set_time, 457 .read_alarm = rx8025_read_alarm, 458 .set_alarm = rx8025_set_alarm, 459 .alarm_irq_enable = rx8025_alarm_irq_enable, 460 .read_offset = rx8025_read_offset, 461 .set_offset = rx8025_set_offset, 462}; 463 464static ssize_t rx8025_sysfs_show_clock_adjust(struct device *dev, 465 struct device_attribute *attr, 466 char *buf) 467{ 468 long adj; 469 int err; 470 471 dev_warn_once(dev, "clock_adjust_ppb is deprecated, use offset\n"); 472 err = rx8025_read_offset(dev, &adj); 473 if (err) 474 return err; 475 476 return sprintf(buf, "%ld\n", -adj); 477} 478 479static ssize_t rx8025_sysfs_store_clock_adjust(struct device *dev, 480 struct device_attribute *attr, 481 const char *buf, size_t count) 482{ 483 long adj; 484 int err; 485 486 dev_warn_once(dev, "clock_adjust_ppb is deprecated, use offset\n"); 487 if (kstrtol(buf, 10, &adj) != 0) 488 return -EINVAL; 489 490 err = rx8025_set_offset(dev, -adj); 491 492 return err ? err : count; 493} 494 495static DEVICE_ATTR(clock_adjust_ppb, S_IRUGO | S_IWUSR, 496 rx8025_sysfs_show_clock_adjust, 497 rx8025_sysfs_store_clock_adjust); 498 499static struct attribute *rx8025_attrs[] = { 500 &dev_attr_clock_adjust_ppb.attr, 501 NULL 502}; 503 504static const struct attribute_group rx8025_attr_group = { 505 .attrs = rx8025_attrs, 506}; 507 508static int rx8025_probe(struct i2c_client *client, 509 const struct i2c_device_id *id) 510{ 511 struct i2c_adapter *adapter = client->adapter; 512 struct rx8025_data *rx8025; 513 int err = 0; 514 515 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA 516 | I2C_FUNC_SMBUS_I2C_BLOCK)) { 517 dev_err(&adapter->dev, 518 "doesn't support required functionality\n"); 519 return -EIO; 520 } 521 522 rx8025 = devm_kzalloc(&client->dev, sizeof(*rx8025), GFP_KERNEL); 523 if (!rx8025) 524 return -ENOMEM; 525 526 i2c_set_clientdata(client, rx8025); 527 528 if (id) 529 rx8025->model = id->driver_data; 530 531 err = rx8025_init_client(client); 532 if (err) 533 return err; 534 535 rx8025->rtc = devm_rtc_allocate_device(&client->dev); 536 if (IS_ERR(rx8025->rtc)) 537 return PTR_ERR(rx8025->rtc); 538 539 rx8025->rtc->ops = &rx8025_rtc_ops; 540 rx8025->rtc->range_min = RTC_TIMESTAMP_BEGIN_1900; 541 rx8025->rtc->range_max = RTC_TIMESTAMP_END_2099; 542 543 if (client->irq > 0) { 544 dev_info(&client->dev, "IRQ %d supplied\n", client->irq); 545 err = devm_request_threaded_irq(&client->dev, client->irq, NULL, 546 rx8025_handle_irq, 547 IRQF_ONESHOT, 548 "rx8025", client); 549 if (err) 550 clear_bit(RTC_FEATURE_ALARM, rx8025->rtc->features); 551 } 552 553 rx8025->rtc->max_user_freq = 1; 554 555 set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rx8025->rtc->features); 556 clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rx8025->rtc->features); 557 558 err = rtc_add_group(rx8025->rtc, &rx8025_attr_group); 559 if (err) 560 return err; 561 562 return devm_rtc_register_device(rx8025->rtc); 563} 564 565static struct i2c_driver rx8025_driver = { 566 .driver = { 567 .name = "rtc-rx8025", 568 }, 569 .probe = rx8025_probe, 570 .id_table = rx8025_id, 571}; 572 573module_i2c_driver(rx8025_driver); 574 575MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); 576MODULE_DESCRIPTION("RX-8025 SA/NB RTC driver"); 577MODULE_LICENSE("GPL");