1 // SPDX-License-Identifier: GPL-2.0-only
3 * rtc-fm3130.c - RTC driver for Ramtron FM3130 I2C chip.
5 * Copyright (C) 2008 Sergey Lapin
6 * Based on ds1307 driver by James Chapman and David Brownell
9 #include <linux/module.h>
10 #include <linux/i2c.h>
11 #include <linux/rtc.h>
12 #include <linux/bcd.h>
13 #include <linux/slab.h>
15 #define FM3130_RTC_CONTROL (0x0)
16 #define FM3130_CAL_CONTROL (0x1)
17 #define FM3130_RTC_SECONDS (0x2)
18 #define FM3130_RTC_MINUTES (0x3)
19 #define FM3130_RTC_HOURS (0x4)
20 #define FM3130_RTC_DAY (0x5)
21 #define FM3130_RTC_DATE (0x6)
22 #define FM3130_RTC_MONTHS (0x7)
23 #define FM3130_RTC_YEARS (0x8)
25 #define FM3130_ALARM_SECONDS (0x9)
26 #define FM3130_ALARM_MINUTES (0xa)
27 #define FM3130_ALARM_HOURS (0xb)
28 #define FM3130_ALARM_DATE (0xc)
29 #define FM3130_ALARM_MONTHS (0xd)
30 #define FM3130_ALARM_WP_CONTROL (0xe)
32 #define FM3130_CAL_CONTROL_BIT_nOSCEN (1 << 7) /* Osciallator enabled */
33 #define FM3130_RTC_CONTROL_BIT_LB (1 << 7) /* Low battery */
34 #define FM3130_RTC_CONTROL_BIT_AF (1 << 6) /* Alarm flag */
35 #define FM3130_RTC_CONTROL_BIT_CF (1 << 5) /* Century overflow */
36 #define FM3130_RTC_CONTROL_BIT_POR (1 << 4) /* Power on reset */
37 #define FM3130_RTC_CONTROL_BIT_AEN (1 << 3) /* Alarm enable */
38 #define FM3130_RTC_CONTROL_BIT_CAL (1 << 2) /* Calibration mode */
39 #define FM3130_RTC_CONTROL_BIT_WRITE (1 << 1) /* W=1 -> write mode W=0 normal */
40 #define FM3130_RTC_CONTROL_BIT_READ (1 << 0) /* R=1 -> read mode R=0 normal */
42 #define FM3130_CLOCK_REGS 7
43 #define FM3130_ALARM_REGS 5
49 struct i2c_msg msg
[4];
50 struct i2c_client
*client
;
51 struct rtc_device
*rtc
;
55 static const struct i2c_device_id fm3130_id
[] = {
59 MODULE_DEVICE_TABLE(i2c
, fm3130_id
);
61 #define FM3130_MODE_NORMAL 0
62 #define FM3130_MODE_WRITE 1
63 #define FM3130_MODE_READ 2
65 static void fm3130_rtc_mode(struct device
*dev
, int mode
)
67 struct fm3130
*fm3130
= dev_get_drvdata(dev
);
69 fm3130
->regs
[FM3130_RTC_CONTROL
] =
70 i2c_smbus_read_byte_data(fm3130
->client
, FM3130_RTC_CONTROL
);
72 case FM3130_MODE_NORMAL
:
73 fm3130
->regs
[FM3130_RTC_CONTROL
] &=
74 ~(FM3130_RTC_CONTROL_BIT_WRITE
|
75 FM3130_RTC_CONTROL_BIT_READ
);
77 case FM3130_MODE_WRITE
:
78 fm3130
->regs
[FM3130_RTC_CONTROL
] |= FM3130_RTC_CONTROL_BIT_WRITE
;
80 case FM3130_MODE_READ
:
81 fm3130
->regs
[FM3130_RTC_CONTROL
] |= FM3130_RTC_CONTROL_BIT_READ
;
84 dev_dbg(dev
, "invalid mode %d\n", mode
);
88 i2c_smbus_write_byte_data(fm3130
->client
,
89 FM3130_RTC_CONTROL
, fm3130
->regs
[FM3130_RTC_CONTROL
]);
92 static int fm3130_get_time(struct device
*dev
, struct rtc_time
*t
)
94 struct fm3130
*fm3130
= dev_get_drvdata(dev
);
97 if (!fm3130
->data_valid
) {
98 /* We have invalid data in RTC, probably due
99 to battery faults or other problems. Return EIO
100 for now, it will allow us to set data later instead
101 of error during probing which disables device */
104 fm3130_rtc_mode(dev
, FM3130_MODE_READ
);
106 /* read the RTC date and time registers all at once */
107 tmp
= i2c_transfer(to_i2c_adapter(fm3130
->client
->dev
.parent
),
110 dev_err(dev
, "%s error %d\n", "read", tmp
);
114 fm3130_rtc_mode(dev
, FM3130_MODE_NORMAL
);
116 dev_dbg(dev
, "%s: %15ph\n", "read", fm3130
->regs
);
118 t
->tm_sec
= bcd2bin(fm3130
->regs
[FM3130_RTC_SECONDS
] & 0x7f);
119 t
->tm_min
= bcd2bin(fm3130
->regs
[FM3130_RTC_MINUTES
] & 0x7f);
120 tmp
= fm3130
->regs
[FM3130_RTC_HOURS
] & 0x3f;
121 t
->tm_hour
= bcd2bin(tmp
);
122 t
->tm_wday
= bcd2bin(fm3130
->regs
[FM3130_RTC_DAY
] & 0x07) - 1;
123 t
->tm_mday
= bcd2bin(fm3130
->regs
[FM3130_RTC_DATE
] & 0x3f);
124 tmp
= fm3130
->regs
[FM3130_RTC_MONTHS
] & 0x1f;
125 t
->tm_mon
= bcd2bin(tmp
) - 1;
127 /* assume 20YY not 19YY, and ignore CF bit */
128 t
->tm_year
= bcd2bin(fm3130
->regs
[FM3130_RTC_YEARS
]) + 100;
130 dev_dbg(dev
, "%s secs=%d, mins=%d, "
131 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
132 "read", t
->tm_sec
, t
->tm_min
,
133 t
->tm_hour
, t
->tm_mday
,
134 t
->tm_mon
, t
->tm_year
, t
->tm_wday
);
140 static int fm3130_set_time(struct device
*dev
, struct rtc_time
*t
)
142 struct fm3130
*fm3130
= dev_get_drvdata(dev
);
144 u8
*buf
= fm3130
->regs
;
146 dev_dbg(dev
, "%s secs=%d, mins=%d, "
147 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
148 "write", t
->tm_sec
, t
->tm_min
,
149 t
->tm_hour
, t
->tm_mday
,
150 t
->tm_mon
, t
->tm_year
, t
->tm_wday
);
152 /* first register addr */
153 buf
[FM3130_RTC_SECONDS
] = bin2bcd(t
->tm_sec
);
154 buf
[FM3130_RTC_MINUTES
] = bin2bcd(t
->tm_min
);
155 buf
[FM3130_RTC_HOURS
] = bin2bcd(t
->tm_hour
);
156 buf
[FM3130_RTC_DAY
] = bin2bcd(t
->tm_wday
+ 1);
157 buf
[FM3130_RTC_DATE
] = bin2bcd(t
->tm_mday
);
158 buf
[FM3130_RTC_MONTHS
] = bin2bcd(t
->tm_mon
+ 1);
160 /* assume 20YY not 19YY */
161 tmp
= t
->tm_year
- 100;
162 buf
[FM3130_RTC_YEARS
] = bin2bcd(tmp
);
164 dev_dbg(dev
, "%s: %15ph\n", "write", buf
);
166 fm3130_rtc_mode(dev
, FM3130_MODE_WRITE
);
168 /* Writing time registers, we don't support multibyte transfers */
169 for (i
= 0; i
< FM3130_CLOCK_REGS
; i
++) {
170 i2c_smbus_write_byte_data(fm3130
->client
,
171 FM3130_RTC_SECONDS
+ i
,
172 fm3130
->regs
[FM3130_RTC_SECONDS
+ i
]);
175 fm3130_rtc_mode(dev
, FM3130_MODE_NORMAL
);
177 /* We assume here that data are valid once written */
178 if (!fm3130
->data_valid
)
179 fm3130
->data_valid
= 1;
183 static int fm3130_read_alarm(struct device
*dev
, struct rtc_wkalrm
*alrm
)
185 struct fm3130
*fm3130
= dev_get_drvdata(dev
);
187 struct rtc_time
*tm
= &alrm
->time
;
189 if (!fm3130
->alarm_valid
) {
191 * We have invalid alarm in RTC, probably due to battery faults
192 * or other problems. Return EIO for now, it will allow us to
193 * set alarm value later instead of error during probing which
199 /* read the RTC alarm registers all at once */
200 tmp
= i2c_transfer(to_i2c_adapter(fm3130
->client
->dev
.parent
),
203 dev_err(dev
, "%s error %d\n", "read", tmp
);
206 dev_dbg(dev
, "alarm read %02x %02x %02x %02x %02x\n",
207 fm3130
->regs
[FM3130_ALARM_SECONDS
],
208 fm3130
->regs
[FM3130_ALARM_MINUTES
],
209 fm3130
->regs
[FM3130_ALARM_HOURS
],
210 fm3130
->regs
[FM3130_ALARM_DATE
],
211 fm3130
->regs
[FM3130_ALARM_MONTHS
]);
213 tm
->tm_sec
= bcd2bin(fm3130
->regs
[FM3130_ALARM_SECONDS
] & 0x7F);
214 tm
->tm_min
= bcd2bin(fm3130
->regs
[FM3130_ALARM_MINUTES
] & 0x7F);
215 tm
->tm_hour
= bcd2bin(fm3130
->regs
[FM3130_ALARM_HOURS
] & 0x3F);
216 tm
->tm_mday
= bcd2bin(fm3130
->regs
[FM3130_ALARM_DATE
] & 0x3F);
217 tm
->tm_mon
= bcd2bin(fm3130
->regs
[FM3130_ALARM_MONTHS
] & 0x1F);
220 tm
->tm_mon
-= 1; /* RTC is 1-12, tm_mon is 0-11 */
222 dev_dbg(dev
, "%s secs=%d, mins=%d, "
223 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
224 "read alarm", tm
->tm_sec
, tm
->tm_min
,
225 tm
->tm_hour
, tm
->tm_mday
,
226 tm
->tm_mon
, tm
->tm_year
, tm
->tm_wday
);
228 /* check if alarm enabled */
229 fm3130
->regs
[FM3130_RTC_CONTROL
] =
230 i2c_smbus_read_byte_data(fm3130
->client
, FM3130_RTC_CONTROL
);
232 if ((fm3130
->regs
[FM3130_RTC_CONTROL
] & FM3130_RTC_CONTROL_BIT_AEN
) &&
233 (~fm3130
->regs
[FM3130_RTC_CONTROL
] &
234 FM3130_RTC_CONTROL_BIT_CAL
)) {
241 static int fm3130_set_alarm(struct device
*dev
, struct rtc_wkalrm
*alrm
)
243 struct fm3130
*fm3130
= dev_get_drvdata(dev
);
244 struct rtc_time
*tm
= &alrm
->time
;
247 dev_dbg(dev
, "%s secs=%d, mins=%d, "
248 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
249 "write alarm", tm
->tm_sec
, tm
->tm_min
,
250 tm
->tm_hour
, tm
->tm_mday
,
251 tm
->tm_mon
, tm
->tm_year
, tm
->tm_wday
);
253 fm3130
->regs
[FM3130_ALARM_SECONDS
] =
254 (tm
->tm_sec
!= -1) ? bin2bcd(tm
->tm_sec
) : 0x80;
256 fm3130
->regs
[FM3130_ALARM_MINUTES
] =
257 (tm
->tm_min
!= -1) ? bin2bcd(tm
->tm_min
) : 0x80;
259 fm3130
->regs
[FM3130_ALARM_HOURS
] =
260 (tm
->tm_hour
!= -1) ? bin2bcd(tm
->tm_hour
) : 0x80;
262 fm3130
->regs
[FM3130_ALARM_DATE
] =
263 (tm
->tm_mday
!= -1) ? bin2bcd(tm
->tm_mday
) : 0x80;
265 fm3130
->regs
[FM3130_ALARM_MONTHS
] =
266 (tm
->tm_mon
!= -1) ? bin2bcd(tm
->tm_mon
+ 1) : 0x80;
268 dev_dbg(dev
, "alarm write %02x %02x %02x %02x %02x\n",
269 fm3130
->regs
[FM3130_ALARM_SECONDS
],
270 fm3130
->regs
[FM3130_ALARM_MINUTES
],
271 fm3130
->regs
[FM3130_ALARM_HOURS
],
272 fm3130
->regs
[FM3130_ALARM_DATE
],
273 fm3130
->regs
[FM3130_ALARM_MONTHS
]);
274 /* Writing time registers, we don't support multibyte transfers */
275 for (i
= 0; i
< FM3130_ALARM_REGS
; i
++) {
276 i2c_smbus_write_byte_data(fm3130
->client
,
277 FM3130_ALARM_SECONDS
+ i
,
278 fm3130
->regs
[FM3130_ALARM_SECONDS
+ i
]);
280 fm3130
->regs
[FM3130_RTC_CONTROL
] =
281 i2c_smbus_read_byte_data(fm3130
->client
, FM3130_RTC_CONTROL
);
283 /* enable or disable alarm */
285 i2c_smbus_write_byte_data(fm3130
->client
, FM3130_RTC_CONTROL
,
286 (fm3130
->regs
[FM3130_RTC_CONTROL
] &
287 ~(FM3130_RTC_CONTROL_BIT_CAL
)) |
288 FM3130_RTC_CONTROL_BIT_AEN
);
290 i2c_smbus_write_byte_data(fm3130
->client
, FM3130_RTC_CONTROL
,
291 fm3130
->regs
[FM3130_RTC_CONTROL
] &
292 ~(FM3130_RTC_CONTROL_BIT_CAL
) &
293 ~(FM3130_RTC_CONTROL_BIT_AEN
));
296 /* We assume here that data is valid once written */
297 if (!fm3130
->alarm_valid
)
298 fm3130
->alarm_valid
= 1;
303 static int fm3130_alarm_irq_enable(struct device
*dev
, unsigned int enabled
)
305 struct fm3130
*fm3130
= dev_get_drvdata(dev
);
308 fm3130
->regs
[FM3130_RTC_CONTROL
] =
309 i2c_smbus_read_byte_data(fm3130
->client
, FM3130_RTC_CONTROL
);
311 dev_dbg(dev
, "alarm_irq_enable: enable=%d, FM3130_RTC_CONTROL=%02x\n",
312 enabled
, fm3130
->regs
[FM3130_RTC_CONTROL
]);
315 case 0: /* alarm off */
316 ret
= i2c_smbus_write_byte_data(fm3130
->client
,
317 FM3130_RTC_CONTROL
, fm3130
->regs
[FM3130_RTC_CONTROL
] &
318 ~(FM3130_RTC_CONTROL_BIT_CAL
) &
319 ~(FM3130_RTC_CONTROL_BIT_AEN
));
321 case 1: /* alarm on */
322 ret
= i2c_smbus_write_byte_data(fm3130
->client
,
323 FM3130_RTC_CONTROL
, (fm3130
->regs
[FM3130_RTC_CONTROL
] &
324 ~(FM3130_RTC_CONTROL_BIT_CAL
)) |
325 FM3130_RTC_CONTROL_BIT_AEN
);
335 static const struct rtc_class_ops fm3130_rtc_ops
= {
336 .read_time
= fm3130_get_time
,
337 .set_time
= fm3130_set_time
,
338 .read_alarm
= fm3130_read_alarm
,
339 .set_alarm
= fm3130_set_alarm
,
340 .alarm_irq_enable
= fm3130_alarm_irq_enable
,
343 static struct i2c_driver fm3130_driver
;
345 static int fm3130_probe(struct i2c_client
*client
,
346 const struct i2c_device_id
*id
)
348 struct fm3130
*fm3130
;
351 struct i2c_adapter
*adapter
= to_i2c_adapter(client
->dev
.parent
);
353 if (!i2c_check_functionality(adapter
,
354 I2C_FUNC_I2C
| I2C_FUNC_SMBUS_WRITE_BYTE_DATA
))
357 fm3130
= devm_kzalloc(&client
->dev
, sizeof(struct fm3130
), GFP_KERNEL
);
362 fm3130
->client
= client
;
363 i2c_set_clientdata(client
, fm3130
);
364 fm3130
->reg_addr_time
= FM3130_RTC_SECONDS
;
365 fm3130
->reg_addr_alarm
= FM3130_ALARM_SECONDS
;
367 /* Messages to read time */
368 fm3130
->msg
[0].addr
= client
->addr
;
369 fm3130
->msg
[0].flags
= 0;
370 fm3130
->msg
[0].len
= 1;
371 fm3130
->msg
[0].buf
= &fm3130
->reg_addr_time
;
373 fm3130
->msg
[1].addr
= client
->addr
;
374 fm3130
->msg
[1].flags
= I2C_M_RD
;
375 fm3130
->msg
[1].len
= FM3130_CLOCK_REGS
;
376 fm3130
->msg
[1].buf
= &fm3130
->regs
[FM3130_RTC_SECONDS
];
378 /* Messages to read alarm */
379 fm3130
->msg
[2].addr
= client
->addr
;
380 fm3130
->msg
[2].flags
= 0;
381 fm3130
->msg
[2].len
= 1;
382 fm3130
->msg
[2].buf
= &fm3130
->reg_addr_alarm
;
384 fm3130
->msg
[3].addr
= client
->addr
;
385 fm3130
->msg
[3].flags
= I2C_M_RD
;
386 fm3130
->msg
[3].len
= FM3130_ALARM_REGS
;
387 fm3130
->msg
[3].buf
= &fm3130
->regs
[FM3130_ALARM_SECONDS
];
389 fm3130
->alarm_valid
= 0;
390 fm3130
->data_valid
= 0;
392 tmp
= i2c_transfer(adapter
, fm3130
->msg
, 4);
394 dev_dbg(&client
->dev
, "read error %d\n", tmp
);
399 fm3130
->regs
[FM3130_RTC_CONTROL
] =
400 i2c_smbus_read_byte_data(client
, FM3130_RTC_CONTROL
);
401 fm3130
->regs
[FM3130_CAL_CONTROL
] =
402 i2c_smbus_read_byte_data(client
, FM3130_CAL_CONTROL
);
404 /* Disabling calibration mode */
405 if (fm3130
->regs
[FM3130_RTC_CONTROL
] & FM3130_RTC_CONTROL_BIT_CAL
) {
406 i2c_smbus_write_byte_data(client
, FM3130_RTC_CONTROL
,
407 fm3130
->regs
[FM3130_RTC_CONTROL
] &
408 ~(FM3130_RTC_CONTROL_BIT_CAL
));
409 dev_warn(&client
->dev
, "Disabling calibration mode!\n");
412 /* Disabling read and write modes */
413 if (fm3130
->regs
[FM3130_RTC_CONTROL
] & FM3130_RTC_CONTROL_BIT_WRITE
||
414 fm3130
->regs
[FM3130_RTC_CONTROL
] & FM3130_RTC_CONTROL_BIT_READ
) {
415 i2c_smbus_write_byte_data(client
, FM3130_RTC_CONTROL
,
416 fm3130
->regs
[FM3130_RTC_CONTROL
] &
417 ~(FM3130_RTC_CONTROL_BIT_READ
|
418 FM3130_RTC_CONTROL_BIT_WRITE
));
419 dev_warn(&client
->dev
, "Disabling READ or WRITE mode!\n");
422 /* oscillator off? turn it on, so clock can tick. */
423 if (fm3130
->regs
[FM3130_CAL_CONTROL
] & FM3130_CAL_CONTROL_BIT_nOSCEN
)
424 i2c_smbus_write_byte_data(client
, FM3130_CAL_CONTROL
,
425 fm3130
->regs
[FM3130_CAL_CONTROL
] &
426 ~(FM3130_CAL_CONTROL_BIT_nOSCEN
));
428 /* low battery? clear flag, and warn */
429 if (fm3130
->regs
[FM3130_RTC_CONTROL
] & FM3130_RTC_CONTROL_BIT_LB
) {
430 i2c_smbus_write_byte_data(client
, FM3130_RTC_CONTROL
,
431 fm3130
->regs
[FM3130_RTC_CONTROL
] &
432 ~(FM3130_RTC_CONTROL_BIT_LB
));
433 dev_warn(&client
->dev
, "Low battery!\n");
436 /* check if Power On Reset bit is set */
437 if (fm3130
->regs
[FM3130_RTC_CONTROL
] & FM3130_RTC_CONTROL_BIT_POR
) {
438 i2c_smbus_write_byte_data(client
, FM3130_RTC_CONTROL
,
439 fm3130
->regs
[FM3130_RTC_CONTROL
] &
440 ~FM3130_RTC_CONTROL_BIT_POR
);
441 dev_dbg(&client
->dev
, "POR bit is set\n");
443 /* ACS is controlled by alarm */
444 i2c_smbus_write_byte_data(client
, FM3130_ALARM_WP_CONTROL
, 0x80);
446 /* alarm registers sanity check */
447 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_SECONDS
] & 0x7f);
451 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_MINUTES
] & 0x7f);
455 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_HOURS
] & 0x3f);
459 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_DATE
] & 0x3f);
460 if (tmp
== 0 || tmp
> 31)
463 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_MONTHS
] & 0x1f);
464 if (tmp
== 0 || tmp
> 12)
467 fm3130
->alarm_valid
= 1;
471 /* clock registers sanity chek */
472 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_SECONDS
] & 0x7f);
476 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_MINUTES
] & 0x7f);
480 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_HOURS
] & 0x3f);
484 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_DAY
] & 0x7);
485 if (tmp
== 0 || tmp
> 7)
488 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_DATE
] & 0x3f);
489 if (tmp
== 0 || tmp
> 31)
492 tmp
= bcd2bin(fm3130
->regs
[FM3130_RTC_MONTHS
] & 0x1f);
493 if (tmp
== 0 || tmp
> 12)
496 fm3130
->data_valid
= 1;
500 if (!fm3130
->data_valid
|| !fm3130
->alarm_valid
)
501 dev_dbg(&client
->dev
, "%s: %15ph\n", "bogus registers",
504 /* We won't bail out here because we just got invalid data.
505 Time setting from u-boot doesn't work anyway */
506 fm3130
->rtc
= devm_rtc_device_register(&client
->dev
, client
->name
,
507 &fm3130_rtc_ops
, THIS_MODULE
);
508 if (IS_ERR(fm3130
->rtc
)) {
509 err
= PTR_ERR(fm3130
->rtc
);
510 dev_err(&client
->dev
,
511 "unable to register the class device\n");
519 static struct i2c_driver fm3130_driver
= {
521 .name
= "rtc-fm3130",
523 .probe
= fm3130_probe
,
524 .id_table
= fm3130_id
,
527 module_i2c_driver(fm3130_driver
);
529 MODULE_DESCRIPTION("RTC driver for FM3130");
530 MODULE_AUTHOR("Sergey Lapin <slapin@ossfans.org>");
531 MODULE_LICENSE("GPL");