at master 13 kB view raw
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * NVIDIA Voltage Regulator Specification RTC 4 * 5 * SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. 6 * All rights reserved. 7 */ 8 9#include <linux/bits.h> 10#include <linux/err.h> 11#include <linux/i2c.h> 12#include <linux/interrupt.h> 13#include <linux/module.h> 14#include <linux/rtc.h> 15 16#define NVVRS_REG_VENDOR_ID 0x00 17#define NVVRS_REG_MODEL_REV 0x01 18 19/* Interrupts registers */ 20#define NVVRS_REG_INT_SRC1 0x10 21#define NVVRS_REG_INT_SRC2 0x11 22#define NVVRS_REG_INT_VENDOR 0x12 23 24/* Control Registers */ 25#define NVVRS_REG_CTL_1 0x28 26#define NVVRS_REG_CTL_2 0x29 27 28/* RTC Registers */ 29#define NVVRS_REG_RTC_T3 0x70 30#define NVVRS_REG_RTC_T2 0x71 31#define NVVRS_REG_RTC_T1 0x72 32#define NVVRS_REG_RTC_T0 0x73 33#define NVVRS_REG_RTC_A3 0x74 34#define NVVRS_REG_RTC_A2 0x75 35#define NVVRS_REG_RTC_A1 0x76 36#define NVVRS_REG_RTC_A0 0x77 37 38/* Interrupt Mask */ 39#define NVVRS_INT_SRC1_RSTIRQ_MASK BIT(0) 40#define NVVRS_INT_SRC1_OSC_MASK BIT(1) 41#define NVVRS_INT_SRC1_EN_MASK BIT(2) 42#define NVVRS_INT_SRC1_RTC_MASK BIT(3) 43#define NVVRS_INT_SRC1_PEC_MASK BIT(4) 44#define NVVRS_INT_SRC1_WDT_MASK BIT(5) 45#define NVVRS_INT_SRC1_EM_PD_MASK BIT(6) 46#define NVVRS_INT_SRC1_INTERNAL_MASK BIT(7) 47#define NVVRS_INT_SRC2_PBSP_MASK BIT(0) 48#define NVVRS_INT_SRC2_ECC_DED_MASK BIT(1) 49#define NVVRS_INT_SRC2_TSD_MASK BIT(2) 50#define NVVRS_INT_SRC2_LDO_MASK BIT(3) 51#define NVVRS_INT_SRC2_BIST_MASK BIT(4) 52#define NVVRS_INT_SRC2_RT_CRC_MASK BIT(5) 53#define NVVRS_INT_SRC2_VENDOR_MASK BIT(7) 54#define NVVRS_INT_VENDOR0_MASK BIT(0) 55#define NVVRS_INT_VENDOR1_MASK BIT(1) 56#define NVVRS_INT_VENDOR2_MASK BIT(2) 57#define NVVRS_INT_VENDOR3_MASK BIT(3) 58#define NVVRS_INT_VENDOR4_MASK BIT(4) 59#define NVVRS_INT_VENDOR5_MASK BIT(5) 60#define NVVRS_INT_VENDOR6_MASK BIT(6) 61#define NVVRS_INT_VENDOR7_MASK BIT(7) 62 63/* Controller Register Mask */ 64#define NVVRS_REG_CTL_1_FORCE_SHDN (BIT(0) | BIT(1)) 65#define NVVRS_REG_CTL_1_FORCE_ACT BIT(2) 66#define NVVRS_REG_CTL_1_FORCE_INT BIT(3) 67#define NVVRS_REG_CTL_2_EN_PEC BIT(0) 68#define NVVRS_REG_CTL_2_REQ_PEC BIT(1) 69#define NVVRS_REG_CTL_2_RTC_PU BIT(2) 70#define NVVRS_REG_CTL_2_RTC_WAKE BIT(3) 71#define NVVRS_REG_CTL_2_RST_DLY 0xF0 72 73#define ALARM_RESET_VAL 0xffffffff 74#define NVVRS_MIN_MODEL_REV 0x40 75 76enum nvvrs_irq_regs { 77 NVVRS_IRQ_REG_INT_SRC1 = 0, 78 NVVRS_IRQ_REG_INT_SRC2 = 1, 79 NVVRS_IRQ_REG_INT_VENDOR = 2, 80 NVVRS_IRQ_REG_COUNT = 3, 81}; 82 83struct nvvrs_rtc_info { 84 struct device *dev; 85 struct i2c_client *client; 86 struct rtc_device *rtc; 87 unsigned int irq; 88}; 89 90static int nvvrs_update_bits(struct nvvrs_rtc_info *info, u8 reg, 91 u8 mask, u8 value) 92{ 93 int ret; 94 u8 val; 95 96 ret = i2c_smbus_read_byte_data(info->client, reg); 97 if (ret < 0) 98 return ret; 99 100 val = (u8)ret; 101 val &= ~mask; 102 val |= (value & mask); 103 104 return i2c_smbus_write_byte_data(info->client, reg, val); 105} 106 107static int nvvrs_rtc_write_alarm(struct i2c_client *client, u8 *time) 108{ 109 int ret; 110 111 ret = i2c_smbus_write_byte_data(client, NVVRS_REG_RTC_A3, time[3]); 112 if (ret < 0) 113 return ret; 114 115 ret = i2c_smbus_write_byte_data(client, NVVRS_REG_RTC_A2, time[2]); 116 if (ret < 0) 117 return ret; 118 119 ret = i2c_smbus_write_byte_data(client, NVVRS_REG_RTC_A1, time[1]); 120 if (ret < 0) 121 return ret; 122 123 return i2c_smbus_write_byte_data(client, NVVRS_REG_RTC_A0, time[0]); 124} 125 126static int nvvrs_rtc_enable_alarm(struct nvvrs_rtc_info *info) 127{ 128 int ret; 129 130 /* Set RTC_WAKE bit for autonomous wake from sleep */ 131 ret = nvvrs_update_bits(info, NVVRS_REG_CTL_2, NVVRS_REG_CTL_2_RTC_WAKE, 132 NVVRS_REG_CTL_2_RTC_WAKE); 133 if (ret < 0) 134 return ret; 135 136 /* Set RTC_PU bit for autonomous wake from shutdown */ 137 ret = nvvrs_update_bits(info, NVVRS_REG_CTL_2, NVVRS_REG_CTL_2_RTC_PU, 138 NVVRS_REG_CTL_2_RTC_PU); 139 if (ret < 0) 140 return ret; 141 142 return 0; 143} 144 145static int nvvrs_rtc_disable_alarm(struct nvvrs_rtc_info *info) 146{ 147 struct i2c_client *client = info->client; 148 u8 val[4]; 149 int ret; 150 151 /* Clear RTC_WAKE bit */ 152 ret = nvvrs_update_bits(info, NVVRS_REG_CTL_2, NVVRS_REG_CTL_2_RTC_WAKE, 153 0); 154 if (ret < 0) 155 return ret; 156 157 /* Clear RTC_PU bit */ 158 ret = nvvrs_update_bits(info, NVVRS_REG_CTL_2, NVVRS_REG_CTL_2_RTC_PU, 159 0); 160 if (ret < 0) 161 return ret; 162 163 /* Write ALARM_RESET_VAL in RTC Alarm register to disable alarm */ 164 val[0] = 0xff; 165 val[1] = 0xff; 166 val[2] = 0xff; 167 val[3] = 0xff; 168 169 ret = nvvrs_rtc_write_alarm(client, val); 170 if (ret < 0) 171 return ret; 172 173 return 0; 174} 175 176static int nvvrs_rtc_read_time(struct device *dev, struct rtc_time *tm) 177{ 178 struct nvvrs_rtc_info *info = dev_get_drvdata(dev); 179 time64_t secs = 0; 180 int ret; 181 u8 val; 182 183 /* 184 * Multi-byte transfers are not supported with PEC enabled 185 * Read MSB first to avoid coherency issues 186 */ 187 ret = i2c_smbus_read_byte_data(info->client, NVVRS_REG_RTC_T3); 188 if (ret < 0) 189 return ret; 190 191 val = (u8)ret; 192 secs |= (time64_t)val << 24; 193 194 ret = i2c_smbus_read_byte_data(info->client, NVVRS_REG_RTC_T2); 195 if (ret < 0) 196 return ret; 197 198 val = (u8)ret; 199 secs |= (time64_t)val << 16; 200 201 ret = i2c_smbus_read_byte_data(info->client, NVVRS_REG_RTC_T1); 202 if (ret < 0) 203 return ret; 204 205 val = (u8)ret; 206 secs |= (time64_t)val << 8; 207 208 ret = i2c_smbus_read_byte_data(info->client, NVVRS_REG_RTC_T0); 209 if (ret < 0) 210 return ret; 211 212 val = (u8)ret; 213 secs |= val; 214 215 rtc_time64_to_tm(secs, tm); 216 217 return 0; 218} 219 220static int nvvrs_rtc_set_time(struct device *dev, struct rtc_time *tm) 221{ 222 struct nvvrs_rtc_info *info = dev_get_drvdata(dev); 223 time64_t secs; 224 u8 time[4]; 225 int ret; 226 227 secs = rtc_tm_to_time64(tm); 228 time[0] = secs & 0xff; 229 time[1] = (secs >> 8) & 0xff; 230 time[2] = (secs >> 16) & 0xff; 231 time[3] = (secs >> 24) & 0xff; 232 233 ret = i2c_smbus_write_byte_data(info->client, NVVRS_REG_RTC_T3, time[3]); 234 if (ret < 0) 235 return ret; 236 237 ret = i2c_smbus_write_byte_data(info->client, NVVRS_REG_RTC_T2, time[2]); 238 if (ret < 0) 239 return ret; 240 241 ret = i2c_smbus_write_byte_data(info->client, NVVRS_REG_RTC_T1, time[1]); 242 if (ret < 0) 243 return ret; 244 245 ret = i2c_smbus_write_byte_data(info->client, NVVRS_REG_RTC_T0, time[0]); 246 247 return ret; 248} 249 250static int nvvrs_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) 251{ 252 struct nvvrs_rtc_info *info = dev_get_drvdata(dev); 253 time64_t alarm_val = 0; 254 int ret; 255 u8 val; 256 257 /* Multi-byte transfers are not supported with PEC enabled */ 258 ret = i2c_smbus_read_byte_data(info->client, NVVRS_REG_RTC_A3); 259 if (ret < 0) 260 return ret; 261 262 val = (u8)ret; 263 alarm_val |= (time64_t)val << 24; 264 265 ret = i2c_smbus_read_byte_data(info->client, NVVRS_REG_RTC_A2); 266 if (ret < 0) 267 return ret; 268 269 val = (u8)ret; 270 alarm_val |= (time64_t)val << 16; 271 272 ret = i2c_smbus_read_byte_data(info->client, NVVRS_REG_RTC_A1); 273 if (ret < 0) 274 return ret; 275 276 val = (u8)ret; 277 alarm_val |= (time64_t)val << 8; 278 279 ret = i2c_smbus_read_byte_data(info->client, NVVRS_REG_RTC_A0); 280 if (ret < 0) 281 return ret; 282 283 val = (u8)ret; 284 alarm_val |= val; 285 286 if (alarm_val == ALARM_RESET_VAL) 287 alrm->enabled = 0; 288 else 289 alrm->enabled = 1; 290 291 rtc_time64_to_tm(alarm_val, &alrm->time); 292 293 return 0; 294} 295 296static int nvvrs_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) 297{ 298 struct nvvrs_rtc_info *info = dev_get_drvdata(dev); 299 time64_t secs; 300 u8 time[4]; 301 int ret; 302 303 if (!alrm->enabled) { 304 ret = nvvrs_rtc_disable_alarm(info); 305 if (ret < 0) 306 return ret; 307 } 308 309 ret = nvvrs_rtc_enable_alarm(info); 310 if (ret < 0) 311 return ret; 312 313 secs = rtc_tm_to_time64(&alrm->time); 314 time[0] = secs & 0xff; 315 time[1] = (secs >> 8) & 0xff; 316 time[2] = (secs >> 16) & 0xff; 317 time[3] = (secs >> 24) & 0xff; 318 319 ret = nvvrs_rtc_write_alarm(info->client, time); 320 321 return ret; 322} 323 324static int nvvrs_pseq_irq_clear(struct nvvrs_rtc_info *info) 325{ 326 unsigned int i; 327 int ret; 328 329 for (i = 0; i < NVVRS_IRQ_REG_COUNT; i++) { 330 ret = i2c_smbus_read_byte_data(info->client, 331 NVVRS_REG_INT_SRC1 + i); 332 if (ret < 0) { 333 dev_err(info->dev, "Failed to read INT_SRC%d : %d\n", 334 i + 1, ret); 335 return ret; 336 } 337 338 ret = i2c_smbus_write_byte_data(info->client, 339 NVVRS_REG_INT_SRC1 + i, 340 (u8)ret); 341 if (ret < 0) { 342 dev_err(info->dev, "Failed to clear INT_SRC%d : %d\n", 343 i + 1, ret); 344 return ret; 345 } 346 } 347 348 return 0; 349} 350 351static irqreturn_t nvvrs_rtc_irq_handler(int irq, void *data) 352{ 353 struct nvvrs_rtc_info *info = data; 354 int ret; 355 356 /* Check for RTC alarm interrupt */ 357 ret = i2c_smbus_read_byte_data(info->client, NVVRS_REG_INT_SRC1); 358 if (ret < 0) 359 return IRQ_NONE; 360 361 if (ret & NVVRS_INT_SRC1_RTC_MASK) { 362 rtc_lock(info->rtc); 363 rtc_update_irq(info->rtc, 1, RTC_IRQF | RTC_AF); 364 rtc_unlock(info->rtc); 365 } 366 367 /* Clear all interrupts */ 368 if (nvvrs_pseq_irq_clear(info) < 0) 369 return IRQ_NONE; 370 371 return IRQ_HANDLED; 372} 373 374static int nvvrs_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) 375{ 376 /* 377 * This hardware does not support enabling/disabling the alarm IRQ 378 * independently. The alarm is disabled by clearing the alarm time 379 * via set_alarm(). 380 */ 381 return 0; 382} 383 384static const struct rtc_class_ops nvvrs_rtc_ops = { 385 .read_time = nvvrs_rtc_read_time, 386 .set_time = nvvrs_rtc_set_time, 387 .read_alarm = nvvrs_rtc_read_alarm, 388 .set_alarm = nvvrs_rtc_set_alarm, 389 .alarm_irq_enable = nvvrs_rtc_alarm_irq_enable, 390}; 391 392static int nvvrs_pseq_vendor_info(struct nvvrs_rtc_info *info) 393{ 394 struct i2c_client *client = info->client; 395 u8 vendor_id, model_rev; 396 int ret; 397 398 ret = i2c_smbus_read_byte_data(client, NVVRS_REG_VENDOR_ID); 399 if (ret < 0) 400 return dev_err_probe(&client->dev, ret, 401 "Failed to read Vendor ID\n"); 402 403 vendor_id = (u8)ret; 404 405 ret = i2c_smbus_read_byte_data(client, NVVRS_REG_MODEL_REV); 406 if (ret < 0) 407 return dev_err_probe(&client->dev, ret, 408 "Failed to read Model Revision\n"); 409 410 model_rev = (u8)ret; 411 412 if (model_rev < NVVRS_MIN_MODEL_REV) { 413 return dev_err_probe(&client->dev, -ENODEV, 414 "Chip revision 0x%02x is not supported!\n", 415 model_rev); 416 } 417 418 dev_dbg(&client->dev, "NVVRS Vendor ID: 0x%02x, Model Rev: 0x%02x\n", 419 vendor_id, model_rev); 420 421 return 0; 422} 423 424static int nvvrs_rtc_probe(struct i2c_client *client) 425{ 426 struct nvvrs_rtc_info *info; 427 int ret; 428 429 info = devm_kzalloc(&client->dev, sizeof(*info), GFP_KERNEL); 430 if (!info) 431 return -ENOMEM; 432 433 if (client->irq <= 0) 434 return dev_err_probe(&client->dev, -EINVAL, "No IRQ specified\n"); 435 436 info->irq = client->irq; 437 info->dev = &client->dev; 438 client->flags |= I2C_CLIENT_PEC; 439 i2c_set_clientdata(client, info); 440 info->client = client; 441 442 /* Check vendor info */ 443 if (nvvrs_pseq_vendor_info(info) < 0) 444 return dev_err_probe(&client->dev, -EINVAL, 445 "Failed to get vendor info\n"); 446 447 /* Clear any pending IRQs before requesting IRQ handler */ 448 if (nvvrs_pseq_irq_clear(info) < 0) 449 return dev_err_probe(&client->dev, -EINVAL, 450 "Failed to clear interrupts\n"); 451 452 /* Allocate RTC device */ 453 info->rtc = devm_rtc_allocate_device(info->dev); 454 if (IS_ERR(info->rtc)) 455 return PTR_ERR(info->rtc); 456 457 info->rtc->ops = &nvvrs_rtc_ops; 458 info->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 459 info->rtc->range_max = RTC_TIMESTAMP_END_2099; 460 461 /* Request RTC IRQ */ 462 ret = devm_request_threaded_irq(info->dev, info->irq, NULL, 463 nvvrs_rtc_irq_handler, IRQF_ONESHOT, 464 "nvvrs-rtc", info); 465 if (ret < 0) { 466 dev_err_probe(info->dev, ret, "Failed to request RTC IRQ\n"); 467 return ret; 468 } 469 470 /* RTC as a wakeup source */ 471 devm_device_init_wakeup(info->dev); 472 473 return devm_rtc_register_device(info->rtc); 474} 475 476#ifdef CONFIG_PM_SLEEP 477static int nvvrs_rtc_suspend(struct device *dev) 478{ 479 struct nvvrs_rtc_info *info = dev_get_drvdata(dev); 480 int ret; 481 482 if (device_may_wakeup(dev)) { 483 /* Set RTC_WAKE bit for auto wake system from suspend state */ 484 ret = nvvrs_update_bits(info, NVVRS_REG_CTL_2, 485 NVVRS_REG_CTL_2_RTC_WAKE, 486 NVVRS_REG_CTL_2_RTC_WAKE); 487 if (ret < 0) { 488 dev_err(info->dev, "Failed to set RTC_WAKE bit (%d)\n", 489 ret); 490 return ret; 491 } 492 493 return enable_irq_wake(info->irq); 494 } 495 496 return 0; 497} 498 499static int nvvrs_rtc_resume(struct device *dev) 500{ 501 struct nvvrs_rtc_info *info = dev_get_drvdata(dev); 502 int ret; 503 504 if (device_may_wakeup(dev)) { 505 /* Clear FORCE_ACT bit */ 506 ret = nvvrs_update_bits(info, NVVRS_REG_CTL_1, 507 NVVRS_REG_CTL_1_FORCE_ACT, 0); 508 if (ret < 0) { 509 dev_err(info->dev, "Failed to clear FORCE_ACT bit (%d)\n", 510 ret); 511 return ret; 512 } 513 514 return disable_irq_wake(info->irq); 515 } 516 517 return 0; 518} 519 520#endif 521static SIMPLE_DEV_PM_OPS(nvvrs_rtc_pm_ops, nvvrs_rtc_suspend, nvvrs_rtc_resume); 522 523static const struct of_device_id nvvrs_rtc_of_match[] = { 524 { .compatible = "nvidia,vrs-10" }, 525 { }, 526}; 527MODULE_DEVICE_TABLE(of, nvvrs_rtc_of_match); 528 529static struct i2c_driver nvvrs_rtc_driver = { 530 .driver = { 531 .name = "rtc-nvidia-vrs10", 532 .pm = &nvvrs_rtc_pm_ops, 533 .of_match_table = nvvrs_rtc_of_match, 534 }, 535 .probe = nvvrs_rtc_probe, 536}; 537 538module_i2c_driver(nvvrs_rtc_driver); 539 540MODULE_AUTHOR("Shubhi Garg <shgarg@nvidia.com>"); 541MODULE_DESCRIPTION("NVIDIA Voltage Regulator Specification RTC driver"); 542MODULE_LICENSE("GPL");