Linux 4.18.10
[linux/fpc-iii.git] / drivers / rtc / rtc-pcf2127.c
blobe83be1852c2fb276b25f1ff112e2be240e5aae0c
1 /*
2 * An I2C and SPI driver for the NXP PCF2127/29 RTC
3 * Copyright 2013 Til-Technologies
5 * Author: Renaud Cerrato <r.cerrato@til-technologies.fr>
7 * based on the other drivers in this same directory.
9 * Datasheet: http://cache.nxp.com/documents/data_sheet/PCF2127.pdf
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.
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>
25 #define PCF2127_REG_CTRL1 (0x00) /* Control Register 1 */
26 #define PCF2127_REG_CTRL2 (0x01) /* Control Register 2 */
28 #define PCF2127_REG_CTRL3 (0x02) /* Control Register 3 */
29 #define PCF2127_REG_CTRL3_BLF BIT(2)
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)
39 #define PCF2127_OSF BIT(7) /* Oscillator Fail flag */
41 struct pcf2127 {
42 struct rtc_device *rtc;
43 struct regmap *regmap;
47 * In the routines that deal directly with the pcf2127 hardware, we use
48 * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.
50 static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm)
52 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
53 unsigned char buf[10];
54 int ret;
55 int i;
57 for (i = 0; i <= PCF2127_REG_CTRL3; i++) {
58 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1 + i,
59 (unsigned int *)(buf + i));
60 if (ret) {
61 dev_err(dev, "%s: read error\n", __func__);
62 return ret;
66 ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_SC,
67 (buf + PCF2127_REG_SC),
68 ARRAY_SIZE(buf) - PCF2127_REG_SC);
69 if (ret) {
70 dev_err(dev, "%s: read error\n", __func__);
71 return ret;
74 if (buf[PCF2127_REG_CTRL3] & PCF2127_REG_CTRL3_BLF)
75 dev_info(dev,
76 "low voltage detected, check/replace RTC battery.\n");
78 if (buf[PCF2127_REG_SC] & PCF2127_OSF) {
80 * no need clear the flag here,
81 * it will be cleared once the new date is saved
83 dev_warn(dev,
84 "oscillator stop detected, date/time is not reliable\n");
85 return -EINVAL;
88 dev_dbg(dev,
89 "%s: raw data is cr1=%02x, cr2=%02x, cr3=%02x, "
90 "sec=%02x, min=%02x, hr=%02x, "
91 "mday=%02x, wday=%02x, mon=%02x, year=%02x\n",
92 __func__,
93 buf[0], buf[1], buf[2],
94 buf[3], buf[4], buf[5],
95 buf[6], buf[7], buf[8], buf[9]);
98 tm->tm_sec = bcd2bin(buf[PCF2127_REG_SC] & 0x7F);
99 tm->tm_min = bcd2bin(buf[PCF2127_REG_MN] & 0x7F);
100 tm->tm_hour = bcd2bin(buf[PCF2127_REG_HR] & 0x3F); /* rtc hr 0-23 */
101 tm->tm_mday = bcd2bin(buf[PCF2127_REG_DM] & 0x3F);
102 tm->tm_wday = buf[PCF2127_REG_DW] & 0x07;
103 tm->tm_mon = bcd2bin(buf[PCF2127_REG_MO] & 0x1F) - 1; /* rtc mn 1-12 */
104 tm->tm_year = bcd2bin(buf[PCF2127_REG_YR]);
105 if (tm->tm_year < 70)
106 tm->tm_year += 100; /* assume we are in 1970...2069 */
108 dev_dbg(dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
109 "mday=%d, mon=%d, year=%d, wday=%d\n",
110 __func__,
111 tm->tm_sec, tm->tm_min, tm->tm_hour,
112 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
114 return 0;
117 static int pcf2127_rtc_set_time(struct device *dev, struct rtc_time *tm)
119 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
120 unsigned char buf[7];
121 int i = 0, err;
123 dev_dbg(dev, "%s: secs=%d, mins=%d, hours=%d, "
124 "mday=%d, mon=%d, year=%d, wday=%d\n",
125 __func__,
126 tm->tm_sec, tm->tm_min, tm->tm_hour,
127 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
129 /* hours, minutes and seconds */
130 buf[i++] = bin2bcd(tm->tm_sec); /* this will also clear OSF flag */
131 buf[i++] = bin2bcd(tm->tm_min);
132 buf[i++] = bin2bcd(tm->tm_hour);
133 buf[i++] = bin2bcd(tm->tm_mday);
134 buf[i++] = tm->tm_wday & 0x07;
136 /* month, 1 - 12 */
137 buf[i++] = bin2bcd(tm->tm_mon + 1);
139 /* year */
140 buf[i++] = bin2bcd(tm->tm_year % 100);
142 /* write register's data */
143 err = regmap_bulk_write(pcf2127->regmap, PCF2127_REG_SC, buf, i);
144 if (err) {
145 dev_err(dev,
146 "%s: err=%d", __func__, err);
147 return err;
150 return 0;
153 #ifdef CONFIG_RTC_INTF_DEV
154 static int pcf2127_rtc_ioctl(struct device *dev,
155 unsigned int cmd, unsigned long arg)
157 struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
158 int touser;
159 int ret;
161 switch (cmd) {
162 case RTC_VL_READ:
163 ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &touser);
164 if (ret)
165 return ret;
167 touser = touser & PCF2127_REG_CTRL3_BLF ? 1 : 0;
169 if (copy_to_user((void __user *)arg, &touser, sizeof(int)))
170 return -EFAULT;
171 return 0;
172 default:
173 return -ENOIOCTLCMD;
176 #else
177 #define pcf2127_rtc_ioctl NULL
178 #endif
180 static const struct rtc_class_ops pcf2127_rtc_ops = {
181 .ioctl = pcf2127_rtc_ioctl,
182 .read_time = pcf2127_rtc_read_time,
183 .set_time = pcf2127_rtc_set_time,
186 static int pcf2127_probe(struct device *dev, struct regmap *regmap,
187 const char *name)
189 struct pcf2127 *pcf2127;
191 dev_dbg(dev, "%s\n", __func__);
193 pcf2127 = devm_kzalloc(dev, sizeof(*pcf2127), GFP_KERNEL);
194 if (!pcf2127)
195 return -ENOMEM;
197 pcf2127->regmap = regmap;
199 dev_set_drvdata(dev, pcf2127);
201 pcf2127->rtc = devm_rtc_device_register(dev, name, &pcf2127_rtc_ops,
202 THIS_MODULE);
204 return PTR_ERR_OR_ZERO(pcf2127->rtc);
207 #ifdef CONFIG_OF
208 static const struct of_device_id pcf2127_of_match[] = {
209 { .compatible = "nxp,pcf2127" },
210 { .compatible = "nxp,pcf2129" },
213 MODULE_DEVICE_TABLE(of, pcf2127_of_match);
214 #endif
216 #if IS_ENABLED(CONFIG_I2C)
218 static int pcf2127_i2c_write(void *context, const void *data, size_t count)
220 struct device *dev = context;
221 struct i2c_client *client = to_i2c_client(dev);
222 int ret;
224 ret = i2c_master_send(client, data, count);
225 if (ret != count)
226 return ret < 0 ? ret : -EIO;
228 return 0;
231 static int pcf2127_i2c_gather_write(void *context,
232 const void *reg, size_t reg_size,
233 const void *val, size_t val_size)
235 struct device *dev = context;
236 struct i2c_client *client = to_i2c_client(dev);
237 int ret;
238 void *buf;
240 if (WARN_ON(reg_size != 1))
241 return -EINVAL;
243 buf = kmalloc(val_size + 1, GFP_KERNEL);
244 if (!buf)
245 return -ENOMEM;
247 memcpy(buf, reg, 1);
248 memcpy(buf + 1, val, val_size);
250 ret = i2c_master_send(client, buf, val_size + 1);
251 if (ret != val_size + 1)
252 return ret < 0 ? ret : -EIO;
254 return 0;
257 static int pcf2127_i2c_read(void *context, const void *reg, size_t reg_size,
258 void *val, size_t val_size)
260 struct device *dev = context;
261 struct i2c_client *client = to_i2c_client(dev);
262 int ret;
264 if (WARN_ON(reg_size != 1))
265 return -EINVAL;
267 ret = i2c_master_send(client, reg, 1);
268 if (ret != 1)
269 return ret < 0 ? ret : -EIO;
271 ret = i2c_master_recv(client, val, val_size);
272 if (ret != val_size)
273 return ret < 0 ? ret : -EIO;
275 return 0;
279 * The reason we need this custom regmap_bus instead of using regmap_init_i2c()
280 * is that the STOP condition is required between set register address and
281 * read register data when reading from registers.
283 static const struct regmap_bus pcf2127_i2c_regmap = {
284 .write = pcf2127_i2c_write,
285 .gather_write = pcf2127_i2c_gather_write,
286 .read = pcf2127_i2c_read,
289 static struct i2c_driver pcf2127_i2c_driver;
291 static int pcf2127_i2c_probe(struct i2c_client *client,
292 const struct i2c_device_id *id)
294 struct regmap *regmap;
295 static const struct regmap_config config = {
296 .reg_bits = 8,
297 .val_bits = 8,
300 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
301 return -ENODEV;
303 regmap = devm_regmap_init(&client->dev, &pcf2127_i2c_regmap,
304 &client->dev, &config);
305 if (IS_ERR(regmap)) {
306 dev_err(&client->dev, "%s: regmap allocation failed: %ld\n",
307 __func__, PTR_ERR(regmap));
308 return PTR_ERR(regmap);
311 return pcf2127_probe(&client->dev, regmap,
312 pcf2127_i2c_driver.driver.name);
315 static const struct i2c_device_id pcf2127_i2c_id[] = {
316 { "pcf2127", 0 },
317 { "pcf2129", 0 },
320 MODULE_DEVICE_TABLE(i2c, pcf2127_i2c_id);
322 static struct i2c_driver pcf2127_i2c_driver = {
323 .driver = {
324 .name = "rtc-pcf2127-i2c",
325 .of_match_table = of_match_ptr(pcf2127_of_match),
327 .probe = pcf2127_i2c_probe,
328 .id_table = pcf2127_i2c_id,
331 static int pcf2127_i2c_register_driver(void)
333 return i2c_add_driver(&pcf2127_i2c_driver);
336 static void pcf2127_i2c_unregister_driver(void)
338 i2c_del_driver(&pcf2127_i2c_driver);
341 #else
343 static int pcf2127_i2c_register_driver(void)
345 return 0;
348 static void pcf2127_i2c_unregister_driver(void)
352 #endif
354 #if IS_ENABLED(CONFIG_SPI_MASTER)
356 static struct spi_driver pcf2127_spi_driver;
358 static int pcf2127_spi_probe(struct spi_device *spi)
360 static const struct regmap_config config = {
361 .reg_bits = 8,
362 .val_bits = 8,
363 .read_flag_mask = 0xa0,
364 .write_flag_mask = 0x20,
366 struct regmap *regmap;
368 regmap = devm_regmap_init_spi(spi, &config);
369 if (IS_ERR(regmap)) {
370 dev_err(&spi->dev, "%s: regmap allocation failed: %ld\n",
371 __func__, PTR_ERR(regmap));
372 return PTR_ERR(regmap);
375 return pcf2127_probe(&spi->dev, regmap, pcf2127_spi_driver.driver.name);
378 static const struct spi_device_id pcf2127_spi_id[] = {
379 { "pcf2127", 0 },
380 { "pcf2129", 0 },
383 MODULE_DEVICE_TABLE(spi, pcf2127_spi_id);
385 static struct spi_driver pcf2127_spi_driver = {
386 .driver = {
387 .name = "rtc-pcf2127-spi",
388 .of_match_table = of_match_ptr(pcf2127_of_match),
390 .probe = pcf2127_spi_probe,
391 .id_table = pcf2127_spi_id,
394 static int pcf2127_spi_register_driver(void)
396 return spi_register_driver(&pcf2127_spi_driver);
399 static void pcf2127_spi_unregister_driver(void)
401 spi_unregister_driver(&pcf2127_spi_driver);
404 #else
406 static int pcf2127_spi_register_driver(void)
408 return 0;
411 static void pcf2127_spi_unregister_driver(void)
415 #endif
417 static int __init pcf2127_init(void)
419 int ret;
421 ret = pcf2127_i2c_register_driver();
422 if (ret) {
423 pr_err("Failed to register pcf2127 i2c driver: %d\n", ret);
424 return ret;
427 ret = pcf2127_spi_register_driver();
428 if (ret) {
429 pr_err("Failed to register pcf2127 spi driver: %d\n", ret);
430 pcf2127_i2c_unregister_driver();
433 return ret;
435 module_init(pcf2127_init)
437 static void __exit pcf2127_exit(void)
439 pcf2127_spi_unregister_driver();
440 pcf2127_i2c_unregister_driver();
442 module_exit(pcf2127_exit)
444 MODULE_AUTHOR("Renaud Cerrato <r.cerrato@til-technologies.fr>");
445 MODULE_DESCRIPTION("NXP PCF2127/29 RTC driver");
446 MODULE_LICENSE("GPL v2");