Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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");