xref: /openbmc/linux/drivers/rtc/rtc-rs5c372.c (revision f71a261a)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * An I2C driver for Ricoh RS5C372, R2025S/D and RV5C38[67] RTCs
4  *
5  * Copyright (C) 2005 Pavel Mironchik <pmironchik@optifacio.net>
6  * Copyright (C) 2006 Tower Technologies
7  * Copyright (C) 2008 Paul Mundt
8  */
9 
10 #include <linux/i2c.h>
11 #include <linux/rtc.h>
12 #include <linux/bcd.h>
13 #include <linux/slab.h>
14 #include <linux/module.h>
15 #include <linux/of_device.h>
16 
17 /*
18  * Ricoh has a family of I2C based RTCs, which differ only slightly from
19  * each other.  Differences center on pinout (e.g. how many interrupts,
20  * output clock, etc) and how the control registers are used.  The '372
21  * is significant only because that's the one this driver first supported.
22  */
23 #define RS5C372_REG_SECS	0
24 #define RS5C372_REG_MINS	1
25 #define RS5C372_REG_HOURS	2
26 #define RS5C372_REG_WDAY	3
27 #define RS5C372_REG_DAY		4
28 #define RS5C372_REG_MONTH	5
29 #define RS5C372_REG_YEAR	6
30 #define RS5C372_REG_TRIM	7
31 #	define RS5C372_TRIM_XSL		0x80		/* only if RS5C372[a|b] */
32 #	define RS5C372_TRIM_MASK	0x7F
33 #	define R2221TL_TRIM_DEV		(1 << 7)	/* only if R2221TL */
34 #	define RS5C372_TRIM_DECR	(1 << 6)
35 
36 #define RS5C_REG_ALARM_A_MIN	8			/* or ALARM_W */
37 #define RS5C_REG_ALARM_A_HOURS	9
38 #define RS5C_REG_ALARM_A_WDAY	10
39 
40 #define RS5C_REG_ALARM_B_MIN	11			/* or ALARM_D */
41 #define RS5C_REG_ALARM_B_HOURS	12
42 #define RS5C_REG_ALARM_B_WDAY	13			/* (ALARM_B only) */
43 
44 #define RS5C_REG_CTRL1		14
45 #	define RS5C_CTRL1_AALE		(1 << 7)	/* or WALE */
46 #	define RS5C_CTRL1_BALE		(1 << 6)	/* or DALE */
47 #	define RV5C387_CTRL1_24		(1 << 5)
48 #	define RS5C372A_CTRL1_SL1	(1 << 5)
49 #	define RS5C_CTRL1_CT_MASK	(7 << 0)
50 #	define RS5C_CTRL1_CT0		(0 << 0)	/* no periodic irq */
51 #	define RS5C_CTRL1_CT4		(4 << 0)	/* 1 Hz level irq */
52 #define RS5C_REG_CTRL2		15
53 #	define RS5C372_CTRL2_24		(1 << 5)
54 #	define RS5C_CTRL2_XSTP		(1 << 4)	/* only if !R2x2x */
55 #	define R2x2x_CTRL2_VDET		(1 << 6)	/* only if  R2x2x */
56 #	define R2x2x_CTRL2_XSTP		(1 << 5)	/* only if  R2x2x */
57 #	define R2x2x_CTRL2_PON		(1 << 4)	/* only if  R2x2x */
58 #	define RS5C_CTRL2_CTFG		(1 << 2)
59 #	define RS5C_CTRL2_AAFG		(1 << 1)	/* or WAFG */
60 #	define RS5C_CTRL2_BAFG		(1 << 0)	/* or DAFG */
61 
62 
63 /* to read (style 1) or write registers starting at R */
64 #define RS5C_ADDR(R)		(((R) << 4) | 0)
65 
66 
67 enum rtc_type {
68 	rtc_undef = 0,
69 	rtc_r2025sd,
70 	rtc_r2221tl,
71 	rtc_rs5c372a,
72 	rtc_rs5c372b,
73 	rtc_rv5c386,
74 	rtc_rv5c387a,
75 };
76 
77 static const struct i2c_device_id rs5c372_id[] = {
78 	{ "r2025sd", rtc_r2025sd },
79 	{ "r2221tl", rtc_r2221tl },
80 	{ "rs5c372a", rtc_rs5c372a },
81 	{ "rs5c372b", rtc_rs5c372b },
82 	{ "rv5c386", rtc_rv5c386 },
83 	{ "rv5c387a", rtc_rv5c387a },
84 	{ }
85 };
86 MODULE_DEVICE_TABLE(i2c, rs5c372_id);
87 
88 static const __maybe_unused struct of_device_id rs5c372_of_match[] = {
89 	{
90 		.compatible = "ricoh,r2025sd",
91 		.data = (void *)rtc_r2025sd
92 	},
93 	{
94 		.compatible = "ricoh,r2221tl",
95 		.data = (void *)rtc_r2221tl
96 	},
97 	{
98 		.compatible = "ricoh,rs5c372a",
99 		.data = (void *)rtc_rs5c372a
100 	},
101 	{
102 		.compatible = "ricoh,rs5c372b",
103 		.data = (void *)rtc_rs5c372b
104 	},
105 	{
106 		.compatible = "ricoh,rv5c386",
107 		.data = (void *)rtc_rv5c386
108 	},
109 	{
110 		.compatible = "ricoh,rv5c387a",
111 		.data = (void *)rtc_rv5c387a
112 	},
113 	{ }
114 };
115 MODULE_DEVICE_TABLE(of, rs5c372_of_match);
116 
117 /* REVISIT:  this assumes that:
118  *  - we're in the 21st century, so it's safe to ignore the century
119  *    bit for rv5c38[67] (REG_MONTH bit 7);
120  *  - we should use ALARM_A not ALARM_B (may be wrong on some boards)
121  */
122 struct rs5c372 {
123 	struct i2c_client	*client;
124 	struct rtc_device	*rtc;
125 	enum rtc_type		type;
126 	unsigned		time24:1;
127 	unsigned		has_irq:1;
128 	unsigned		smbus:1;
129 	char			buf[17];
130 	char			*regs;
131 };
132 
133 static int rs5c_get_regs(struct rs5c372 *rs5c)
134 {
135 	struct i2c_client	*client = rs5c->client;
136 	struct i2c_msg		msgs[] = {
137 		{
138 			.addr = client->addr,
139 			.flags = I2C_M_RD,
140 			.len = sizeof(rs5c->buf),
141 			.buf = rs5c->buf
142 		},
143 	};
144 
145 	/* This implements the third reading method from the datasheet, using
146 	 * an internal address that's reset after each transaction (by STOP)
147 	 * to 0x0f ... so we read extra registers, and skip the first one.
148 	 *
149 	 * The first method doesn't work with the iop3xx adapter driver, on at
150 	 * least 80219 chips; this works around that bug.
151 	 *
152 	 * The third method on the other hand doesn't work for the SMBus-only
153 	 * configurations, so we use the the first method there, stripping off
154 	 * the extra register in the process.
155 	 */
156 	if (rs5c->smbus) {
157 		int addr = RS5C_ADDR(RS5C372_REG_SECS);
158 		int size = sizeof(rs5c->buf) - 1;
159 
160 		if (i2c_smbus_read_i2c_block_data(client, addr, size,
161 						  rs5c->buf + 1) != size) {
162 			dev_warn(&client->dev, "can't read registers\n");
163 			return -EIO;
164 		}
165 	} else {
166 		if ((i2c_transfer(client->adapter, msgs, 1)) != 1) {
167 			dev_warn(&client->dev, "can't read registers\n");
168 			return -EIO;
169 		}
170 	}
171 
172 	dev_dbg(&client->dev,
173 		"%3ph (%02x) %3ph (%02x), %3ph, %3ph; %02x %02x\n",
174 		rs5c->regs + 0, rs5c->regs[3],
175 		rs5c->regs + 4, rs5c->regs[7],
176 		rs5c->regs + 8, rs5c->regs + 11,
177 		rs5c->regs[14], rs5c->regs[15]);
178 
179 	return 0;
180 }
181 
182 static unsigned rs5c_reg2hr(struct rs5c372 *rs5c, unsigned reg)
183 {
184 	unsigned	hour;
185 
186 	if (rs5c->time24)
187 		return bcd2bin(reg & 0x3f);
188 
189 	hour = bcd2bin(reg & 0x1f);
190 	if (hour == 12)
191 		hour = 0;
192 	if (reg & 0x20)
193 		hour += 12;
194 	return hour;
195 }
196 
197 static unsigned rs5c_hr2reg(struct rs5c372 *rs5c, unsigned hour)
198 {
199 	if (rs5c->time24)
200 		return bin2bcd(hour);
201 
202 	if (hour > 12)
203 		return 0x20 | bin2bcd(hour - 12);
204 	if (hour == 12)
205 		return 0x20 | bin2bcd(12);
206 	if (hour == 0)
207 		return bin2bcd(12);
208 	return bin2bcd(hour);
209 }
210 
211 static int rs5c372_rtc_read_time(struct device *dev, struct rtc_time *tm)
212 {
213 	struct i2c_client *client = to_i2c_client(dev);
214 	struct rs5c372	*rs5c = i2c_get_clientdata(client);
215 	int		status = rs5c_get_regs(rs5c);
216 	unsigned char ctrl2 = rs5c->regs[RS5C_REG_CTRL2];
217 
218 	if (status < 0)
219 		return status;
220 
221 	switch (rs5c->type) {
222 	case rtc_r2025sd:
223 	case rtc_r2221tl:
224 		if ((rs5c->type == rtc_r2025sd && !(ctrl2 & R2x2x_CTRL2_XSTP)) ||
225 		    (rs5c->type == rtc_r2221tl &&  (ctrl2 & R2x2x_CTRL2_XSTP))) {
226 			dev_warn(&client->dev, "rtc oscillator interruption detected. Please reset the rtc clock.\n");
227 			return -EINVAL;
228 		}
229 		break;
230 	default:
231 		if (ctrl2 & RS5C_CTRL2_XSTP) {
232 			dev_warn(&client->dev, "rtc oscillator interruption detected. Please reset the rtc clock.\n");
233 			return -EINVAL;
234 		}
235 	}
236 
237 	tm->tm_sec = bcd2bin(rs5c->regs[RS5C372_REG_SECS] & 0x7f);
238 	tm->tm_min = bcd2bin(rs5c->regs[RS5C372_REG_MINS] & 0x7f);
239 	tm->tm_hour = rs5c_reg2hr(rs5c, rs5c->regs[RS5C372_REG_HOURS]);
240 
241 	tm->tm_wday = bcd2bin(rs5c->regs[RS5C372_REG_WDAY] & 0x07);
242 	tm->tm_mday = bcd2bin(rs5c->regs[RS5C372_REG_DAY] & 0x3f);
243 
244 	/* tm->tm_mon is zero-based */
245 	tm->tm_mon = bcd2bin(rs5c->regs[RS5C372_REG_MONTH] & 0x1f) - 1;
246 
247 	/* year is 1900 + tm->tm_year */
248 	tm->tm_year = bcd2bin(rs5c->regs[RS5C372_REG_YEAR]) + 100;
249 
250 	dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
251 		"mday=%d, mon=%d, year=%d, wday=%d\n",
252 		__func__,
253 		tm->tm_sec, tm->tm_min, tm->tm_hour,
254 		tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
255 
256 	return 0;
257 }
258 
259 static int rs5c372_rtc_set_time(struct device *dev, struct rtc_time *tm)
260 {
261 	struct i2c_client *client = to_i2c_client(dev);
262 	struct rs5c372	*rs5c = i2c_get_clientdata(client);
263 	unsigned char	buf[7];
264 	unsigned char	ctrl2;
265 	int		addr;
266 
267 	dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d "
268 		"mday=%d, mon=%d, year=%d, wday=%d\n",
269 		__func__,
270 		tm->tm_sec, tm->tm_min, tm->tm_hour,
271 		tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
272 
273 	addr   = RS5C_ADDR(RS5C372_REG_SECS);
274 	buf[0] = bin2bcd(tm->tm_sec);
275 	buf[1] = bin2bcd(tm->tm_min);
276 	buf[2] = rs5c_hr2reg(rs5c, tm->tm_hour);
277 	buf[3] = bin2bcd(tm->tm_wday);
278 	buf[4] = bin2bcd(tm->tm_mday);
279 	buf[5] = bin2bcd(tm->tm_mon + 1);
280 	buf[6] = bin2bcd(tm->tm_year - 100);
281 
282 	if (i2c_smbus_write_i2c_block_data(client, addr, sizeof(buf), buf) < 0) {
283 		dev_dbg(&client->dev, "%s: write error in line %i\n",
284 			__func__, __LINE__);
285 		return -EIO;
286 	}
287 
288 	addr = RS5C_ADDR(RS5C_REG_CTRL2);
289 	ctrl2 = i2c_smbus_read_byte_data(client, addr);
290 
291 	/* clear rtc warning bits */
292 	switch (rs5c->type) {
293 	case rtc_r2025sd:
294 	case rtc_r2221tl:
295 		ctrl2 &= ~(R2x2x_CTRL2_VDET | R2x2x_CTRL2_PON);
296 		if (rs5c->type == rtc_r2025sd)
297 			ctrl2 |= R2x2x_CTRL2_XSTP;
298 		else
299 			ctrl2 &= ~R2x2x_CTRL2_XSTP;
300 		break;
301 	default:
302 		ctrl2 &= ~RS5C_CTRL2_XSTP;
303 		break;
304 	}
305 
306 	if (i2c_smbus_write_byte_data(client, addr, ctrl2) < 0) {
307 		dev_dbg(&client->dev, "%s: write error in line %i\n",
308 			__func__, __LINE__);
309 		return -EIO;
310 	}
311 
312 	return 0;
313 }
314 
315 #if IS_ENABLED(CONFIG_RTC_INTF_PROC)
316 #define	NEED_TRIM
317 #endif
318 
319 #if IS_ENABLED(CONFIG_RTC_INTF_SYSFS)
320 #define	NEED_TRIM
321 #endif
322 
323 #ifdef	NEED_TRIM
324 static int rs5c372_get_trim(struct i2c_client *client, int *osc, int *trim)
325 {
326 	struct rs5c372 *rs5c372 = i2c_get_clientdata(client);
327 	u8 tmp = rs5c372->regs[RS5C372_REG_TRIM];
328 
329 	if (osc) {
330 		if (rs5c372->type == rtc_rs5c372a || rs5c372->type == rtc_rs5c372b)
331 			*osc = (tmp & RS5C372_TRIM_XSL) ? 32000 : 32768;
332 		else
333 			*osc = 32768;
334 	}
335 
336 	if (trim) {
337 		dev_dbg(&client->dev, "%s: raw trim=%x\n", __func__, tmp);
338 		tmp &= RS5C372_TRIM_MASK;
339 		if (tmp & 0x3e) {
340 			int t = tmp & 0x3f;
341 
342 			if (tmp & 0x40)
343 				t = (~t | (s8)0xc0) + 1;
344 			else
345 				t = t - 1;
346 
347 			tmp = t * 2;
348 		} else
349 			tmp = 0;
350 		*trim = tmp;
351 	}
352 
353 	return 0;
354 }
355 #endif
356 
357 static int rs5c_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
358 {
359 	struct i2c_client	*client = to_i2c_client(dev);
360 	struct rs5c372		*rs5c = i2c_get_clientdata(client);
361 	unsigned char		buf;
362 	int			status, addr;
363 
364 	buf = rs5c->regs[RS5C_REG_CTRL1];
365 
366 	if (!rs5c->has_irq)
367 		return -EINVAL;
368 
369 	status = rs5c_get_regs(rs5c);
370 	if (status < 0)
371 		return status;
372 
373 	addr = RS5C_ADDR(RS5C_REG_CTRL1);
374 	if (enabled)
375 		buf |= RS5C_CTRL1_AALE;
376 	else
377 		buf &= ~RS5C_CTRL1_AALE;
378 
379 	if (i2c_smbus_write_byte_data(client, addr, buf) < 0) {
380 		dev_warn(dev, "can't update alarm\n");
381 		status = -EIO;
382 	} else
383 		rs5c->regs[RS5C_REG_CTRL1] = buf;
384 
385 	return status;
386 }
387 
388 
389 /* NOTE:  Since RTC_WKALM_{RD,SET} were originally defined for EFI,
390  * which only exposes a polled programming interface; and since
391  * these calls map directly to those EFI requests; we don't demand
392  * we have an IRQ for this chip when we go through this API.
393  *
394  * The older x86_pc derived RTC_ALM_{READ,SET} calls require irqs
395  * though, managed through RTC_AIE_{ON,OFF} requests.
396  */
397 
398 static int rs5c_read_alarm(struct device *dev, struct rtc_wkalrm *t)
399 {
400 	struct i2c_client	*client = to_i2c_client(dev);
401 	struct rs5c372		*rs5c = i2c_get_clientdata(client);
402 	int			status;
403 
404 	status = rs5c_get_regs(rs5c);
405 	if (status < 0)
406 		return status;
407 
408 	/* report alarm time */
409 	t->time.tm_sec = 0;
410 	t->time.tm_min = bcd2bin(rs5c->regs[RS5C_REG_ALARM_A_MIN] & 0x7f);
411 	t->time.tm_hour = rs5c_reg2hr(rs5c, rs5c->regs[RS5C_REG_ALARM_A_HOURS]);
412 
413 	/* ... and status */
414 	t->enabled = !!(rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE);
415 	t->pending = !!(rs5c->regs[RS5C_REG_CTRL2] & RS5C_CTRL2_AAFG);
416 
417 	return 0;
418 }
419 
420 static int rs5c_set_alarm(struct device *dev, struct rtc_wkalrm *t)
421 {
422 	struct i2c_client	*client = to_i2c_client(dev);
423 	struct rs5c372		*rs5c = i2c_get_clientdata(client);
424 	int			status, addr, i;
425 	unsigned char		buf[3];
426 
427 	/* only handle up to 24 hours in the future, like RTC_ALM_SET */
428 	if (t->time.tm_mday != -1
429 			|| t->time.tm_mon != -1
430 			|| t->time.tm_year != -1)
431 		return -EINVAL;
432 
433 	/* REVISIT: round up tm_sec */
434 
435 	/* if needed, disable irq (clears pending status) */
436 	status = rs5c_get_regs(rs5c);
437 	if (status < 0)
438 		return status;
439 	if (rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE) {
440 		addr = RS5C_ADDR(RS5C_REG_CTRL1);
441 		buf[0] = rs5c->regs[RS5C_REG_CTRL1] & ~RS5C_CTRL1_AALE;
442 		if (i2c_smbus_write_byte_data(client, addr, buf[0]) < 0) {
443 			dev_dbg(dev, "can't disable alarm\n");
444 			return -EIO;
445 		}
446 		rs5c->regs[RS5C_REG_CTRL1] = buf[0];
447 	}
448 
449 	/* set alarm */
450 	buf[0] = bin2bcd(t->time.tm_min);
451 	buf[1] = rs5c_hr2reg(rs5c, t->time.tm_hour);
452 	buf[2] = 0x7f;	/* any/all days */
453 
454 	for (i = 0; i < sizeof(buf); i++) {
455 		addr = RS5C_ADDR(RS5C_REG_ALARM_A_MIN + i);
456 		if (i2c_smbus_write_byte_data(client, addr, buf[i]) < 0) {
457 			dev_dbg(dev, "can't set alarm time\n");
458 			return -EIO;
459 		}
460 	}
461 
462 	/* ... and maybe enable its irq */
463 	if (t->enabled) {
464 		addr = RS5C_ADDR(RS5C_REG_CTRL1);
465 		buf[0] = rs5c->regs[RS5C_REG_CTRL1] | RS5C_CTRL1_AALE;
466 		if (i2c_smbus_write_byte_data(client, addr, buf[0]) < 0)
467 			dev_warn(dev, "can't enable alarm\n");
468 		rs5c->regs[RS5C_REG_CTRL1] = buf[0];
469 	}
470 
471 	return 0;
472 }
473 
474 #if IS_ENABLED(CONFIG_RTC_INTF_PROC)
475 
476 static int rs5c372_rtc_proc(struct device *dev, struct seq_file *seq)
477 {
478 	int err, osc, trim;
479 
480 	err = rs5c372_get_trim(to_i2c_client(dev), &osc, &trim);
481 	if (err == 0) {
482 		seq_printf(seq, "crystal\t\t: %d.%03d KHz\n",
483 				osc / 1000, osc % 1000);
484 		seq_printf(seq, "trim\t\t: %d\n", trim);
485 	}
486 
487 	return 0;
488 }
489 
490 #else
491 #define	rs5c372_rtc_proc	NULL
492 #endif
493 
494 #ifdef CONFIG_RTC_INTF_DEV
495 static int rs5c372_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
496 {
497 	struct rs5c372	*rs5c = i2c_get_clientdata(to_i2c_client(dev));
498 	unsigned char	ctrl2;
499 	int		addr;
500 	unsigned int	flags;
501 
502 	dev_dbg(dev, "%s: cmd=%x\n", __func__, cmd);
503 
504 	addr = RS5C_ADDR(RS5C_REG_CTRL2);
505 	ctrl2 = i2c_smbus_read_byte_data(rs5c->client, addr);
506 
507 	switch (cmd) {
508 	case RTC_VL_READ:
509 		flags = 0;
510 
511 		switch (rs5c->type) {
512 		case rtc_r2025sd:
513 		case rtc_r2221tl:
514 			if ((rs5c->type == rtc_r2025sd && !(ctrl2 & R2x2x_CTRL2_XSTP)) ||
515 				(rs5c->type == rtc_r2221tl &&  (ctrl2 & R2x2x_CTRL2_XSTP))) {
516 				flags |= RTC_VL_DATA_INVALID;
517 			}
518 			if (ctrl2 & R2x2x_CTRL2_VDET)
519 				flags |= RTC_VL_BACKUP_LOW;
520 			break;
521 		default:
522 			if (ctrl2 & RS5C_CTRL2_XSTP)
523 				flags |= RTC_VL_DATA_INVALID;
524 			break;
525 		}
526 
527 		return put_user(flags, (unsigned int __user *)arg);
528 	case RTC_VL_CLR:
529 		/* clear VDET bit */
530 		if (rs5c->type == rtc_r2025sd || rs5c->type == rtc_r2221tl) {
531 			ctrl2 &= ~R2x2x_CTRL2_VDET;
532 			if (i2c_smbus_write_byte_data(rs5c->client, addr, ctrl2) < 0) {
533 				dev_dbg(&rs5c->client->dev, "%s: write error in line %i\n",
534 						__func__, __LINE__);
535 				return -EIO;
536 			}
537 		}
538 		return 0;
539 	default:
540 		return -ENOIOCTLCMD;
541 	}
542 	return 0;
543 }
544 #else
545 #define rs5c372_ioctl	NULL
546 #endif
547 
548 static int rs5c372_read_offset(struct device *dev, long *offset)
549 {
550 	struct rs5c372 *rs5c = i2c_get_clientdata(to_i2c_client(dev));
551 	u8 val = rs5c->regs[RS5C372_REG_TRIM];
552 	long ppb_per_step = 0;
553 	bool decr = val & RS5C372_TRIM_DECR;
554 
555 	switch (rs5c->type) {
556 	case rtc_r2221tl:
557 		ppb_per_step = val & R2221TL_TRIM_DEV ? 1017 : 3051;
558 		break;
559 	case rtc_rs5c372a:
560 	case rtc_rs5c372b:
561 		ppb_per_step = val & RS5C372_TRIM_XSL ? 3125 : 3051;
562 		break;
563 	default:
564 		ppb_per_step = 3051;
565 		break;
566 	}
567 
568 	/* Only bits[0:5] repsents the time counts */
569 	val &= 0x3F;
570 
571 	/* If bits[1:5] are all 0, it means no increment or decrement */
572 	if (!(val & 0x3E)) {
573 		*offset = 0;
574 	} else {
575 		if (decr)
576 			*offset = -(((~val) & 0x3F) + 1) * ppb_per_step;
577 		else
578 			*offset = (val - 1) * ppb_per_step;
579 	}
580 
581 	return 0;
582 }
583 
584 static int rs5c372_set_offset(struct device *dev, long offset)
585 {
586 	struct rs5c372 *rs5c = i2c_get_clientdata(to_i2c_client(dev));
587 	int addr = RS5C_ADDR(RS5C372_REG_TRIM);
588 	u8 val = 0;
589 	u8 tmp = 0;
590 	long ppb_per_step = 3051;
591 	long steps = LONG_MIN;
592 
593 	switch (rs5c->type) {
594 	case rtc_rs5c372a:
595 	case rtc_rs5c372b:
596 		tmp = rs5c->regs[RS5C372_REG_TRIM];
597 		if (tmp & RS5C372_TRIM_XSL) {
598 			ppb_per_step = 3125;
599 			val |= RS5C372_TRIM_XSL;
600 		}
601 		break;
602 	case rtc_r2221tl:
603 		/*
604 		 * Check if it is possible to use high resolution mode (DEV=1).
605 		 * In this mode, the minimum resolution is 2 / (32768 * 20 * 3),
606 		 * which is about 1017 ppb.
607 		 */
608 		steps = DIV_ROUND_CLOSEST(offset, 1017);
609 		if (steps >= -0x3E && steps <= 0x3E) {
610 			ppb_per_step = 1017;
611 			val |= R2221TL_TRIM_DEV;
612 		} else {
613 			/*
614 			 * offset is out of the range of high resolution mode.
615 			 * Try to use low resolution mode (DEV=0). In this mode,
616 			 * the minimum resolution is 2 / (32768 * 20), which is
617 			 * about 3051 ppb.
618 			 */
619 			steps = LONG_MIN;
620 		}
621 		break;
622 	default:
623 		break;
624 	}
625 
626 	if (steps == LONG_MIN) {
627 		steps = DIV_ROUND_CLOSEST(offset, ppb_per_step);
628 		if (steps > 0x3E || steps < -0x3E)
629 			return -ERANGE;
630 	}
631 
632 	if (steps > 0) {
633 		val |= steps + 1;
634 	} else {
635 		val |= RS5C372_TRIM_DECR;
636 		val |= (~(-steps - 1)) & 0x3F;
637 	}
638 
639 	if (!steps || !(val & 0x3E)) {
640 		/*
641 		 * if offset is too small, set oscillation adjustment register
642 		 * or time trimming register with its default value whic means
643 		 * no increment or decrement. But for rs5c372[a|b], the XSL bit
644 		 * should be kept unchanged.
645 		 */
646 		if (rs5c->type == rtc_rs5c372a || rs5c->type == rtc_rs5c372b)
647 			val &= RS5C372_TRIM_XSL;
648 		else
649 			val = 0;
650 	}
651 
652 	dev_dbg(&rs5c->client->dev, "write 0x%x for offset %ld\n", val, offset);
653 
654 	if (i2c_smbus_write_byte_data(rs5c->client, addr, val) < 0) {
655 		dev_err(&rs5c->client->dev, "failed to write 0x%x to reg %d\n", val, addr);
656 		return -EIO;
657 	}
658 
659 	rs5c->regs[RS5C372_REG_TRIM] = val;
660 
661 	return 0;
662 }
663 
664 static const struct rtc_class_ops rs5c372_rtc_ops = {
665 	.proc		= rs5c372_rtc_proc,
666 	.read_time	= rs5c372_rtc_read_time,
667 	.set_time	= rs5c372_rtc_set_time,
668 	.read_alarm	= rs5c_read_alarm,
669 	.set_alarm	= rs5c_set_alarm,
670 	.alarm_irq_enable = rs5c_rtc_alarm_irq_enable,
671 	.ioctl		= rs5c372_ioctl,
672 	.read_offset    = rs5c372_read_offset,
673 	.set_offset     = rs5c372_set_offset,
674 };
675 
676 #if IS_ENABLED(CONFIG_RTC_INTF_SYSFS)
677 
678 static ssize_t rs5c372_sysfs_show_trim(struct device *dev,
679 				struct device_attribute *attr, char *buf)
680 {
681 	int err, trim;
682 
683 	err = rs5c372_get_trim(to_i2c_client(dev), NULL, &trim);
684 	if (err)
685 		return err;
686 
687 	return sprintf(buf, "%d\n", trim);
688 }
689 static DEVICE_ATTR(trim, S_IRUGO, rs5c372_sysfs_show_trim, NULL);
690 
691 static ssize_t rs5c372_sysfs_show_osc(struct device *dev,
692 				struct device_attribute *attr, char *buf)
693 {
694 	int err, osc;
695 
696 	err = rs5c372_get_trim(to_i2c_client(dev), &osc, NULL);
697 	if (err)
698 		return err;
699 
700 	return sprintf(buf, "%d.%03d KHz\n", osc / 1000, osc % 1000);
701 }
702 static DEVICE_ATTR(osc, S_IRUGO, rs5c372_sysfs_show_osc, NULL);
703 
704 static int rs5c_sysfs_register(struct device *dev)
705 {
706 	int err;
707 
708 	err = device_create_file(dev, &dev_attr_trim);
709 	if (err)
710 		return err;
711 	err = device_create_file(dev, &dev_attr_osc);
712 	if (err)
713 		device_remove_file(dev, &dev_attr_trim);
714 
715 	return err;
716 }
717 
718 static void rs5c_sysfs_unregister(struct device *dev)
719 {
720 	device_remove_file(dev, &dev_attr_trim);
721 	device_remove_file(dev, &dev_attr_osc);
722 }
723 
724 #else
725 static int rs5c_sysfs_register(struct device *dev)
726 {
727 	return 0;
728 }
729 
730 static void rs5c_sysfs_unregister(struct device *dev)
731 {
732 	/* nothing */
733 }
734 #endif	/* SYSFS */
735 
736 static struct i2c_driver rs5c372_driver;
737 
738 static int rs5c_oscillator_setup(struct rs5c372 *rs5c372)
739 {
740 	unsigned char buf[2];
741 	int addr, i, ret = 0;
742 
743 	addr   = RS5C_ADDR(RS5C_REG_CTRL1);
744 	buf[0] = rs5c372->regs[RS5C_REG_CTRL1];
745 	buf[1] = rs5c372->regs[RS5C_REG_CTRL2];
746 
747 	switch (rs5c372->type) {
748 	case rtc_r2025sd:
749 		if (buf[1] & R2x2x_CTRL2_XSTP)
750 			return ret;
751 		break;
752 	case rtc_r2221tl:
753 		if (!(buf[1] & R2x2x_CTRL2_XSTP))
754 			return ret;
755 		break;
756 	default:
757 		if (!(buf[1] & RS5C_CTRL2_XSTP))
758 			return ret;
759 		break;
760 	}
761 
762 	/* use 24hr mode */
763 	switch (rs5c372->type) {
764 	case rtc_rs5c372a:
765 	case rtc_rs5c372b:
766 		buf[1] |= RS5C372_CTRL2_24;
767 		rs5c372->time24 = 1;
768 		break;
769 	case rtc_r2025sd:
770 	case rtc_r2221tl:
771 	case rtc_rv5c386:
772 	case rtc_rv5c387a:
773 		buf[0] |= RV5C387_CTRL1_24;
774 		rs5c372->time24 = 1;
775 		break;
776 	default:
777 		/* impossible */
778 		break;
779 	}
780 
781 	for (i = 0; i < sizeof(buf); i++) {
782 		addr = RS5C_ADDR(RS5C_REG_CTRL1 + i);
783 		ret = i2c_smbus_write_byte_data(rs5c372->client, addr, buf[i]);
784 		if (unlikely(ret < 0))
785 			return ret;
786 	}
787 
788 	rs5c372->regs[RS5C_REG_CTRL1] = buf[0];
789 	rs5c372->regs[RS5C_REG_CTRL2] = buf[1];
790 
791 	return 0;
792 }
793 
794 static int rs5c372_probe(struct i2c_client *client,
795 			 const struct i2c_device_id *id)
796 {
797 	int err = 0;
798 	int smbus_mode = 0;
799 	struct rs5c372 *rs5c372;
800 
801 	dev_dbg(&client->dev, "%s\n", __func__);
802 
803 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C |
804 			I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_I2C_BLOCK)) {
805 		/*
806 		 * If we don't have any master mode adapter, try breaking
807 		 * it down in to the barest of capabilities.
808 		 */
809 		if (i2c_check_functionality(client->adapter,
810 				I2C_FUNC_SMBUS_BYTE_DATA |
811 				I2C_FUNC_SMBUS_I2C_BLOCK))
812 			smbus_mode = 1;
813 		else {
814 			/* Still no good, give up */
815 			err = -ENODEV;
816 			goto exit;
817 		}
818 	}
819 
820 	rs5c372 = devm_kzalloc(&client->dev, sizeof(struct rs5c372),
821 				GFP_KERNEL);
822 	if (!rs5c372) {
823 		err = -ENOMEM;
824 		goto exit;
825 	}
826 
827 	rs5c372->client = client;
828 	i2c_set_clientdata(client, rs5c372);
829 	if (client->dev.of_node)
830 		rs5c372->type = (enum rtc_type)
831 			of_device_get_match_data(&client->dev);
832 	else
833 		rs5c372->type = id->driver_data;
834 
835 	/* we read registers 0x0f then 0x00-0x0f; skip the first one */
836 	rs5c372->regs = &rs5c372->buf[1];
837 	rs5c372->smbus = smbus_mode;
838 
839 	err = rs5c_get_regs(rs5c372);
840 	if (err < 0)
841 		goto exit;
842 
843 	/* clock may be set for am/pm or 24 hr time */
844 	switch (rs5c372->type) {
845 	case rtc_rs5c372a:
846 	case rtc_rs5c372b:
847 		/* alarm uses ALARM_A; and nINTRA on 372a, nINTR on 372b.
848 		 * so does periodic irq, except some 327a modes.
849 		 */
850 		if (rs5c372->regs[RS5C_REG_CTRL2] & RS5C372_CTRL2_24)
851 			rs5c372->time24 = 1;
852 		break;
853 	case rtc_r2025sd:
854 	case rtc_r2221tl:
855 	case rtc_rv5c386:
856 	case rtc_rv5c387a:
857 		if (rs5c372->regs[RS5C_REG_CTRL1] & RV5C387_CTRL1_24)
858 			rs5c372->time24 = 1;
859 		/* alarm uses ALARM_W; and nINTRB for alarm and periodic
860 		 * irq, on both 386 and 387
861 		 */
862 		break;
863 	default:
864 		dev_err(&client->dev, "unknown RTC type\n");
865 		goto exit;
866 	}
867 
868 	/* if the oscillator lost power and no other software (like
869 	 * the bootloader) set it up, do it here.
870 	 *
871 	 * The R2025S/D does this a little differently than the other
872 	 * parts, so we special case that..
873 	 */
874 	err = rs5c_oscillator_setup(rs5c372);
875 	if (unlikely(err < 0)) {
876 		dev_err(&client->dev, "setup error\n");
877 		goto exit;
878 	}
879 
880 	dev_info(&client->dev, "%s found, %s\n",
881 			({ char *s; switch (rs5c372->type) {
882 			case rtc_r2025sd:	s = "r2025sd"; break;
883 			case rtc_r2221tl:	s = "r2221tl"; break;
884 			case rtc_rs5c372a:	s = "rs5c372a"; break;
885 			case rtc_rs5c372b:	s = "rs5c372b"; break;
886 			case rtc_rv5c386:	s = "rv5c386"; break;
887 			case rtc_rv5c387a:	s = "rv5c387a"; break;
888 			default:		s = "chip"; break;
889 			}; s;}),
890 			rs5c372->time24 ? "24hr" : "am/pm"
891 			);
892 
893 	/* REVISIT use client->irq to register alarm irq ... */
894 	rs5c372->rtc = devm_rtc_device_register(&client->dev,
895 					rs5c372_driver.driver.name,
896 					&rs5c372_rtc_ops, THIS_MODULE);
897 
898 	if (IS_ERR(rs5c372->rtc)) {
899 		err = PTR_ERR(rs5c372->rtc);
900 		goto exit;
901 	}
902 
903 	err = rs5c_sysfs_register(&client->dev);
904 	if (err)
905 		goto exit;
906 
907 	return 0;
908 
909 exit:
910 	return err;
911 }
912 
913 static int rs5c372_remove(struct i2c_client *client)
914 {
915 	rs5c_sysfs_unregister(&client->dev);
916 	return 0;
917 }
918 
919 static struct i2c_driver rs5c372_driver = {
920 	.driver		= {
921 		.name	= "rtc-rs5c372",
922 		.of_match_table = of_match_ptr(rs5c372_of_match),
923 	},
924 	.probe		= rs5c372_probe,
925 	.remove		= rs5c372_remove,
926 	.id_table	= rs5c372_id,
927 };
928 
929 module_i2c_driver(rs5c372_driver);
930 
931 MODULE_AUTHOR(
932 		"Pavel Mironchik <pmironchik@optifacio.net>, "
933 		"Alessandro Zummo <a.zummo@towertech.it>, "
934 		"Paul Mundt <lethal@linux-sh.org>");
935 MODULE_DESCRIPTION("Ricoh RS5C372 RTC driver");
936 MODULE_LICENSE("GPL");
937