xref: /linux/drivers/rtc/rtc-tps6594.c (revision 6c7353836a91b1479e6b81791cdc163fb04b4834)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * RTC driver for tps6594 PMIC
4  *
5  * Copyright (C) 2023 BayLibre Incorporated - https://www.baylibre.com/
6  */
7 
8 #include <linux/bcd.h>
9 #include <linux/errno.h>
10 #include <linux/init.h>
11 #include <linux/interrupt.h>
12 #include <linux/kernel.h>
13 #include <linux/limits.h>
14 #include <linux/math64.h>
15 #include <linux/module.h>
16 #include <linux/platform_device.h>
17 #include <linux/mod_devicetable.h>
18 #include <linux/property.h>
19 #include <linux/rtc.h>
20 #include <linux/types.h>
21 #include <linux/units.h>
22 
23 #include <linux/mfd/tps6594.h>
24 
25 // Total number of RTC registers needed to set time
26 #define NUM_TIME_REGS (TPS6594_REG_RTC_WEEKS - TPS6594_REG_RTC_SECONDS + 1)
27 
28 // Total number of RTC alarm registers
29 #define NUM_TIME_ALARM_REGS (NUM_TIME_REGS - 1)
30 
31 /*
32  * Min and max values supported by 'offset' interface (swapped sign).
33  * After conversion, the values do not exceed the range [-32767, 33767]
34  * which COMP_REG must conform to.
35  */
36 #define MIN_OFFSET (-277774)
37 #define MAX_OFFSET (277774)
38 
39 // Number of ticks per hour
40 #define TICKS_PER_HOUR (32768 * 3600)
41 
42 // Multiplier for ppb conversions
43 #define PPB_MULT NANO
44 
45 static int tps6594_rtc_alarm_irq_enable(struct device *dev,
46 					unsigned int enabled)
47 {
48 	struct tps6594 *tps = dev_get_drvdata(dev->parent);
49 	u8 val;
50 
51 	val = enabled ? TPS6594_BIT_IT_ALARM : 0;
52 
53 	return regmap_update_bits(tps->regmap, TPS6594_REG_RTC_INTERRUPTS,
54 				  TPS6594_BIT_IT_ALARM, val);
55 }
56 
57 /* Pulse GET_TIME field of RTC_CTRL_1 to store a timestamp in shadow registers. */
58 static int tps6594_rtc_shadow_timestamp(struct device *dev, struct tps6594 *tps)
59 {
60 	int ret;
61 
62 	/*
63 	 * Set GET_TIME to 0. Next time we set GET_TIME to 1 we will be sure to store
64 	 * an up-to-date timestamp.
65 	 */
66 	ret = regmap_clear_bits(tps->regmap, TPS6594_REG_RTC_CTRL_1,
67 				TPS6594_BIT_GET_TIME);
68 	if (ret < 0)
69 		return ret;
70 
71 	/*
72 	 * Copy content of RTC registers to shadow registers or latches to read
73 	 * a coherent timestamp.
74 	 */
75 	return regmap_set_bits(tps->regmap, TPS6594_REG_RTC_CTRL_1,
76 			       TPS6594_BIT_GET_TIME);
77 }
78 
79 static int tps6594_rtc_read_time(struct device *dev, struct rtc_time *tm)
80 {
81 	unsigned char rtc_data[NUM_TIME_REGS];
82 	struct tps6594 *tps = dev_get_drvdata(dev->parent);
83 	int ret;
84 
85 	// Check if RTC is running.
86 	ret = regmap_test_bits(tps->regmap, TPS6594_REG_RTC_STATUS,
87 			       TPS6594_BIT_RUN);
88 	if (ret < 0)
89 		return ret;
90 	if (ret == 0)
91 		return -EINVAL;
92 
93 	ret = tps6594_rtc_shadow_timestamp(dev, tps);
94 	if (ret < 0)
95 		return ret;
96 
97 	// Read shadowed RTC registers.
98 	ret = regmap_bulk_read(tps->regmap, TPS6594_REG_RTC_SECONDS, rtc_data,
99 			       NUM_TIME_REGS);
100 	if (ret < 0)
101 		return ret;
102 
103 	tm->tm_sec = bcd2bin(rtc_data[0]);
104 	tm->tm_min = bcd2bin(rtc_data[1]);
105 	tm->tm_hour = bcd2bin(rtc_data[2]);
106 	tm->tm_mday = bcd2bin(rtc_data[3]);
107 	tm->tm_mon = bcd2bin(rtc_data[4]) - 1;
108 	tm->tm_year = bcd2bin(rtc_data[5]) + 100;
109 	tm->tm_wday = bcd2bin(rtc_data[6]);
110 
111 	return 0;
112 }
113 
114 static int tps6594_rtc_set_time(struct device *dev, struct rtc_time *tm)
115 {
116 	unsigned char rtc_data[NUM_TIME_REGS];
117 	struct tps6594 *tps = dev_get_drvdata(dev->parent);
118 	int ret;
119 
120 	rtc_data[0] = bin2bcd(tm->tm_sec);
121 	rtc_data[1] = bin2bcd(tm->tm_min);
122 	rtc_data[2] = bin2bcd(tm->tm_hour);
123 	rtc_data[3] = bin2bcd(tm->tm_mday);
124 	rtc_data[4] = bin2bcd(tm->tm_mon + 1);
125 	rtc_data[5] = bin2bcd(tm->tm_year - 100);
126 	rtc_data[6] = bin2bcd(tm->tm_wday);
127 
128 	// Stop RTC while updating the RTC time registers.
129 	ret = regmap_clear_bits(tps->regmap, TPS6594_REG_RTC_CTRL_1,
130 				TPS6594_BIT_STOP_RTC);
131 	if (ret < 0)
132 		return ret;
133 
134 	// Update all the time registers in one shot.
135 	ret = regmap_bulk_write(tps->regmap, TPS6594_REG_RTC_SECONDS, rtc_data,
136 				NUM_TIME_REGS);
137 	if (ret < 0)
138 		return ret;
139 
140 	// Start back RTC.
141 	return regmap_set_bits(tps->regmap, TPS6594_REG_RTC_CTRL_1,
142 			       TPS6594_BIT_STOP_RTC);
143 }
144 
145 static int tps6594_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
146 {
147 	unsigned char alarm_data[NUM_TIME_ALARM_REGS];
148 	u32 int_val;
149 	struct tps6594 *tps = dev_get_drvdata(dev->parent);
150 	int ret;
151 
152 	ret = regmap_bulk_read(tps->regmap, TPS6594_REG_ALARM_SECONDS,
153 			       alarm_data, NUM_TIME_ALARM_REGS);
154 	if (ret < 0)
155 		return ret;
156 
157 	alm->time.tm_sec = bcd2bin(alarm_data[0]);
158 	alm->time.tm_min = bcd2bin(alarm_data[1]);
159 	alm->time.tm_hour = bcd2bin(alarm_data[2]);
160 	alm->time.tm_mday = bcd2bin(alarm_data[3]);
161 	alm->time.tm_mon = bcd2bin(alarm_data[4]) - 1;
162 	alm->time.tm_year = bcd2bin(alarm_data[5]) + 100;
163 
164 	ret = regmap_read(tps->regmap, TPS6594_REG_RTC_INTERRUPTS, &int_val);
165 	if (ret < 0)
166 		return ret;
167 
168 	alm->enabled = int_val & TPS6594_BIT_IT_ALARM;
169 
170 	return 0;
171 }
172 
173 static int tps6594_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
174 {
175 	unsigned char alarm_data[NUM_TIME_ALARM_REGS];
176 	struct tps6594 *tps = dev_get_drvdata(dev->parent);
177 	int ret;
178 
179 	// Disable alarm irq before changing the alarm timestamp.
180 	ret = tps6594_rtc_alarm_irq_enable(dev, 0);
181 	if (ret)
182 		return ret;
183 
184 	alarm_data[0] = bin2bcd(alm->time.tm_sec);
185 	alarm_data[1] = bin2bcd(alm->time.tm_min);
186 	alarm_data[2] = bin2bcd(alm->time.tm_hour);
187 	alarm_data[3] = bin2bcd(alm->time.tm_mday);
188 	alarm_data[4] = bin2bcd(alm->time.tm_mon + 1);
189 	alarm_data[5] = bin2bcd(alm->time.tm_year - 100);
190 
191 	// Update all the alarm registers in one shot.
192 	ret = regmap_bulk_write(tps->regmap, TPS6594_REG_ALARM_SECONDS,
193 				alarm_data, NUM_TIME_ALARM_REGS);
194 	if (ret < 0)
195 		return ret;
196 
197 	if (alm->enabled)
198 		ret = tps6594_rtc_alarm_irq_enable(dev, 1);
199 
200 	return ret;
201 }
202 
203 static int tps6594_rtc_set_calibration(struct device *dev, int calibration)
204 {
205 	struct tps6594 *tps = dev_get_drvdata(dev->parent);
206 	__le16 value;
207 	int ret;
208 
209 	/*
210 	 * TPS6594 uses two's complement 16 bit value for compensation of RTC
211 	 * crystal inaccuracies. One time every hour when seconds counter
212 	 * increments from 0 to 1 compensation value will be added to internal
213 	 * RTC counter value.
214 	 *
215 	 * Valid range for compensation value: [-32767 .. 32767].
216 	 */
217 	if (calibration < S16_MIN + 1 || calibration > S16_MAX)
218 		return -ERANGE;
219 
220 	value = cpu_to_le16(calibration);
221 
222 	// Update all the compensation registers in one shot.
223 	ret = regmap_bulk_write(tps->regmap, TPS6594_REG_RTC_COMP_LSB, &value,
224 				sizeof(value));
225 	if (ret < 0)
226 		return ret;
227 
228 	// Enable automatic compensation.
229 	return regmap_set_bits(tps->regmap, TPS6594_REG_RTC_CTRL_1,
230 			       TPS6594_BIT_AUTO_COMP);
231 }
232 
233 static int tps6594_rtc_get_calibration(struct device *dev, int *calibration)
234 {
235 	struct tps6594 *tps = dev_get_drvdata(dev->parent);
236 	unsigned int ctrl;
237 	__le16 value;
238 	int ret;
239 
240 	ret = regmap_read(tps->regmap, TPS6594_REG_RTC_CTRL_1, &ctrl);
241 	if (ret < 0)
242 		return ret;
243 
244 	// If automatic compensation is not enabled report back zero.
245 	if (!(ctrl & TPS6594_BIT_AUTO_COMP)) {
246 		*calibration = 0;
247 		return 0;
248 	}
249 
250 	ret = regmap_bulk_read(tps->regmap, TPS6594_REG_RTC_COMP_LSB, &value,
251 			       sizeof(value));
252 	if (ret < 0)
253 		return ret;
254 
255 	*calibration = le16_to_cpu(value);
256 
257 	return 0;
258 }
259 
260 static int tps6594_rtc_read_offset(struct device *dev, long *offset)
261 {
262 	int calibration;
263 	s64 tmp;
264 	int ret;
265 
266 	ret = tps6594_rtc_get_calibration(dev, &calibration);
267 	if (ret < 0)
268 		return ret;
269 
270 	// Convert from RTC calibration register format to ppb format.
271 	tmp = calibration * PPB_MULT;
272 
273 	if (tmp < 0)
274 		tmp -= TICKS_PER_HOUR / 2LL;
275 	else
276 		tmp += TICKS_PER_HOUR / 2LL;
277 	tmp = div_s64(tmp, TICKS_PER_HOUR);
278 
279 	/*
280 	 * SAFETY:
281 	 * Computatiion is the reverse operation of the one done in
282 	 * `tps6594_rtc_set_offset`. The safety remarks applie here too.
283 	 */
284 
285 	/*
286 	 * Offset value operates in negative way, so swap sign.
287 	 * See 8.3.10.5, (32768 - COMP_REG).
288 	 */
289 	*offset = (long)-tmp;
290 
291 	return 0;
292 }
293 
294 static int tps6594_rtc_set_offset(struct device *dev, long offset)
295 {
296 	int calibration;
297 	s64 tmp;
298 
299 	// Make sure offset value is within supported range.
300 	if (offset < MIN_OFFSET || offset > MAX_OFFSET)
301 		return -ERANGE;
302 
303 	// Convert from ppb format to RTC calibration register format.
304 
305 	tmp = offset * TICKS_PER_HOUR;
306 	if (tmp < 0)
307 		tmp -= PPB_MULT / 2LL;
308 	else
309 		tmp += PPB_MULT / 2LL;
310 	tmp = div_s64(tmp, PPB_MULT);
311 
312 	/*
313 	 * SAFETY:
314 	 * - tmp = offset * TICK_PER_HOUR :
315 	 *	`offset` can't be more than 277774, so `tmp` can't exceed 277774000000000
316 	 *	which is lower than the maximum value in an `s64` (2^63-1). No overflow here.
317 	 *
318 	 * - tmp += TICK_PER_HOUR / 2LL :
319 	 *	tmp will have a maximum value of 277774117964800 which is still inferior to 2^63-1.
320 	 */
321 
322 	// Offset value operates in negative way, so swap sign.
323 	calibration = (int)-tmp;
324 
325 	return tps6594_rtc_set_calibration(dev, calibration);
326 }
327 
328 static irqreturn_t tps6594_rtc_interrupt(int irq, void *rtc)
329 {
330 	struct device *dev = rtc;
331 	struct tps6594 *tps = dev_get_drvdata(dev->parent);
332 	struct rtc_device *rtc_dev = dev_get_drvdata(dev);
333 	int ret;
334 	u32 rtc_reg;
335 
336 	ret = regmap_read(tps->regmap, TPS6594_REG_RTC_STATUS, &rtc_reg);
337 	if (ret)
338 		return IRQ_NONE;
339 
340 	rtc_update_irq(rtc_dev, 1, RTC_IRQF | RTC_AF);
341 
342 	return IRQ_HANDLED;
343 }
344 
345 static const struct rtc_class_ops tps6594_rtc_ops = {
346 	.read_time = tps6594_rtc_read_time,
347 	.set_time = tps6594_rtc_set_time,
348 	.read_alarm = tps6594_rtc_read_alarm,
349 	.set_alarm = tps6594_rtc_set_alarm,
350 	.alarm_irq_enable = tps6594_rtc_alarm_irq_enable,
351 	.read_offset = tps6594_rtc_read_offset,
352 	.set_offset = tps6594_rtc_set_offset,
353 };
354 
355 static int tps6594_rtc_probe(struct platform_device *pdev)
356 {
357 	struct tps6594 *tps = dev_get_drvdata(pdev->dev.parent);
358 	struct device *dev = &pdev->dev;
359 	struct rtc_device *rtc;
360 	int irq;
361 	int ret;
362 
363 	rtc = devm_kzalloc(dev, sizeof(*rtc), GFP_KERNEL);
364 	if (!rtc)
365 		return -ENOMEM;
366 
367 	rtc = devm_rtc_allocate_device(dev);
368 	if (IS_ERR(rtc))
369 		return PTR_ERR(rtc);
370 
371 	// Enable crystal oscillator.
372 	ret = regmap_set_bits(tps->regmap, TPS6594_REG_RTC_CTRL_2,
373 			      TPS6594_BIT_XTAL_EN);
374 	if (ret < 0)
375 		return ret;
376 
377 	ret = regmap_test_bits(tps->regmap, TPS6594_REG_RTC_STATUS,
378 			       TPS6594_BIT_RUN);
379 	if (ret < 0)
380 		return ret;
381 	// RTC not running.
382 	if (ret == 0) {
383 		ret = regmap_set_bits(tps->regmap, TPS6594_REG_RTC_CTRL_1,
384 				      TPS6594_BIT_STOP_RTC);
385 		if (ret < 0)
386 			return ret;
387 
388 		/*
389 		 * On some boards, a 40 ms delay is needed before BIT_RUN is set.
390 		 * 80 ms should provide sufficient margin.
391 		 */
392 		mdelay(80);
393 
394 		/*
395 		 * RTC should be running now. Check if this is the case.
396 		 * If not it might be a missing oscillator.
397 		 */
398 		ret = regmap_test_bits(tps->regmap, TPS6594_REG_RTC_STATUS,
399 				       TPS6594_BIT_RUN);
400 		if (ret < 0)
401 			return ret;
402 		if (ret == 0)
403 			return -ENODEV;
404 
405 		// Stop RTC until first call to `tps6594_rtc_set_time`.
406 		ret = regmap_clear_bits(tps->regmap, TPS6594_REG_RTC_CTRL_1,
407 					TPS6594_BIT_STOP_RTC);
408 		if (ret < 0)
409 			return ret;
410 	}
411 
412 	platform_set_drvdata(pdev, rtc);
413 
414 	irq = platform_get_irq_byname(pdev, TPS6594_IRQ_NAME_ALARM);
415 	if (irq < 0)
416 		return dev_err_probe(dev, irq, "Failed to get irq\n");
417 
418 	ret = devm_request_threaded_irq(dev, irq, NULL, tps6594_rtc_interrupt,
419 					IRQF_ONESHOT, TPS6594_IRQ_NAME_ALARM,
420 					dev);
421 	if (ret < 0)
422 		return dev_err_probe(dev, ret,
423 				     "Failed to request_threaded_irq\n");
424 
425 	ret = device_init_wakeup(dev, true);
426 	if (ret < 0)
427 		return dev_err_probe(dev, ret,
428 				     "Failed to init rtc as wakeup source\n");
429 
430 	rtc->ops = &tps6594_rtc_ops;
431 	rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
432 	rtc->range_max = RTC_TIMESTAMP_END_2099;
433 
434 	return devm_rtc_register_device(rtc);
435 }
436 
437 static const struct platform_device_id tps6594_rtc_id_table[] = {
438 	{ "tps6594-rtc", },
439 	{}
440 };
441 MODULE_DEVICE_TABLE(platform, tps6594_rtc_id_table);
442 
443 static struct platform_driver tps6594_rtc_driver = {
444 	.probe		= tps6594_rtc_probe,
445 	.driver		= {
446 		.name	= "tps6594-rtc",
447 	},
448 	.id_table = tps6594_rtc_id_table,
449 };
450 
451 module_platform_driver(tps6594_rtc_driver);
452 MODULE_AUTHOR("Esteban Blanc <eblanc@baylibre.com>");
453 MODULE_DESCRIPTION("TPS6594 RTC driver");
454 MODULE_LICENSE("GPL");
455