blob: 916bbc2f57ded20addcf568940599e595679d841 [file] [log] [blame]
Heiko Schocher52365232011-05-26 16:25:05 -07001/*
Mylène Josserandc2a1c142016-05-03 11:54:34 +02002 * Micro Crystal RV-3029 / RV-3049 rtc class driver
Heiko Schocher52365232011-05-26 16:25:05 -07003 *
4 * Author: Gregory Hermant <gregory.hermant@calao-systems.com>
Michael Büsch2dca3d92016-03-04 22:40:30 +01005 * Michael Buesch <m@bues.ch>
Heiko Schocher52365232011-05-26 16:25:05 -07006 *
7 * based on previously existing rtc class drivers
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 *
Heiko Schocher52365232011-05-26 16:25:05 -070013 */
14
15#include <linux/module.h>
16#include <linux/i2c.h>
Mylène Josserandc2a1c142016-05-03 11:54:34 +020017#include <linux/spi/spi.h>
Heiko Schocher52365232011-05-26 16:25:05 -070018#include <linux/bcd.h>
19#include <linux/rtc.h>
Michael Büscha7f6e282016-03-04 22:40:55 +010020#include <linux/delay.h>
21#include <linux/of.h>
Michael Büscha696b312016-03-10 18:34:46 +010022#include <linux/hwmon.h>
23#include <linux/hwmon-sysfs.h>
Mylène Josserande6e38082016-05-03 11:54:33 +020024#include <linux/regmap.h>
Heiko Schocher52365232011-05-26 16:25:05 -070025
26/* Register map */
27/* control section */
Michael Büschaba39d22016-03-04 22:38:45 +010028#define RV3029_ONOFF_CTRL 0x00
Michael Büsch7697de32016-03-04 22:39:49 +010029#define RV3029_ONOFF_CTRL_WE BIT(0)
30#define RV3029_ONOFF_CTRL_TE BIT(1)
31#define RV3029_ONOFF_CTRL_TAR BIT(2)
32#define RV3029_ONOFF_CTRL_EERE BIT(3)
33#define RV3029_ONOFF_CTRL_SRON BIT(4)
34#define RV3029_ONOFF_CTRL_TD0 BIT(5)
35#define RV3029_ONOFF_CTRL_TD1 BIT(6)
36#define RV3029_ONOFF_CTRL_CLKINT BIT(7)
Michael Büschaba39d22016-03-04 22:38:45 +010037#define RV3029_IRQ_CTRL 0x01
Michael Büsch7697de32016-03-04 22:39:49 +010038#define RV3029_IRQ_CTRL_AIE BIT(0)
39#define RV3029_IRQ_CTRL_TIE BIT(1)
40#define RV3029_IRQ_CTRL_V1IE BIT(2)
41#define RV3029_IRQ_CTRL_V2IE BIT(3)
42#define RV3029_IRQ_CTRL_SRIE BIT(4)
Michael Büschaba39d22016-03-04 22:38:45 +010043#define RV3029_IRQ_FLAGS 0x02
Michael Büsch7697de32016-03-04 22:39:49 +010044#define RV3029_IRQ_FLAGS_AF BIT(0)
45#define RV3029_IRQ_FLAGS_TF BIT(1)
46#define RV3029_IRQ_FLAGS_V1IF BIT(2)
47#define RV3029_IRQ_FLAGS_V2IF BIT(3)
48#define RV3029_IRQ_FLAGS_SRF BIT(4)
Michael Büschaba39d22016-03-04 22:38:45 +010049#define RV3029_STATUS 0x03
Michael Büsch7697de32016-03-04 22:39:49 +010050#define RV3029_STATUS_VLOW1 BIT(2)
51#define RV3029_STATUS_VLOW2 BIT(3)
52#define RV3029_STATUS_SR BIT(4)
53#define RV3029_STATUS_PON BIT(5)
54#define RV3029_STATUS_EEBUSY BIT(7)
Michael Büschaba39d22016-03-04 22:38:45 +010055#define RV3029_RST_CTRL 0x04
Michael Büsch7697de32016-03-04 22:39:49 +010056#define RV3029_RST_CTRL_SYSR BIT(4)
Michael Büschaba39d22016-03-04 22:38:45 +010057#define RV3029_CONTROL_SECTION_LEN 0x05
Heiko Schocher52365232011-05-26 16:25:05 -070058
59/* watch section */
Michael Büschaba39d22016-03-04 22:38:45 +010060#define RV3029_W_SEC 0x08
61#define RV3029_W_MINUTES 0x09
62#define RV3029_W_HOURS 0x0A
Michael Büsch7697de32016-03-04 22:39:49 +010063#define RV3029_REG_HR_12_24 BIT(6) /* 24h/12h mode */
64#define RV3029_REG_HR_PM BIT(5) /* PM/AM bit in 12h mode */
Michael Büschaba39d22016-03-04 22:38:45 +010065#define RV3029_W_DATE 0x0B
66#define RV3029_W_DAYS 0x0C
67#define RV3029_W_MONTHS 0x0D
68#define RV3029_W_YEARS 0x0E
69#define RV3029_WATCH_SECTION_LEN 0x07
Heiko Schocher52365232011-05-26 16:25:05 -070070
71/* alarm section */
Michael Büschaba39d22016-03-04 22:38:45 +010072#define RV3029_A_SC 0x10
73#define RV3029_A_MN 0x11
74#define RV3029_A_HR 0x12
75#define RV3029_A_DT 0x13
76#define RV3029_A_DW 0x14
77#define RV3029_A_MO 0x15
78#define RV3029_A_YR 0x16
Mylène Josseranddc492e82016-05-03 11:54:36 +020079#define RV3029_A_AE_X BIT(7)
Michael Büschaba39d22016-03-04 22:38:45 +010080#define RV3029_ALARM_SECTION_LEN 0x07
Heiko Schocher52365232011-05-26 16:25:05 -070081
82/* timer section */
Michael Büschaba39d22016-03-04 22:38:45 +010083#define RV3029_TIMER_LOW 0x18
84#define RV3029_TIMER_HIGH 0x19
Heiko Schocher52365232011-05-26 16:25:05 -070085
86/* temperature section */
Michael Büschaba39d22016-03-04 22:38:45 +010087#define RV3029_TEMP_PAGE 0x20
Heiko Schocher52365232011-05-26 16:25:05 -070088
89/* eeprom data section */
Michael Büschaba39d22016-03-04 22:38:45 +010090#define RV3029_E2P_EEDATA1 0x28
91#define RV3029_E2P_EEDATA2 0x29
Michael Büsch7697de32016-03-04 22:39:49 +010092#define RV3029_E2PDATA_SECTION_LEN 0x02
Heiko Schocher52365232011-05-26 16:25:05 -070093
94/* eeprom control section */
Michael Büschaba39d22016-03-04 22:38:45 +010095#define RV3029_CONTROL_E2P_EECTRL 0x30
Michael Büsch7697de32016-03-04 22:39:49 +010096#define RV3029_EECTRL_THP BIT(0) /* temp scan interval */
97#define RV3029_EECTRL_THE BIT(1) /* thermometer enable */
98#define RV3029_EECTRL_FD0 BIT(2) /* CLKOUT */
99#define RV3029_EECTRL_FD1 BIT(3) /* CLKOUT */
100#define RV3029_TRICKLE_1K BIT(4) /* 1.5K resistance */
101#define RV3029_TRICKLE_5K BIT(5) /* 5K resistance */
102#define RV3029_TRICKLE_20K BIT(6) /* 20K resistance */
103#define RV3029_TRICKLE_80K BIT(7) /* 80K resistance */
104#define RV3029_TRICKLE_MASK (RV3029_TRICKLE_1K |\
105 RV3029_TRICKLE_5K |\
106 RV3029_TRICKLE_20K |\
107 RV3029_TRICKLE_80K)
108#define RV3029_TRICKLE_SHIFT 4
109#define RV3029_CONTROL_E2P_XOFFS 0x31 /* XTAL offset */
110#define RV3029_CONTROL_E2P_XOFFS_SIGN BIT(7) /* Sign: 1->pos, 0->neg */
111#define RV3029_CONTROL_E2P_QCOEF 0x32 /* XTAL temp drift coef */
112#define RV3029_CONTROL_E2P_TURNOVER 0x33 /* XTAL turnover temp (in *C) */
113#define RV3029_CONTROL_E2P_TOV_MASK 0x3F /* XTAL turnover temp mask */
Heiko Schocher52365232011-05-26 16:25:05 -0700114
115/* user ram section */
Michael Büschaba39d22016-03-04 22:38:45 +0100116#define RV3029_USR1_RAM_PAGE 0x38
117#define RV3029_USR1_SECTION_LEN 0x04
118#define RV3029_USR2_RAM_PAGE 0x3C
119#define RV3029_USR2_SECTION_LEN 0x04
Heiko Schocher52365232011-05-26 16:25:05 -0700120
Mylène Josserande6e38082016-05-03 11:54:33 +0200121struct rv3029_data {
122 struct device *dev;
123 struct rtc_device *rtc;
124 struct regmap *regmap;
125 int irq;
126};
127
128static int rv3029_read_regs(struct device *dev, u8 reg, u8 *buf,
Mylène Josserandabe2f552016-05-03 11:54:35 +0200129 unsigned int len)
Heiko Schocher52365232011-05-26 16:25:05 -0700130{
Mylène Josserande6e38082016-05-03 11:54:33 +0200131 struct rv3029_data *rv3029 = dev_get_drvdata(dev);
Heiko Schocher52365232011-05-26 16:25:05 -0700132
Michael Büschaba39d22016-03-04 22:38:45 +0100133 if ((reg > RV3029_USR1_RAM_PAGE + 7) ||
Mylène Josserandabe2f552016-05-03 11:54:35 +0200134 (reg + len > RV3029_USR1_RAM_PAGE + 8))
Heiko Schocher52365232011-05-26 16:25:05 -0700135 return -EINVAL;
136
Mylène Josserande6e38082016-05-03 11:54:33 +0200137 return regmap_bulk_read(rv3029->regmap, reg, buf, len);
Heiko Schocher52365232011-05-26 16:25:05 -0700138}
139
Mylène Josserande6e38082016-05-03 11:54:33 +0200140static int rv3029_write_regs(struct device *dev, u8 reg, u8 const buf[],
Mylène Josserandabe2f552016-05-03 11:54:35 +0200141 unsigned int len)
Heiko Schocher52365232011-05-26 16:25:05 -0700142{
Mylène Josserande6e38082016-05-03 11:54:33 +0200143 struct rv3029_data *rv3029 = dev_get_drvdata(dev);
144
Michael Büschaba39d22016-03-04 22:38:45 +0100145 if ((reg > RV3029_USR1_RAM_PAGE + 7) ||
Mylène Josserandabe2f552016-05-03 11:54:35 +0200146 (reg + len > RV3029_USR1_RAM_PAGE + 8))
Heiko Schocher52365232011-05-26 16:25:05 -0700147 return -EINVAL;
148
Mylène Josserande6e38082016-05-03 11:54:33 +0200149 return regmap_bulk_write(rv3029->regmap, reg, buf, len);
Heiko Schocher52365232011-05-26 16:25:05 -0700150}
151
Mylène Josserande6e38082016-05-03 11:54:33 +0200152static int rv3029_update_bits(struct device *dev, u8 reg, u8 mask, u8 set)
Michael Büsch2dca3d92016-03-04 22:40:30 +0100153{
154 u8 buf;
155 int ret;
156
Mylène Josserande6e38082016-05-03 11:54:33 +0200157 ret = rv3029_read_regs(dev, reg, &buf, 1);
Michael Büsch2dca3d92016-03-04 22:40:30 +0100158 if (ret < 0)
159 return ret;
160 buf &= ~mask;
161 buf |= set & mask;
Mylène Josserande6e38082016-05-03 11:54:33 +0200162 ret = rv3029_write_regs(dev, reg, &buf, 1);
Michael Büsch2dca3d92016-03-04 22:40:30 +0100163 if (ret < 0)
164 return ret;
165
166 return 0;
167}
168
Mylène Josserande6e38082016-05-03 11:54:33 +0200169static int rv3029_get_sr(struct device *dev, u8 *buf)
Heiko Schocher52365232011-05-26 16:25:05 -0700170{
Mylène Josserande6e38082016-05-03 11:54:33 +0200171 int ret = rv3029_read_regs(dev, RV3029_STATUS, buf, 1);
Heiko Schocher52365232011-05-26 16:25:05 -0700172
173 if (ret < 0)
174 return -EIO;
Mylène Josserande6e38082016-05-03 11:54:33 +0200175 dev_dbg(dev, "status = 0x%.2x (%d)\n", buf[0], buf[0]);
Heiko Schocher52365232011-05-26 16:25:05 -0700176 return 0;
177}
178
Mylène Josserande6e38082016-05-03 11:54:33 +0200179static int rv3029_set_sr(struct device *dev, u8 val)
Heiko Schocher52365232011-05-26 16:25:05 -0700180{
181 u8 buf[1];
182 int sr;
183
184 buf[0] = val;
Mylène Josserande6e38082016-05-03 11:54:33 +0200185 sr = rv3029_write_regs(dev, RV3029_STATUS, buf, 1);
186 dev_dbg(dev, "status = 0x%.2x (%d)\n", buf[0], buf[0]);
Heiko Schocher52365232011-05-26 16:25:05 -0700187 if (sr < 0)
188 return -EIO;
189 return 0;
190}
191
Mylène Josserande6e38082016-05-03 11:54:33 +0200192static int rv3029_eeprom_busywait(struct device *dev)
Michael Büscha7f6e282016-03-04 22:40:55 +0100193{
194 int i, ret;
195 u8 sr;
196
197 for (i = 100; i > 0; i--) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200198 ret = rv3029_get_sr(dev, &sr);
Michael Büscha7f6e282016-03-04 22:40:55 +0100199 if (ret < 0)
200 break;
201 if (!(sr & RV3029_STATUS_EEBUSY))
202 break;
203 usleep_range(1000, 10000);
204 }
205 if (i <= 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200206 dev_err(dev, "EEPROM busy wait timeout.\n");
Michael Büscha7f6e282016-03-04 22:40:55 +0100207 return -ETIMEDOUT;
208 }
209
210 return ret;
211}
212
Mylène Josserande6e38082016-05-03 11:54:33 +0200213static int rv3029_eeprom_exit(struct device *dev)
Michael Büscha7f6e282016-03-04 22:40:55 +0100214{
215 /* Re-enable eeprom refresh */
Mylène Josserande6e38082016-05-03 11:54:33 +0200216 return rv3029_update_bits(dev, RV3029_ONOFF_CTRL,
Mylène Josserand4e7f1a62016-05-03 11:54:32 +0200217 RV3029_ONOFF_CTRL_EERE,
218 RV3029_ONOFF_CTRL_EERE);
Michael Büscha7f6e282016-03-04 22:40:55 +0100219}
220
Mylène Josserande6e38082016-05-03 11:54:33 +0200221static int rv3029_eeprom_enter(struct device *dev)
Michael Büscha7f6e282016-03-04 22:40:55 +0100222{
223 int ret;
224 u8 sr;
225
226 /* Check whether we are in the allowed voltage range. */
Mylène Josserande6e38082016-05-03 11:54:33 +0200227 ret = rv3029_get_sr(dev, &sr);
Michael Büscha7f6e282016-03-04 22:40:55 +0100228 if (ret < 0)
229 return ret;
230 if (sr & (RV3029_STATUS_VLOW1 | RV3029_STATUS_VLOW2)) {
231 /* We clear the bits and retry once just in case
232 * we had a brown out in early startup.
233 */
234 sr &= ~RV3029_STATUS_VLOW1;
235 sr &= ~RV3029_STATUS_VLOW2;
Mylène Josserande6e38082016-05-03 11:54:33 +0200236 ret = rv3029_set_sr(dev, sr);
Michael Büscha7f6e282016-03-04 22:40:55 +0100237 if (ret < 0)
238 return ret;
239 usleep_range(1000, 10000);
Mylène Josserande6e38082016-05-03 11:54:33 +0200240 ret = rv3029_get_sr(dev, &sr);
Michael Büscha7f6e282016-03-04 22:40:55 +0100241 if (ret < 0)
242 return ret;
243 if (sr & (RV3029_STATUS_VLOW1 | RV3029_STATUS_VLOW2)) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200244 dev_err(dev,
Michael Büscha7f6e282016-03-04 22:40:55 +0100245 "Supply voltage is too low to safely access the EEPROM.\n");
246 return -ENODEV;
247 }
248 }
249
250 /* Disable eeprom refresh. */
Mylène Josserande6e38082016-05-03 11:54:33 +0200251 ret = rv3029_update_bits(dev, RV3029_ONOFF_CTRL, RV3029_ONOFF_CTRL_EERE,
252 0);
Michael Büscha7f6e282016-03-04 22:40:55 +0100253 if (ret < 0)
254 return ret;
255
256 /* Wait for any previous eeprom accesses to finish. */
Mylène Josserande6e38082016-05-03 11:54:33 +0200257 ret = rv3029_eeprom_busywait(dev);
Michael Büscha7f6e282016-03-04 22:40:55 +0100258 if (ret < 0)
Mylène Josserande6e38082016-05-03 11:54:33 +0200259 rv3029_eeprom_exit(dev);
Michael Büscha7f6e282016-03-04 22:40:55 +0100260
261 return ret;
262}
263
Mylène Josserande6e38082016-05-03 11:54:33 +0200264static int rv3029_eeprom_read(struct device *dev, u8 reg,
Michael Büscha7f6e282016-03-04 22:40:55 +0100265 u8 buf[], size_t len)
266{
267 int ret, err;
268
Mylène Josserande6e38082016-05-03 11:54:33 +0200269 err = rv3029_eeprom_enter(dev);
Michael Büscha7f6e282016-03-04 22:40:55 +0100270 if (err < 0)
271 return err;
272
Mylène Josserande6e38082016-05-03 11:54:33 +0200273 ret = rv3029_read_regs(dev, reg, buf, len);
Michael Büscha7f6e282016-03-04 22:40:55 +0100274
Mylène Josserande6e38082016-05-03 11:54:33 +0200275 err = rv3029_eeprom_exit(dev);
Michael Büscha7f6e282016-03-04 22:40:55 +0100276 if (err < 0)
277 return err;
278
279 return ret;
280}
281
Mylène Josserande6e38082016-05-03 11:54:33 +0200282static int rv3029_eeprom_write(struct device *dev, u8 reg,
Michael Büscha7f6e282016-03-04 22:40:55 +0100283 u8 const buf[], size_t len)
284{
285 int ret, err;
286 size_t i;
287 u8 tmp;
288
Mylène Josserande6e38082016-05-03 11:54:33 +0200289 err = rv3029_eeprom_enter(dev);
Michael Büscha7f6e282016-03-04 22:40:55 +0100290 if (err < 0)
291 return err;
292
293 for (i = 0; i < len; i++, reg++) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200294 ret = rv3029_read_regs(dev, reg, &tmp, 1);
Michael Büscha7f6e282016-03-04 22:40:55 +0100295 if (ret < 0)
296 break;
297 if (tmp != buf[i]) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200298 ret = rv3029_write_regs(dev, reg, &buf[i], 1);
Michael Büscha7f6e282016-03-04 22:40:55 +0100299 if (ret < 0)
300 break;
301 }
Mylène Josserande6e38082016-05-03 11:54:33 +0200302 ret = rv3029_eeprom_busywait(dev);
Michael Büscha7f6e282016-03-04 22:40:55 +0100303 if (ret < 0)
304 break;
305 }
306
Mylène Josserande6e38082016-05-03 11:54:33 +0200307 err = rv3029_eeprom_exit(dev);
Michael Büscha7f6e282016-03-04 22:40:55 +0100308 if (err < 0)
309 return err;
310
311 return ret;
312}
313
Mylène Josserande6e38082016-05-03 11:54:33 +0200314static int rv3029_eeprom_update_bits(struct device *dev,
Michael Büsch39387dc2016-03-10 18:34:23 +0100315 u8 reg, u8 mask, u8 set)
316{
317 u8 buf;
318 int ret;
319
Mylène Josserande6e38082016-05-03 11:54:33 +0200320 ret = rv3029_eeprom_read(dev, reg, &buf, 1);
Michael Büsch39387dc2016-03-10 18:34:23 +0100321 if (ret < 0)
322 return ret;
323 buf &= ~mask;
324 buf |= set & mask;
Mylène Josserande6e38082016-05-03 11:54:33 +0200325 ret = rv3029_eeprom_write(dev, reg, &buf, 1);
Michael Büsch39387dc2016-03-10 18:34:23 +0100326 if (ret < 0)
327 return ret;
328
329 return 0;
330}
331
Mylène Josserande6e38082016-05-03 11:54:33 +0200332static int rv3029_read_time(struct device *dev, struct rtc_time *tm)
Heiko Schocher52365232011-05-26 16:25:05 -0700333{
334 u8 buf[1];
335 int ret;
Michael Büschaba39d22016-03-04 22:38:45 +0100336 u8 regs[RV3029_WATCH_SECTION_LEN] = { 0, };
Heiko Schocher52365232011-05-26 16:25:05 -0700337
Mylène Josserande6e38082016-05-03 11:54:33 +0200338 ret = rv3029_get_sr(dev, buf);
Heiko Schocher52365232011-05-26 16:25:05 -0700339 if (ret < 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200340 dev_err(dev, "%s: reading SR failed\n", __func__);
Heiko Schocher52365232011-05-26 16:25:05 -0700341 return -EIO;
342 }
343
Mylène Josserande6e38082016-05-03 11:54:33 +0200344 ret = rv3029_read_regs(dev, RV3029_W_SEC, regs,
Mylène Josserand4e7f1a62016-05-03 11:54:32 +0200345 RV3029_WATCH_SECTION_LEN);
Heiko Schocher52365232011-05-26 16:25:05 -0700346 if (ret < 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200347 dev_err(dev, "%s: reading RTC section failed\n", __func__);
Heiko Schocher52365232011-05-26 16:25:05 -0700348 return ret;
349 }
350
Mylène Josserandabe2f552016-05-03 11:54:35 +0200351 tm->tm_sec = bcd2bin(regs[RV3029_W_SEC - RV3029_W_SEC]);
352 tm->tm_min = bcd2bin(regs[RV3029_W_MINUTES - RV3029_W_SEC]);
Heiko Schocher52365232011-05-26 16:25:05 -0700353
354 /* HR field has a more complex interpretation */
355 {
Mylène Josserandabe2f552016-05-03 11:54:35 +0200356 const u8 _hr = regs[RV3029_W_HOURS - RV3029_W_SEC];
Michael Büschaba39d22016-03-04 22:38:45 +0100357
358 if (_hr & RV3029_REG_HR_12_24) {
Heiko Schocher52365232011-05-26 16:25:05 -0700359 /* 12h format */
360 tm->tm_hour = bcd2bin(_hr & 0x1f);
Michael Büschaba39d22016-03-04 22:38:45 +0100361 if (_hr & RV3029_REG_HR_PM) /* PM flag set */
Heiko Schocher52365232011-05-26 16:25:05 -0700362 tm->tm_hour += 12;
363 } else /* 24h format */
364 tm->tm_hour = bcd2bin(_hr & 0x3f);
365 }
366
Mylène Josserandabe2f552016-05-03 11:54:35 +0200367 tm->tm_mday = bcd2bin(regs[RV3029_W_DATE - RV3029_W_SEC]);
368 tm->tm_mon = bcd2bin(regs[RV3029_W_MONTHS - RV3029_W_SEC]) - 1;
369 tm->tm_year = bcd2bin(regs[RV3029_W_YEARS - RV3029_W_SEC]) + 100;
370 tm->tm_wday = bcd2bin(regs[RV3029_W_DAYS - RV3029_W_SEC]) - 1;
Heiko Schocher52365232011-05-26 16:25:05 -0700371
372 return 0;
373}
374
Mylène Josserande6e38082016-05-03 11:54:33 +0200375static int rv3029_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
Heiko Schocher52365232011-05-26 16:25:05 -0700376{
Heiko Schocher52365232011-05-26 16:25:05 -0700377 struct rtc_time *const tm = &alarm->time;
378 int ret;
379 u8 regs[8];
380
Mylène Josserande6e38082016-05-03 11:54:33 +0200381 ret = rv3029_get_sr(dev, regs);
Heiko Schocher52365232011-05-26 16:25:05 -0700382 if (ret < 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200383 dev_err(dev, "%s: reading SR failed\n", __func__);
Heiko Schocher52365232011-05-26 16:25:05 -0700384 return -EIO;
385 }
386
Mylène Josserande6e38082016-05-03 11:54:33 +0200387 ret = rv3029_read_regs(dev, RV3029_A_SC, regs,
Mylène Josserand4e7f1a62016-05-03 11:54:32 +0200388 RV3029_ALARM_SECTION_LEN);
Heiko Schocher52365232011-05-26 16:25:05 -0700389
390 if (ret < 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200391 dev_err(dev, "%s: reading alarm section failed\n", __func__);
Heiko Schocher52365232011-05-26 16:25:05 -0700392 return ret;
393 }
394
Mylène Josserandabe2f552016-05-03 11:54:35 +0200395 tm->tm_sec = bcd2bin(regs[RV3029_A_SC - RV3029_A_SC] & 0x7f);
396 tm->tm_min = bcd2bin(regs[RV3029_A_MN - RV3029_A_SC] & 0x7f);
397 tm->tm_hour = bcd2bin(regs[RV3029_A_HR - RV3029_A_SC] & 0x3f);
398 tm->tm_mday = bcd2bin(regs[RV3029_A_DT - RV3029_A_SC] & 0x3f);
399 tm->tm_mon = bcd2bin(regs[RV3029_A_MO - RV3029_A_SC] & 0x1f) - 1;
400 tm->tm_year = bcd2bin(regs[RV3029_A_YR - RV3029_A_SC] & 0x7f) + 100;
401 tm->tm_wday = bcd2bin(regs[RV3029_A_DW - RV3029_A_SC] & 0x07) - 1;
Heiko Schocher52365232011-05-26 16:25:05 -0700402
403 return 0;
404}
405
Mylène Josserande6e38082016-05-03 11:54:33 +0200406static int rv3029_rtc_alarm_set_irq(struct device *dev, int enable)
Heiko Schocher52365232011-05-26 16:25:05 -0700407{
408 int ret;
Heiko Schocher52365232011-05-26 16:25:05 -0700409
Michael Büsch2dca3d92016-03-04 22:40:30 +0100410 /* enable/disable AIE irq */
Mylène Josserande6e38082016-05-03 11:54:33 +0200411 ret = rv3029_update_bits(dev, RV3029_IRQ_CTRL, RV3029_IRQ_CTRL_AIE,
Mylène Josserand4e7f1a62016-05-03 11:54:32 +0200412 (enable ? RV3029_IRQ_CTRL_AIE : 0));
Heiko Schocher52365232011-05-26 16:25:05 -0700413 if (ret < 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200414 dev_err(dev, "can't update INT reg\n");
Heiko Schocher52365232011-05-26 16:25:05 -0700415 return ret;
416 }
417
418 return 0;
419}
420
Mylène Josserande6e38082016-05-03 11:54:33 +0200421static int rv3029_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
Heiko Schocher52365232011-05-26 16:25:05 -0700422{
423 struct rtc_time *const tm = &alarm->time;
424 int ret;
425 u8 regs[8];
426
427 /*
428 * The clock has an 8 bit wide bcd-coded register (they never learn)
429 * for the year. tm_year is an offset from 1900 and we are interested
430 * in the 2000-2099 range, so any value less than 100 is invalid.
431 */
432 if (tm->tm_year < 100)
433 return -EINVAL;
434
Mylène Josserande6e38082016-05-03 11:54:33 +0200435 ret = rv3029_get_sr(dev, regs);
Heiko Schocher52365232011-05-26 16:25:05 -0700436 if (ret < 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200437 dev_err(dev, "%s: reading SR failed\n", __func__);
Heiko Schocher52365232011-05-26 16:25:05 -0700438 return -EIO;
439 }
Heiko Schocher52365232011-05-26 16:25:05 -0700440
Mylène Josseranddc492e82016-05-03 11:54:36 +0200441 /* Activate all the alarms with AE_x bit */
442 regs[RV3029_A_SC - RV3029_A_SC] = bin2bcd(tm->tm_sec) | RV3029_A_AE_X;
443 regs[RV3029_A_MN - RV3029_A_SC] = bin2bcd(tm->tm_min) | RV3029_A_AE_X;
444 regs[RV3029_A_HR - RV3029_A_SC] = (bin2bcd(tm->tm_hour) & 0x3f)
445 | RV3029_A_AE_X;
446 regs[RV3029_A_DT - RV3029_A_SC] = (bin2bcd(tm->tm_mday) & 0x3f)
447 | RV3029_A_AE_X;
448 regs[RV3029_A_MO - RV3029_A_SC] = (bin2bcd(tm->tm_mon + 1) & 0x1f)
449 | RV3029_A_AE_X;
450 regs[RV3029_A_DW - RV3029_A_SC] = (bin2bcd(tm->tm_wday + 1) & 0x7)
451 | RV3029_A_AE_X;
452 regs[RV3029_A_YR - RV3029_A_SC] = (bin2bcd(tm->tm_year - 100))
453 | RV3029_A_AE_X;
454
455 /* Write the alarm */
Mylène Josserande6e38082016-05-03 11:54:33 +0200456 ret = rv3029_write_regs(dev, RV3029_A_SC, regs,
Mylène Josserand4e7f1a62016-05-03 11:54:32 +0200457 RV3029_ALARM_SECTION_LEN);
Heiko Schocher52365232011-05-26 16:25:05 -0700458 if (ret < 0)
459 return ret;
460
461 if (alarm->enabled) {
Heiko Schocher52365232011-05-26 16:25:05 -0700462 /* clear AF flag */
Mylène Josserande6e38082016-05-03 11:54:33 +0200463 ret = rv3029_update_bits(dev, RV3029_IRQ_FLAGS,
Mylène Josserand4e7f1a62016-05-03 11:54:32 +0200464 RV3029_IRQ_FLAGS_AF, 0);
Heiko Schocher52365232011-05-26 16:25:05 -0700465 if (ret < 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200466 dev_err(dev, "can't clear alarm flag\n");
Heiko Schocher52365232011-05-26 16:25:05 -0700467 return ret;
468 }
469 /* enable AIE irq */
Mylène Josserande6e38082016-05-03 11:54:33 +0200470 ret = rv3029_rtc_alarm_set_irq(dev, 1);
Heiko Schocher52365232011-05-26 16:25:05 -0700471 if (ret)
472 return ret;
473
Mylène Josserande6e38082016-05-03 11:54:33 +0200474 dev_dbg(dev, "alarm IRQ armed\n");
Heiko Schocher52365232011-05-26 16:25:05 -0700475 } else {
476 /* disable AIE irq */
Mylène Josserande6e38082016-05-03 11:54:33 +0200477 ret = rv3029_rtc_alarm_set_irq(dev, 0);
Heiko Schocher52365232011-05-26 16:25:05 -0700478 if (ret)
479 return ret;
480
Mylène Josserande6e38082016-05-03 11:54:33 +0200481 dev_dbg(dev, "alarm IRQ disabled\n");
Heiko Schocher52365232011-05-26 16:25:05 -0700482 }
483
484 return 0;
485}
486
Mylène Josserande6e38082016-05-03 11:54:33 +0200487static int rv3029_set_time(struct device *dev, struct rtc_time *tm)
Heiko Schocher52365232011-05-26 16:25:05 -0700488{
489 u8 regs[8];
490 int ret;
491
492 /*
493 * The clock has an 8 bit wide bcd-coded register (they never learn)
494 * for the year. tm_year is an offset from 1900 and we are interested
495 * in the 2000-2099 range, so any value less than 100 is invalid.
496 */
497 if (tm->tm_year < 100)
498 return -EINVAL;
499
Mylène Josserandabe2f552016-05-03 11:54:35 +0200500 regs[RV3029_W_SEC - RV3029_W_SEC] = bin2bcd(tm->tm_sec);
501 regs[RV3029_W_MINUTES - RV3029_W_SEC] = bin2bcd(tm->tm_min);
502 regs[RV3029_W_HOURS - RV3029_W_SEC] = bin2bcd(tm->tm_hour);
503 regs[RV3029_W_DATE - RV3029_W_SEC] = bin2bcd(tm->tm_mday);
504 regs[RV3029_W_MONTHS - RV3029_W_SEC] = bin2bcd(tm->tm_mon + 1);
Mylène Josserand38201ca2016-05-03 11:54:37 +0200505 regs[RV3029_W_DAYS - RV3029_W_SEC] = bin2bcd(tm->tm_wday + 1) & 0x7;
Mylène Josserandabe2f552016-05-03 11:54:35 +0200506 regs[RV3029_W_YEARS - RV3029_W_SEC] = bin2bcd(tm->tm_year - 100);
Heiko Schocher52365232011-05-26 16:25:05 -0700507
Mylène Josserande6e38082016-05-03 11:54:33 +0200508 ret = rv3029_write_regs(dev, RV3029_W_SEC, regs,
Mylène Josserand4e7f1a62016-05-03 11:54:32 +0200509 RV3029_WATCH_SECTION_LEN);
Heiko Schocher52365232011-05-26 16:25:05 -0700510 if (ret < 0)
511 return ret;
512
Mylène Josserande6e38082016-05-03 11:54:33 +0200513 ret = rv3029_get_sr(dev, regs);
Heiko Schocher52365232011-05-26 16:25:05 -0700514 if (ret < 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200515 dev_err(dev, "%s: reading SR failed\n", __func__);
Heiko Schocher52365232011-05-26 16:25:05 -0700516 return ret;
517 }
518 /* clear PON bit */
Mylène Josserande6e38082016-05-03 11:54:33 +0200519 ret = rv3029_set_sr(dev, (regs[0] & ~RV3029_STATUS_PON));
Heiko Schocher52365232011-05-26 16:25:05 -0700520 if (ret < 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200521 dev_err(dev, "%s: reading SR failed\n", __func__);
Heiko Schocher52365232011-05-26 16:25:05 -0700522 return ret;
523 }
524
525 return 0;
526}
Mylène Josserandabe2f552016-05-03 11:54:35 +0200527
Michael Büsche27e2162016-03-04 22:41:19 +0100528static const struct rv3029_trickle_tab_elem {
529 u32 r; /* resistance in ohms */
530 u8 conf; /* trickle config bits */
531} rv3029_trickle_tab[] = {
532 {
533 .r = 1076,
534 .conf = RV3029_TRICKLE_1K | RV3029_TRICKLE_5K |
535 RV3029_TRICKLE_20K | RV3029_TRICKLE_80K,
536 }, {
537 .r = 1091,
538 .conf = RV3029_TRICKLE_1K | RV3029_TRICKLE_5K |
539 RV3029_TRICKLE_20K,
540 }, {
541 .r = 1137,
542 .conf = RV3029_TRICKLE_1K | RV3029_TRICKLE_5K |
543 RV3029_TRICKLE_80K,
544 }, {
545 .r = 1154,
546 .conf = RV3029_TRICKLE_1K | RV3029_TRICKLE_5K,
547 }, {
548 .r = 1371,
549 .conf = RV3029_TRICKLE_1K | RV3029_TRICKLE_20K |
550 RV3029_TRICKLE_80K,
551 }, {
552 .r = 1395,
553 .conf = RV3029_TRICKLE_1K | RV3029_TRICKLE_20K,
554 }, {
555 .r = 1472,
556 .conf = RV3029_TRICKLE_1K | RV3029_TRICKLE_80K,
557 }, {
558 .r = 1500,
559 .conf = RV3029_TRICKLE_1K,
560 }, {
561 .r = 3810,
562 .conf = RV3029_TRICKLE_5K | RV3029_TRICKLE_20K |
563 RV3029_TRICKLE_80K,
564 }, {
565 .r = 4000,
566 .conf = RV3029_TRICKLE_5K | RV3029_TRICKLE_20K,
567 }, {
568 .r = 4706,
569 .conf = RV3029_TRICKLE_5K | RV3029_TRICKLE_80K,
570 }, {
571 .r = 5000,
572 .conf = RV3029_TRICKLE_5K,
573 }, {
574 .r = 16000,
575 .conf = RV3029_TRICKLE_20K | RV3029_TRICKLE_80K,
576 }, {
577 .r = 20000,
578 .conf = RV3029_TRICKLE_20K,
579 }, {
580 .r = 80000,
581 .conf = RV3029_TRICKLE_80K,
582 },
583};
584
Mylène Josserande6e38082016-05-03 11:54:33 +0200585static void rv3029_trickle_config(struct device *dev)
Michael Büsche27e2162016-03-04 22:41:19 +0100586{
Mylène Josserande6e38082016-05-03 11:54:33 +0200587 struct device_node *of_node = dev->of_node;
Michael Büsche27e2162016-03-04 22:41:19 +0100588 const struct rv3029_trickle_tab_elem *elem;
589 int i, err;
590 u32 ohms;
Michael Büsch39387dc2016-03-10 18:34:23 +0100591 u8 trickle_set_bits;
Michael Büsche27e2162016-03-04 22:41:19 +0100592
593 if (!of_node)
594 return;
595
596 /* Configure the trickle charger. */
Michael Büsche27e2162016-03-04 22:41:19 +0100597 err = of_property_read_u32(of_node, "trickle-resistor-ohms", &ohms);
598 if (err) {
599 /* Disable trickle charger. */
Michael Büsch39387dc2016-03-10 18:34:23 +0100600 trickle_set_bits = 0;
Michael Büsche27e2162016-03-04 22:41:19 +0100601 } else {
602 /* Enable trickle charger. */
603 for (i = 0; i < ARRAY_SIZE(rv3029_trickle_tab); i++) {
604 elem = &rv3029_trickle_tab[i];
605 if (elem->r >= ohms)
606 break;
607 }
Michael Büsch39387dc2016-03-10 18:34:23 +0100608 trickle_set_bits = elem->conf;
Mylène Josserande6e38082016-05-03 11:54:33 +0200609 dev_info(dev,
Michael Büsche27e2162016-03-04 22:41:19 +0100610 "Trickle charger enabled at %d ohms resistance.\n",
611 elem->r);
612 }
Mylène Josserande6e38082016-05-03 11:54:33 +0200613 err = rv3029_eeprom_update_bits(dev, RV3029_CONTROL_E2P_EECTRL,
Michael Büsch39387dc2016-03-10 18:34:23 +0100614 RV3029_TRICKLE_MASK,
615 trickle_set_bits);
Mylène Josserandabe2f552016-05-03 11:54:35 +0200616 if (err < 0)
Mylène Josserande6e38082016-05-03 11:54:33 +0200617 dev_err(dev, "Failed to update trickle charger config\n");
Michael Büsche27e2162016-03-04 22:41:19 +0100618}
619
Michael Büscha696b312016-03-10 18:34:46 +0100620#ifdef CONFIG_RTC_DRV_RV3029_HWMON
621
Mylène Josserande6e38082016-05-03 11:54:33 +0200622static int rv3029_read_temp(struct device *dev, int *temp_mC)
Michael Büscha696b312016-03-10 18:34:46 +0100623{
624 int ret;
625 u8 temp;
626
Mylène Josserande6e38082016-05-03 11:54:33 +0200627 ret = rv3029_read_regs(dev, RV3029_TEMP_PAGE, &temp, 1);
Michael Büscha696b312016-03-10 18:34:46 +0100628 if (ret < 0)
629 return ret;
630
631 *temp_mC = ((int)temp - 60) * 1000;
632
633 return 0;
634}
635
636static ssize_t rv3029_hwmon_show_temp(struct device *dev,
637 struct device_attribute *attr,
638 char *buf)
639{
Michael Büscha696b312016-03-10 18:34:46 +0100640 int ret, temp_mC;
641
Mylène Josserande6e38082016-05-03 11:54:33 +0200642 ret = rv3029_read_temp(dev, &temp_mC);
Michael Büscha696b312016-03-10 18:34:46 +0100643 if (ret < 0)
644 return ret;
645
646 return sprintf(buf, "%d\n", temp_mC);
647}
648
649static ssize_t rv3029_hwmon_set_update_interval(struct device *dev,
650 struct device_attribute *attr,
651 const char *buf,
652 size_t count)
653{
Michael Büscha696b312016-03-10 18:34:46 +0100654 unsigned long interval_ms;
655 int ret;
656 u8 th_set_bits = 0;
657
658 ret = kstrtoul(buf, 10, &interval_ms);
659 if (ret < 0)
660 return ret;
661
662 if (interval_ms != 0) {
663 th_set_bits |= RV3029_EECTRL_THE;
664 if (interval_ms >= 16000)
665 th_set_bits |= RV3029_EECTRL_THP;
666 }
Mylène Josserande6e38082016-05-03 11:54:33 +0200667 ret = rv3029_eeprom_update_bits(dev, RV3029_CONTROL_E2P_EECTRL,
Michael Büscha696b312016-03-10 18:34:46 +0100668 RV3029_EECTRL_THE | RV3029_EECTRL_THP,
669 th_set_bits);
670 if (ret < 0)
671 return ret;
672
673 return count;
674}
675
676static ssize_t rv3029_hwmon_show_update_interval(struct device *dev,
677 struct device_attribute *attr,
678 char *buf)
679{
Michael Büscha696b312016-03-10 18:34:46 +0100680 int ret, interval_ms;
681 u8 eectrl;
682
Mylène Josserande6e38082016-05-03 11:54:33 +0200683 ret = rv3029_eeprom_read(dev, RV3029_CONTROL_E2P_EECTRL,
Michael Büscha696b312016-03-10 18:34:46 +0100684 &eectrl, 1);
685 if (ret < 0)
686 return ret;
687
688 if (eectrl & RV3029_EECTRL_THE) {
689 if (eectrl & RV3029_EECTRL_THP)
690 interval_ms = 16000;
691 else
692 interval_ms = 1000;
693 } else {
694 interval_ms = 0;
695 }
696
697 return sprintf(buf, "%d\n", interval_ms);
698}
699
700static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, rv3029_hwmon_show_temp,
701 NULL, 0);
702static SENSOR_DEVICE_ATTR(update_interval, S_IWUSR | S_IRUGO,
703 rv3029_hwmon_show_update_interval,
704 rv3029_hwmon_set_update_interval, 0);
705
706static struct attribute *rv3029_hwmon_attrs[] = {
707 &sensor_dev_attr_temp1_input.dev_attr.attr,
708 &sensor_dev_attr_update_interval.dev_attr.attr,
709 NULL,
710};
711ATTRIBUTE_GROUPS(rv3029_hwmon);
712
Mylène Josserande6e38082016-05-03 11:54:33 +0200713static void rv3029_hwmon_register(struct device *dev, const char *name)
Michael Büscha696b312016-03-10 18:34:46 +0100714{
Mylène Josserande6e38082016-05-03 11:54:33 +0200715 struct rv3029_data *rv3029 = dev_get_drvdata(dev);
Michael Büscha696b312016-03-10 18:34:46 +0100716 struct device *hwmon_dev;
717
Mylène Josserande6e38082016-05-03 11:54:33 +0200718 hwmon_dev = devm_hwmon_device_register_with_groups(dev, name, rv3029,
719 rv3029_hwmon_groups);
Michael Büscha696b312016-03-10 18:34:46 +0100720 if (IS_ERR(hwmon_dev)) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200721 dev_warn(dev, "unable to register hwmon device %ld\n",
Mylène Josserand4e7f1a62016-05-03 11:54:32 +0200722 PTR_ERR(hwmon_dev));
Michael Büscha696b312016-03-10 18:34:46 +0100723 }
724}
725
726#else /* CONFIG_RTC_DRV_RV3029_HWMON */
727
Mylène Josserande6e38082016-05-03 11:54:33 +0200728static void rv3029_hwmon_register(struct device *dev, const char *name)
Michael Büscha696b312016-03-10 18:34:46 +0100729{
730}
731
732#endif /* CONFIG_RTC_DRV_RV3029_HWMON */
733
Michael Büschaba39d22016-03-04 22:38:45 +0100734static const struct rtc_class_ops rv3029_rtc_ops = {
Mylène Josserande6e38082016-05-03 11:54:33 +0200735 .read_time = rv3029_read_time,
736 .set_time = rv3029_set_time,
737 .read_alarm = rv3029_read_alarm,
738 .set_alarm = rv3029_set_alarm,
Heiko Schocher52365232011-05-26 16:25:05 -0700739};
740
Michael Büschaba39d22016-03-04 22:38:45 +0100741static struct i2c_device_id rv3029_id[] = {
Michael Büschbaba6232016-03-04 22:39:17 +0100742 { "rv3029", 0 },
Heiko Schocher52365232011-05-26 16:25:05 -0700743 { "rv3029c2", 0 },
744 { }
745};
Michael Büschaba39d22016-03-04 22:38:45 +0100746MODULE_DEVICE_TABLE(i2c, rv3029_id);
Heiko Schocher52365232011-05-26 16:25:05 -0700747
Mylène Josserande6e38082016-05-03 11:54:33 +0200748static int rv3029_probe(struct device *dev, struct regmap *regmap, int irq,
749 const char *name)
Heiko Schocher52365232011-05-26 16:25:05 -0700750{
Mylène Josserande6e38082016-05-03 11:54:33 +0200751 struct rv3029_data *rv3029;
Heiko Schocher52365232011-05-26 16:25:05 -0700752 int rc = 0;
753 u8 buf[1];
754
Mylène Josserande6e38082016-05-03 11:54:33 +0200755 rv3029 = devm_kzalloc(dev, sizeof(*rv3029), GFP_KERNEL);
756 if (!rv3029)
757 return -ENOMEM;
Heiko Schocher52365232011-05-26 16:25:05 -0700758
Mylène Josserande6e38082016-05-03 11:54:33 +0200759 rv3029->regmap = regmap;
760 rv3029->irq = irq;
761 rv3029->dev = dev;
762 dev_set_drvdata(dev, rv3029);
763
764 rc = rv3029_get_sr(dev, buf);
Gregory Hermant67ab2442014-04-03 14:50:17 -0700765 if (rc < 0) {
Mylène Josserande6e38082016-05-03 11:54:33 +0200766 dev_err(dev, "reading status failed\n");
Gregory Hermant67ab2442014-04-03 14:50:17 -0700767 return rc;
768 }
769
Mylène Josserande6e38082016-05-03 11:54:33 +0200770 rv3029_trickle_config(dev);
771 rv3029_hwmon_register(dev, name);
Michael Büsche27e2162016-03-04 22:41:19 +0100772
Mylène Josserande6e38082016-05-03 11:54:33 +0200773 rv3029->rtc = devm_rtc_device_register(dev, name, &rv3029_rtc_ops,
774 THIS_MODULE);
Heiko Schocher52365232011-05-26 16:25:05 -0700775
Mylène Josserande6e38082016-05-03 11:54:33 +0200776 return PTR_ERR_OR_ZERO(rv3029->rtc);
777}
Heiko Schocher52365232011-05-26 16:25:05 -0700778
Mylène Josserandc2a1c142016-05-03 11:54:34 +0200779#if IS_ENABLED(CONFIG_I2C)
780
Mylène Josserande6e38082016-05-03 11:54:33 +0200781static int rv3029_i2c_probe(struct i2c_client *client,
782 const struct i2c_device_id *id)
783{
784 struct regmap *regmap;
785 static const struct regmap_config config = {
786 .reg_bits = 8,
787 .val_bits = 8,
788 };
Heiko Schocher52365232011-05-26 16:25:05 -0700789
Mylène Josserande6e38082016-05-03 11:54:33 +0200790 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK |
791 I2C_FUNC_SMBUS_BYTE)) {
792 dev_err(&client->dev, "Adapter does not support SMBUS_I2C_BLOCK or SMBUS_I2C_BYTE\n");
793 return -ENODEV;
794 }
795
796 regmap = devm_regmap_init_i2c(client, &config);
797 if (IS_ERR(regmap)) {
798 dev_err(&client->dev, "%s: regmap allocation failed: %ld\n",
799 __func__, PTR_ERR(regmap));
800 return PTR_ERR(regmap);
801 }
802
803 return rv3029_probe(&client->dev, regmap, client->irq, client->name);
Heiko Schocher52365232011-05-26 16:25:05 -0700804}
805
Michael Büschaba39d22016-03-04 22:38:45 +0100806static struct i2c_driver rv3029_driver = {
Heiko Schocher52365232011-05-26 16:25:05 -0700807 .driver = {
808 .name = "rtc-rv3029c2",
809 },
Mylène Josserande6e38082016-05-03 11:54:33 +0200810 .probe = rv3029_i2c_probe,
Michael Büschaba39d22016-03-04 22:38:45 +0100811 .id_table = rv3029_id,
Heiko Schocher52365232011-05-26 16:25:05 -0700812};
813
Mylène Josserandc2a1c142016-05-03 11:54:34 +0200814static int rv3029_register_driver(void)
815{
816 return i2c_add_driver(&rv3029_driver);
817}
818
819static void rv3029_unregister_driver(void)
820{
821 i2c_del_driver(&rv3029_driver);
822}
823
824#else
825
826static int rv3029_register_driver(void)
827{
828 return 0;
829}
830
831static void rv3029_unregister_driver(void)
832{
833}
834
835#endif
836
837#if IS_ENABLED(CONFIG_SPI_MASTER)
838
839static int rv3049_probe(struct spi_device *spi)
840{
841 static const struct regmap_config config = {
842 .reg_bits = 8,
843 .val_bits = 8,
844 };
845 struct regmap *regmap;
846
847 regmap = devm_regmap_init_spi(spi, &config);
848 if (IS_ERR(regmap)) {
849 dev_err(&spi->dev, "%s: regmap allocation failed: %ld\n",
850 __func__, PTR_ERR(regmap));
851 return PTR_ERR(regmap);
852 }
853
854 return rv3029_probe(&spi->dev, regmap, spi->irq, "rv3049");
855}
856
857static struct spi_driver rv3049_driver = {
858 .driver = {
859 .name = "rv3049",
860 },
861 .probe = rv3049_probe,
862};
863
864static int rv3049_register_driver(void)
865{
866 return spi_register_driver(&rv3049_driver);
867}
868
869static void rv3049_unregister_driver(void)
870{
871 spi_unregister_driver(&rv3049_driver);
872}
873
874#else
875
876static int rv3049_register_driver(void)
877{
878 return 0;
879}
880
881static void rv3049_unregister_driver(void)
882{
883}
884
885#endif
886
887static int __init rv30x9_init(void)
888{
889 int ret;
890
891 ret = rv3029_register_driver();
892 if (ret) {
893 pr_err("Failed to register rv3029 driver: %d\n", ret);
894 return ret;
895 }
896
897 ret = rv3049_register_driver();
898 if (ret) {
899 pr_err("Failed to register rv3049 driver: %d\n", ret);
900 rv3029_unregister_driver();
901 }
902
903 return ret;
904}
905module_init(rv30x9_init)
906
907static void __exit rv30x9_exit(void)
908{
909 rv3049_unregister_driver();
910 rv3029_unregister_driver();
911}
912module_exit(rv30x9_exit)
Heiko Schocher52365232011-05-26 16:25:05 -0700913
914MODULE_AUTHOR("Gregory Hermant <gregory.hermant@calao-systems.com>");
Michael Büsch2dca3d92016-03-04 22:40:30 +0100915MODULE_AUTHOR("Michael Buesch <m@bues.ch>");
Mylène Josserandc2a1c142016-05-03 11:54:34 +0200916MODULE_DESCRIPTION("Micro Crystal RV3029/RV3049 RTC driver");
Heiko Schocher52365232011-05-26 16:25:05 -0700917MODULE_LICENSE("GPL");
Mylène Josserandc2a1c142016-05-03 11:54:34 +0200918MODULE_ALIAS("spi:rv3049");