1 /*
2  * An I2C and SPI driver for the NXP PCF2127/29 RTC
3  * Copyright 2013 Til-Technologies
4  *
5  * Author: Renaud Cerrato <r.cerrato@til-technologies.fr>
6  *
7  * based on the other drivers in this same directory.
8  *
9  * Datasheet: http://cache.nxp.com/documents/data_sheet/PCF2127.pdf
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  */
15 
16 #include <linux/i2c.h>
17 #include <linux/spi/spi.h>
18 #include <linux/bcd.h>
19 #include <linux/rtc.h>
20 #include <linux/slab.h>
21 #include <linux/module.h>
22 #include <linux/of.h>
23 #include <linux/regmap.h>
24 
25 #define PCF2127_REG_CTRL1       (0x00)  /* Control Register 1 */
26 #define PCF2127_REG_CTRL2       (0x01)  /* Control Register 2 */
27 
28 #define PCF2127_REG_CTRL3       (0x02)  /* Control Register 3 */
29 #define PCF2127_REG_CTRL3_BLF		BIT(2)
30 
31 #define PCF2127_REG_SC          (0x03)  /* datetime */
32 #define PCF2127_REG_MN          (0x04)
33 #define PCF2127_REG_HR          (0x05)
34 #define PCF2127_REG_DM          (0x06)
35 #define PCF2127_REG_DW          (0x07)
36 #define PCF2127_REG_MO          (0x08)
37 #define PCF2127_REG_YR          (0x09)
38 
39 /* the pcf2127 has 512 bytes nvmem, pcf2129 doesn't */
40 #define PCF2127_REG_RAM_addr_MSB       0x1a
41 #define PCF2127_REG_RAM_wrt_cmd        0x1c
42 #define PCF2127_REG_RAM_rd_cmd         0x1d
43 
44 #define PCF2127_OSF             BIT(7)  /* Oscillator Fail flag */
45 
46 struct pcf2127 {
47 	struct rtc_device *rtc;
48 	struct regmap *regmap;
49 };
50 
51 /*
52  * In the routines that deal directly with the pcf2127 hardware, we use
53  * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.
54  */
pcf2127_rtc_read_time(struct device * dev,struct rtc_time * tm)55 static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm)
56 {
57 	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
58 	unsigned char buf[10];
59 	int ret;
60 
61 	/*
62 	 * Avoid reading CTRL2 register as it causes WD_VAL register
63 	 * value to reset to 0 which means watchdog is stopped.
64 	 */
65 	ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_CTRL3,
66 			       (buf + PCF2127_REG_CTRL3),
67 			       ARRAY_SIZE(buf) - PCF2127_REG_CTRL3);
68 	if (ret) {
69 		dev_err(dev, "%s: read error\n", __func__);
70 		return ret;
71 	}
72 
73 	if (buf[PCF2127_REG_CTRL3] & PCF2127_REG_CTRL3_BLF)
74 		dev_info(dev,
75 			"low voltage detected, check/replace RTC battery.\n");
76 
77 	if (buf[PCF2127_REG_SC] & PCF2127_OSF) {
78 		/*
79 		 * no need clear the flag here,
80 		 * it will be cleared once the new date is saved
81 		 */
82 		dev_warn(dev,
83 			 "oscillator stop detected, date/time is not reliable\n");
84 		return -EINVAL;
85 	}
86 
87 	dev_dbg(dev,
88 		"%s: raw data is cr3=%02x, sec=%02x, min=%02x, hr=%02x, "
89 		"mday=%02x, wday=%02x, mon=%02x, year=%02x\n",
90 		__func__, buf[PCF2127_REG_CTRL3], buf[PCF2127_REG_SC],
91 		buf[PCF2127_REG_MN], buf[PCF2127_REG_HR],
92 		buf[PCF2127_REG_DM], buf[PCF2127_REG_DW],
93 		buf[PCF2127_REG_MO], buf[PCF2127_REG_YR]);
94 
95 	tm->tm_sec = bcd2bin(buf[PCF2127_REG_SC] & 0x7F);
96 	tm->tm_min = bcd2bin(buf[PCF2127_REG_MN] & 0x7F);
97 	tm->tm_hour = bcd2bin(buf[PCF2127_REG_HR] & 0x3F); /* rtc hr 0-23 */
98 	tm->tm_mday = bcd2bin(buf[PCF2127_REG_DM] & 0x3F);
99 	tm->tm_wday = buf[PCF2127_REG_DW] & 0x07;
100 	tm->tm_mon = bcd2bin(buf[PCF2127_REG_MO] & 0x1F) - 1; /* rtc mn 1-12 */
101 	tm->tm_year = bcd2bin(buf[PCF2127_REG_YR]);
102 	if (tm->tm_year < 70)
103 		tm->tm_year += 100;	/* assume we are in 1970...2069 */
104 
105 	dev_dbg(dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
106 		"mday=%d, mon=%d, year=%d, wday=%d\n",
107 		__func__,
108 		tm->tm_sec, tm->tm_min, tm->tm_hour,
109 		tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
110 
111 	return 0;
112 }
113 
pcf2127_rtc_set_time(struct device * dev,struct rtc_time * tm)114 static int pcf2127_rtc_set_time(struct device *dev, struct rtc_time *tm)
115 {
116 	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
117 	unsigned char buf[7];
118 	int i = 0, err;
119 
120 	dev_dbg(dev, "%s: secs=%d, mins=%d, hours=%d, "
121 		"mday=%d, mon=%d, year=%d, wday=%d\n",
122 		__func__,
123 		tm->tm_sec, tm->tm_min, tm->tm_hour,
124 		tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
125 
126 	/* hours, minutes and seconds */
127 	buf[i++] = bin2bcd(tm->tm_sec);	/* this will also clear OSF flag */
128 	buf[i++] = bin2bcd(tm->tm_min);
129 	buf[i++] = bin2bcd(tm->tm_hour);
130 	buf[i++] = bin2bcd(tm->tm_mday);
131 	buf[i++] = tm->tm_wday & 0x07;
132 
133 	/* month, 1 - 12 */
134 	buf[i++] = bin2bcd(tm->tm_mon + 1);
135 
136 	/* year */
137 	buf[i++] = bin2bcd(tm->tm_year % 100);
138 
139 	/* write register's data */
140 	err = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_SC, buf, i);
141 	if (err) {
142 		dev_err(dev,
143 			"%s: err=%d", __func__, err);
144 		return err;
145 	}
146 
147 	return 0;
148 }
149 
150 #ifdef CONFIG_RTC_INTF_DEV
pcf2127_rtc_ioctl(struct device * dev,unsigned int cmd,unsigned long arg)151 static int pcf2127_rtc_ioctl(struct device *dev,
152 				unsigned int cmd, unsigned long arg)
153 {
154 	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
155 	int touser;
156 	int ret;
157 
158 	switch (cmd) {
159 	case RTC_VL_READ:
160 		ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &touser);
161 		if (ret)
162 			return ret;
163 
164 		touser = touser & PCF2127_REG_CTRL3_BLF ? 1 : 0;
165 
166 		if (copy_to_user((void __user *)arg, &touser, sizeof(int)))
167 			return -EFAULT;
168 		return 0;
169 	default:
170 		return -ENOIOCTLCMD;
171 	}
172 }
173 #else
174 #define pcf2127_rtc_ioctl NULL
175 #endif
176 
177 static const struct rtc_class_ops pcf2127_rtc_ops = {
178 	.ioctl		= pcf2127_rtc_ioctl,
179 	.read_time	= pcf2127_rtc_read_time,
180 	.set_time	= pcf2127_rtc_set_time,
181 };
182 
pcf2127_nvmem_read(void * priv,unsigned int offset,void * val,size_t bytes)183 static int pcf2127_nvmem_read(void *priv, unsigned int offset,
184 			      void *val, size_t bytes)
185 {
186 	struct pcf2127 *pcf2127 = priv;
187 	int ret;
188 	unsigned char offsetbuf[] = { offset >> 8, offset };
189 
190 	ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_addr_MSB,
191 				offsetbuf, 2);
192 	if (ret)
193 		return ret;
194 
195 	ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_RAM_rd_cmd,
196 			       val, bytes);
197 
198 	return ret ?: bytes;
199 }
200 
pcf2127_nvmem_write(void * priv,unsigned int offset,void * val,size_t bytes)201 static int pcf2127_nvmem_write(void *priv, unsigned int offset,
202 			       void *val, size_t bytes)
203 {
204 	struct pcf2127 *pcf2127 = priv;
205 	int ret;
206 	unsigned char offsetbuf[] = { offset >> 8, offset };
207 
208 	ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_addr_MSB,
209 				offsetbuf, 2);
210 	if (ret)
211 		return ret;
212 
213 	ret = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_RAM_wrt_cmd,
214 				val, bytes);
215 
216 	return ret ?: bytes;
217 }
218 
pcf2127_probe(struct device * dev,struct regmap * regmap,const char * name,bool has_nvmem)219 static int pcf2127_probe(struct device *dev, struct regmap *regmap,
220 			const char *name, bool has_nvmem)
221 {
222 	struct pcf2127 *pcf2127;
223 	int ret = 0;
224 
225 	dev_dbg(dev, "%s\n", __func__);
226 
227 	pcf2127 = devm_kzalloc(dev, sizeof(*pcf2127), GFP_KERNEL);
228 	if (!pcf2127)
229 		return -ENOMEM;
230 
231 	pcf2127->regmap = regmap;
232 
233 	dev_set_drvdata(dev, pcf2127);
234 
235 	pcf2127->rtc = devm_rtc_device_register(dev, name, &pcf2127_rtc_ops,
236 						THIS_MODULE);
237 	if (IS_ERR(pcf2127->rtc))
238 		return PTR_ERR(pcf2127->rtc);
239 
240 	if (has_nvmem) {
241 		struct nvmem_config nvmem_cfg = {
242 			.priv = pcf2127,
243 			.reg_read = pcf2127_nvmem_read,
244 			.reg_write = pcf2127_nvmem_write,
245 			.size = 512,
246 		};
247 
248 		ret = rtc_nvmem_register(pcf2127->rtc, &nvmem_cfg);
249 	}
250 
251 	return ret;
252 }
253 
254 #ifdef CONFIG_OF
255 static const struct of_device_id pcf2127_of_match[] = {
256 	{ .compatible = "nxp,pcf2127" },
257 	{ .compatible = "nxp,pcf2129" },
258 	{}
259 };
260 MODULE_DEVICE_TABLE(of, pcf2127_of_match);
261 #endif
262 
263 #if IS_ENABLED(CONFIG_I2C)
264 
pcf2127_i2c_write(void * context,const void * data,size_t count)265 static int pcf2127_i2c_write(void *context, const void *data, size_t count)
266 {
267 	struct device *dev = context;
268 	struct i2c_client *client = to_i2c_client(dev);
269 	int ret;
270 
271 	ret = i2c_master_send(client, data, count);
272 	if (ret != count)
273 		return ret < 0 ? ret : -EIO;
274 
275 	return 0;
276 }
277 
pcf2127_i2c_gather_write(void * context,const void * reg,size_t reg_size,const void * val,size_t val_size)278 static int pcf2127_i2c_gather_write(void *context,
279 				const void *reg, size_t reg_size,
280 				const void *val, size_t val_size)
281 {
282 	struct device *dev = context;
283 	struct i2c_client *client = to_i2c_client(dev);
284 	int ret;
285 	void *buf;
286 
287 	if (WARN_ON(reg_size != 1))
288 		return -EINVAL;
289 
290 	buf = kmalloc(val_size + 1, GFP_KERNEL);
291 	if (!buf)
292 		return -ENOMEM;
293 
294 	memcpy(buf, reg, 1);
295 	memcpy(buf + 1, val, val_size);
296 
297 	ret = i2c_master_send(client, buf, val_size + 1);
298 
299 	kfree(buf);
300 
301 	if (ret != val_size + 1)
302 		return ret < 0 ? ret : -EIO;
303 
304 	return 0;
305 }
306 
pcf2127_i2c_read(void * context,const void * reg,size_t reg_size,void * val,size_t val_size)307 static int pcf2127_i2c_read(void *context, const void *reg, size_t reg_size,
308 				void *val, size_t val_size)
309 {
310 	struct device *dev = context;
311 	struct i2c_client *client = to_i2c_client(dev);
312 	int ret;
313 
314 	if (WARN_ON(reg_size != 1))
315 		return -EINVAL;
316 
317 	ret = i2c_master_send(client, reg, 1);
318 	if (ret != 1)
319 		return ret < 0 ? ret : -EIO;
320 
321 	ret = i2c_master_recv(client, val, val_size);
322 	if (ret != val_size)
323 		return ret < 0 ? ret : -EIO;
324 
325 	return 0;
326 }
327 
328 /*
329  * The reason we need this custom regmap_bus instead of using regmap_init_i2c()
330  * is that the STOP condition is required between set register address and
331  * read register data when reading from registers.
332  */
333 static const struct regmap_bus pcf2127_i2c_regmap = {
334 	.write = pcf2127_i2c_write,
335 	.gather_write = pcf2127_i2c_gather_write,
336 	.read = pcf2127_i2c_read,
337 };
338 
339 static struct i2c_driver pcf2127_i2c_driver;
340 
pcf2127_i2c_probe(struct i2c_client * client,const struct i2c_device_id * id)341 static int pcf2127_i2c_probe(struct i2c_client *client,
342 				const struct i2c_device_id *id)
343 {
344 	struct regmap *regmap;
345 	static const struct regmap_config config = {
346 		.reg_bits = 8,
347 		.val_bits = 8,
348 	};
349 
350 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
351 		return -ENODEV;
352 
353 	regmap = devm_regmap_init(&client->dev, &pcf2127_i2c_regmap,
354 					&client->dev, &config);
355 	if (IS_ERR(regmap)) {
356 		dev_err(&client->dev, "%s: regmap allocation failed: %ld\n",
357 			__func__, PTR_ERR(regmap));
358 		return PTR_ERR(regmap);
359 	}
360 
361 	return pcf2127_probe(&client->dev, regmap,
362 			     pcf2127_i2c_driver.driver.name, id->driver_data);
363 }
364 
365 static const struct i2c_device_id pcf2127_i2c_id[] = {
366 	{ "pcf2127", 1 },
367 	{ "pcf2129", 0 },
368 	{ }
369 };
370 MODULE_DEVICE_TABLE(i2c, pcf2127_i2c_id);
371 
372 static struct i2c_driver pcf2127_i2c_driver = {
373 	.driver		= {
374 		.name	= "rtc-pcf2127-i2c",
375 		.of_match_table = of_match_ptr(pcf2127_of_match),
376 	},
377 	.probe		= pcf2127_i2c_probe,
378 	.id_table	= pcf2127_i2c_id,
379 };
380 
pcf2127_i2c_register_driver(void)381 static int pcf2127_i2c_register_driver(void)
382 {
383 	return i2c_add_driver(&pcf2127_i2c_driver);
384 }
385 
pcf2127_i2c_unregister_driver(void)386 static void pcf2127_i2c_unregister_driver(void)
387 {
388 	i2c_del_driver(&pcf2127_i2c_driver);
389 }
390 
391 #else
392 
pcf2127_i2c_register_driver(void)393 static int pcf2127_i2c_register_driver(void)
394 {
395 	return 0;
396 }
397 
pcf2127_i2c_unregister_driver(void)398 static void pcf2127_i2c_unregister_driver(void)
399 {
400 }
401 
402 #endif
403 
404 #if IS_ENABLED(CONFIG_SPI_MASTER)
405 
406 static struct spi_driver pcf2127_spi_driver;
407 
pcf2127_spi_probe(struct spi_device * spi)408 static int pcf2127_spi_probe(struct spi_device *spi)
409 {
410 	static const struct regmap_config config = {
411 		.reg_bits = 8,
412 		.val_bits = 8,
413 		.read_flag_mask = 0xa0,
414 		.write_flag_mask = 0x20,
415 	};
416 	struct regmap *regmap;
417 
418 	regmap = devm_regmap_init_spi(spi, &config);
419 	if (IS_ERR(regmap)) {
420 		dev_err(&spi->dev, "%s: regmap allocation failed: %ld\n",
421 			__func__, PTR_ERR(regmap));
422 		return PTR_ERR(regmap);
423 	}
424 
425 	return pcf2127_probe(&spi->dev, regmap, pcf2127_spi_driver.driver.name,
426 			     spi_get_device_id(spi)->driver_data);
427 }
428 
429 static const struct spi_device_id pcf2127_spi_id[] = {
430 	{ "pcf2127", 1 },
431 	{ "pcf2129", 0 },
432 	{ }
433 };
434 MODULE_DEVICE_TABLE(spi, pcf2127_spi_id);
435 
436 static struct spi_driver pcf2127_spi_driver = {
437 	.driver		= {
438 		.name	= "rtc-pcf2127-spi",
439 		.of_match_table = of_match_ptr(pcf2127_of_match),
440 	},
441 	.probe		= pcf2127_spi_probe,
442 	.id_table	= pcf2127_spi_id,
443 };
444 
pcf2127_spi_register_driver(void)445 static int pcf2127_spi_register_driver(void)
446 {
447 	return spi_register_driver(&pcf2127_spi_driver);
448 }
449 
pcf2127_spi_unregister_driver(void)450 static void pcf2127_spi_unregister_driver(void)
451 {
452 	spi_unregister_driver(&pcf2127_spi_driver);
453 }
454 
455 #else
456 
pcf2127_spi_register_driver(void)457 static int pcf2127_spi_register_driver(void)
458 {
459 	return 0;
460 }
461 
pcf2127_spi_unregister_driver(void)462 static void pcf2127_spi_unregister_driver(void)
463 {
464 }
465 
466 #endif
467 
pcf2127_init(void)468 static int __init pcf2127_init(void)
469 {
470 	int ret;
471 
472 	ret = pcf2127_i2c_register_driver();
473 	if (ret) {
474 		pr_err("Failed to register pcf2127 i2c driver: %d\n", ret);
475 		return ret;
476 	}
477 
478 	ret = pcf2127_spi_register_driver();
479 	if (ret) {
480 		pr_err("Failed to register pcf2127 spi driver: %d\n", ret);
481 		pcf2127_i2c_unregister_driver();
482 	}
483 
484 	return ret;
485 }
module_init(pcf2127_init)486 module_init(pcf2127_init)
487 
488 static void __exit pcf2127_exit(void)
489 {
490 	pcf2127_spi_unregister_driver();
491 	pcf2127_i2c_unregister_driver();
492 }
493 module_exit(pcf2127_exit)
494 
495 MODULE_AUTHOR("Renaud Cerrato <r.cerrato@til-technologies.fr>");
496 MODULE_DESCRIPTION("NXP PCF2127/29 RTC driver");
497 MODULE_LICENSE("GPL v2");
498