2 * Seiko Instruments S-35390A RTC Driver
4 * Copyright (c) 2007 Byron Bradley
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
12 #include <linux/module.h>
13 #include <linux/rtc.h>
14 #include <linux/i2c.h>
15 #include <linux/bitrev.h>
16 #include <linux/bcd.h>
17 #include <linux/slab.h>
18 #include <linux/delay.h>
20 #define S35390A_CMD_STATUS1 0
21 #define S35390A_CMD_STATUS2 1
22 #define S35390A_CMD_TIME1 2
23 #define S35390A_CMD_TIME2 3
24 #define S35390A_CMD_INT2_REG1 5
26 #define S35390A_BYTE_YEAR 0
27 #define S35390A_BYTE_MONTH 1
28 #define S35390A_BYTE_DAY 2
29 #define S35390A_BYTE_WDAY 3
30 #define S35390A_BYTE_HOURS 4
31 #define S35390A_BYTE_MINS 5
32 #define S35390A_BYTE_SECS 6
34 #define S35390A_ALRM_BYTE_WDAY 0
35 #define S35390A_ALRM_BYTE_HOURS 1
36 #define S35390A_ALRM_BYTE_MINS 2
38 /* flags for STATUS1 */
39 #define S35390A_FLAG_POC 0x01
40 #define S35390A_FLAG_BLD 0x02
41 #define S35390A_FLAG_INT2 0x04
42 #define S35390A_FLAG_24H 0x40
43 #define S35390A_FLAG_RESET 0x80
45 /* flag for STATUS2 */
46 #define S35390A_FLAG_TEST 0x01
48 #define S35390A_INT2_MODE_MASK 0xF0
50 #define S35390A_INT2_MODE_NOINTR 0x00
51 #define S35390A_INT2_MODE_FREQ 0x10
52 #define S35390A_INT2_MODE_ALARM 0x40
53 #define S35390A_INT2_MODE_PMIN_EDG 0x20
55 static const struct i2c_device_id s35390a_id
[] = {
59 MODULE_DEVICE_TABLE(i2c
, s35390a_id
);
62 struct i2c_client
*client
[8];
63 struct rtc_device
*rtc
;
67 static int s35390a_set_reg(struct s35390a
*s35390a
, int reg
, char *buf
, int len
)
69 struct i2c_client
*client
= s35390a
->client
[reg
];
70 struct i2c_msg msg
[] = {
78 if ((i2c_transfer(client
->adapter
, msg
, 1)) != 1)
84 static int s35390a_get_reg(struct s35390a
*s35390a
, int reg
, char *buf
, int len
)
86 struct i2c_client
*client
= s35390a
->client
[reg
];
87 struct i2c_msg msg
[] = {
96 if ((i2c_transfer(client
->adapter
, msg
, 1)) != 1)
103 * Returns <0 on error, 0 if rtc is setup fine and 1 if the chip was reset.
104 * To keep the information if an irq is pending, pass the value read from
105 * STATUS1 to the caller.
107 static int s35390a_reset(struct s35390a
*s35390a
, char *status1
)
111 unsigned initcount
= 0;
113 ret
= s35390a_get_reg(s35390a
, S35390A_CMD_STATUS1
, status1
, 1);
117 if (*status1
& S35390A_FLAG_POC
)
119 * Do not communicate for 0.5 seconds since the power-on
120 * detection circuit is in operation.
123 else if (!(*status1
& S35390A_FLAG_BLD
))
125 * If both POC and BLD are unset everything is fine.
130 * At least one of POC and BLD are set, so reinitialise chip. Keeping
131 * this information in the hardware to know later that the time isn't
132 * valid is unfortunately not possible because POC and BLD are cleared
133 * on read. So the reset is best done now.
135 * The 24H bit is kept over reset, so set it already here.
138 *status1
= S35390A_FLAG_24H
;
139 buf
= S35390A_FLAG_RESET
| S35390A_FLAG_24H
;
140 ret
= s35390a_set_reg(s35390a
, S35390A_CMD_STATUS1
, &buf
, 1);
145 ret
= s35390a_get_reg(s35390a
, S35390A_CMD_STATUS1
, &buf
, 1);
149 if (buf
& (S35390A_FLAG_POC
| S35390A_FLAG_BLD
)) {
150 /* Try up to five times to reset the chip */
161 static int s35390a_disable_test_mode(struct s35390a
*s35390a
)
165 if (s35390a_get_reg(s35390a
, S35390A_CMD_STATUS2
, buf
, sizeof(buf
)) < 0)
168 if (!(buf
[0] & S35390A_FLAG_TEST
))
171 buf
[0] &= ~S35390A_FLAG_TEST
;
172 return s35390a_set_reg(s35390a
, S35390A_CMD_STATUS2
, buf
, sizeof(buf
));
175 static char s35390a_hr2reg(struct s35390a
*s35390a
, int hour
)
177 if (s35390a
->twentyfourhour
)
178 return bin2bcd(hour
);
181 return bin2bcd(hour
);
183 return 0x40 | bin2bcd(hour
- 12);
186 static int s35390a_reg2hr(struct s35390a
*s35390a
, char reg
)
190 if (s35390a
->twentyfourhour
)
191 return bcd2bin(reg
& 0x3f);
193 hour
= bcd2bin(reg
& 0x3f);
200 static int s35390a_set_datetime(struct i2c_client
*client
, struct rtc_time
*tm
)
202 struct s35390a
*s35390a
= i2c_get_clientdata(client
);
206 dev_dbg(&client
->dev
, "%s: tm is secs=%d, mins=%d, hours=%d mday=%d, "
207 "mon=%d, year=%d, wday=%d\n", __func__
, tm
->tm_sec
,
208 tm
->tm_min
, tm
->tm_hour
, tm
->tm_mday
, tm
->tm_mon
, tm
->tm_year
,
211 buf
[S35390A_BYTE_YEAR
] = bin2bcd(tm
->tm_year
- 100);
212 buf
[S35390A_BYTE_MONTH
] = bin2bcd(tm
->tm_mon
+ 1);
213 buf
[S35390A_BYTE_DAY
] = bin2bcd(tm
->tm_mday
);
214 buf
[S35390A_BYTE_WDAY
] = bin2bcd(tm
->tm_wday
);
215 buf
[S35390A_BYTE_HOURS
] = s35390a_hr2reg(s35390a
, tm
->tm_hour
);
216 buf
[S35390A_BYTE_MINS
] = bin2bcd(tm
->tm_min
);
217 buf
[S35390A_BYTE_SECS
] = bin2bcd(tm
->tm_sec
);
219 /* This chip expects the bits of each byte to be in reverse order */
220 for (i
= 0; i
< 7; ++i
)
221 buf
[i
] = bitrev8(buf
[i
]);
223 err
= s35390a_set_reg(s35390a
, S35390A_CMD_TIME1
, buf
, sizeof(buf
));
228 static int s35390a_get_datetime(struct i2c_client
*client
, struct rtc_time
*tm
)
230 struct s35390a
*s35390a
= i2c_get_clientdata(client
);
234 err
= s35390a_get_reg(s35390a
, S35390A_CMD_TIME1
, buf
, sizeof(buf
));
238 /* This chip returns the bits of each byte in reverse order */
239 for (i
= 0; i
< 7; ++i
)
240 buf
[i
] = bitrev8(buf
[i
]);
242 tm
->tm_sec
= bcd2bin(buf
[S35390A_BYTE_SECS
]);
243 tm
->tm_min
= bcd2bin(buf
[S35390A_BYTE_MINS
]);
244 tm
->tm_hour
= s35390a_reg2hr(s35390a
, buf
[S35390A_BYTE_HOURS
]);
245 tm
->tm_wday
= bcd2bin(buf
[S35390A_BYTE_WDAY
]);
246 tm
->tm_mday
= bcd2bin(buf
[S35390A_BYTE_DAY
]);
247 tm
->tm_mon
= bcd2bin(buf
[S35390A_BYTE_MONTH
]) - 1;
248 tm
->tm_year
= bcd2bin(buf
[S35390A_BYTE_YEAR
]) + 100;
250 dev_dbg(&client
->dev
, "%s: tm is secs=%d, mins=%d, hours=%d, mday=%d, "
251 "mon=%d, year=%d, wday=%d\n", __func__
, tm
->tm_sec
,
252 tm
->tm_min
, tm
->tm_hour
, tm
->tm_mday
, tm
->tm_mon
, tm
->tm_year
,
255 return rtc_valid_tm(tm
);
258 static int s35390a_set_alarm(struct i2c_client
*client
, struct rtc_wkalrm
*alm
)
260 struct s35390a
*s35390a
= i2c_get_clientdata(client
);
261 char buf
[3], sts
= 0;
264 dev_dbg(&client
->dev
, "%s: alm is secs=%d, mins=%d, hours=%d mday=%d, "\
265 "mon=%d, year=%d, wday=%d\n", __func__
, alm
->time
.tm_sec
,
266 alm
->time
.tm_min
, alm
->time
.tm_hour
, alm
->time
.tm_mday
,
267 alm
->time
.tm_mon
, alm
->time
.tm_year
, alm
->time
.tm_wday
);
269 /* disable interrupt */
270 err
= s35390a_set_reg(s35390a
, S35390A_CMD_STATUS2
, &sts
, sizeof(sts
));
274 /* clear pending interrupt, if any */
275 err
= s35390a_get_reg(s35390a
, S35390A_CMD_STATUS1
, &sts
, sizeof(sts
));
280 sts
= S35390A_INT2_MODE_ALARM
;
282 sts
= S35390A_INT2_MODE_NOINTR
;
284 /* This chip expects the bits of each byte to be in reverse order */
287 /* set interupt mode*/
288 err
= s35390a_set_reg(s35390a
, S35390A_CMD_STATUS2
, &sts
, sizeof(sts
));
292 if (alm
->time
.tm_wday
!= -1)
293 buf
[S35390A_ALRM_BYTE_WDAY
] = bin2bcd(alm
->time
.tm_wday
) | 0x80;
295 buf
[S35390A_ALRM_BYTE_WDAY
] = 0;
297 buf
[S35390A_ALRM_BYTE_HOURS
] = s35390a_hr2reg(s35390a
,
298 alm
->time
.tm_hour
) | 0x80;
299 buf
[S35390A_ALRM_BYTE_MINS
] = bin2bcd(alm
->time
.tm_min
) | 0x80;
301 if (alm
->time
.tm_hour
>= 12)
302 buf
[S35390A_ALRM_BYTE_HOURS
] |= 0x40;
304 for (i
= 0; i
< 3; ++i
)
305 buf
[i
] = bitrev8(buf
[i
]);
307 err
= s35390a_set_reg(s35390a
, S35390A_CMD_INT2_REG1
, buf
,
313 static int s35390a_read_alarm(struct i2c_client
*client
, struct rtc_wkalrm
*alm
)
315 struct s35390a
*s35390a
= i2c_get_clientdata(client
);
320 * initialize all members to -1 to signal the core that they are not
321 * defined by the hardware.
323 alm
->time
.tm_sec
= -1;
324 alm
->time
.tm_min
= -1;
325 alm
->time
.tm_hour
= -1;
326 alm
->time
.tm_mday
= -1;
327 alm
->time
.tm_mon
= -1;
328 alm
->time
.tm_year
= -1;
329 alm
->time
.tm_wday
= -1;
330 alm
->time
.tm_yday
= -1;
331 alm
->time
.tm_isdst
= -1;
333 err
= s35390a_get_reg(s35390a
, S35390A_CMD_STATUS2
, &sts
, sizeof(sts
));
337 if ((bitrev8(sts
) & S35390A_INT2_MODE_MASK
) != S35390A_INT2_MODE_ALARM
) {
339 * When the alarm isn't enabled, the register to configure
340 * the alarm time isn't accessible.
348 err
= s35390a_get_reg(s35390a
, S35390A_CMD_INT2_REG1
, buf
, sizeof(buf
));
352 /* This chip returns the bits of each byte in reverse order */
353 for (i
= 0; i
< 3; ++i
)
354 buf
[i
] = bitrev8(buf
[i
]);
357 * B0 of the three matching registers is an enable flag. Iff it is set
358 * the configured value is used for matching.
360 if (buf
[S35390A_ALRM_BYTE_WDAY
] & 0x80)
362 bcd2bin(buf
[S35390A_ALRM_BYTE_WDAY
] & ~0x80);
364 if (buf
[S35390A_ALRM_BYTE_HOURS
] & 0x80)
366 s35390a_reg2hr(s35390a
,
367 buf
[S35390A_ALRM_BYTE_HOURS
] & ~0x80);
369 if (buf
[S35390A_ALRM_BYTE_MINS
] & 0x80)
370 alm
->time
.tm_min
= bcd2bin(buf
[S35390A_ALRM_BYTE_MINS
] & ~0x80);
372 /* alarm triggers always at s=0 */
373 alm
->time
.tm_sec
= 0;
375 dev_dbg(&client
->dev
, "%s: alm is mins=%d, hours=%d, wday=%d\n",
376 __func__
, alm
->time
.tm_min
, alm
->time
.tm_hour
,
382 static int s35390a_rtc_read_alarm(struct device
*dev
, struct rtc_wkalrm
*alm
)
384 return s35390a_read_alarm(to_i2c_client(dev
), alm
);
387 static int s35390a_rtc_set_alarm(struct device
*dev
, struct rtc_wkalrm
*alm
)
389 return s35390a_set_alarm(to_i2c_client(dev
), alm
);
392 static int s35390a_rtc_read_time(struct device
*dev
, struct rtc_time
*tm
)
394 return s35390a_get_datetime(to_i2c_client(dev
), tm
);
397 static int s35390a_rtc_set_time(struct device
*dev
, struct rtc_time
*tm
)
399 return s35390a_set_datetime(to_i2c_client(dev
), tm
);
402 static const struct rtc_class_ops s35390a_rtc_ops
= {
403 .read_time
= s35390a_rtc_read_time
,
404 .set_time
= s35390a_rtc_set_time
,
405 .set_alarm
= s35390a_rtc_set_alarm
,
406 .read_alarm
= s35390a_rtc_read_alarm
,
410 static struct i2c_driver s35390a_driver
;
412 static int s35390a_probe(struct i2c_client
*client
,
413 const struct i2c_device_id
*id
)
417 struct s35390a
*s35390a
;
421 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
)) {
426 s35390a
= devm_kzalloc(&client
->dev
, sizeof(struct s35390a
),
433 s35390a
->client
[0] = client
;
434 i2c_set_clientdata(client
, s35390a
);
436 /* This chip uses multiple addresses, use dummy devices for them */
437 for (i
= 1; i
< 8; ++i
) {
438 s35390a
->client
[i
] = i2c_new_dummy(client
->adapter
,
440 if (!s35390a
->client
[i
]) {
441 dev_err(&client
->dev
, "Address %02x unavailable\n",
448 err_reset
= s35390a_reset(s35390a
, &status1
);
451 dev_err(&client
->dev
, "error resetting chip\n");
455 if (status1
& S35390A_FLAG_24H
)
456 s35390a
->twentyfourhour
= 1;
458 s35390a
->twentyfourhour
= 0;
460 if (status1
& S35390A_FLAG_INT2
) {
461 /* disable alarm (and maybe test mode) */
463 err
= s35390a_set_reg(s35390a
, S35390A_CMD_STATUS2
, &buf
, 1);
465 dev_err(&client
->dev
, "error disabling alarm");
469 err
= s35390a_disable_test_mode(s35390a
);
471 dev_err(&client
->dev
, "error disabling test mode\n");
476 if (err_reset
> 0 || s35390a_get_datetime(client
, &tm
) < 0)
477 dev_warn(&client
->dev
, "clock needs to be set\n");
479 device_set_wakeup_capable(&client
->dev
, 1);
481 s35390a
->rtc
= devm_rtc_device_register(&client
->dev
,
482 s35390a_driver
.driver
.name
,
483 &s35390a_rtc_ops
, THIS_MODULE
);
485 if (IS_ERR(s35390a
->rtc
)) {
486 err
= PTR_ERR(s35390a
->rtc
);
490 if (status1
& S35390A_FLAG_INT2
)
491 rtc_update_irq(s35390a
->rtc
, 1, RTC_AF
);
496 for (i
= 1; i
< 8; ++i
)
497 if (s35390a
->client
[i
])
498 i2c_unregister_device(s35390a
->client
[i
]);
504 static int s35390a_remove(struct i2c_client
*client
)
507 struct s35390a
*s35390a
= i2c_get_clientdata(client
);
509 for (i
= 1; i
< 8; ++i
)
510 if (s35390a
->client
[i
])
511 i2c_unregister_device(s35390a
->client
[i
]);
516 static struct i2c_driver s35390a_driver
= {
518 .name
= "rtc-s35390a",
520 .probe
= s35390a_probe
,
521 .remove
= s35390a_remove
,
522 .id_table
= s35390a_id
,
525 module_i2c_driver(s35390a_driver
);
527 MODULE_AUTHOR("Byron Bradley <byron.bbradley@gmail.com>");
528 MODULE_DESCRIPTION("S35390A RTC driver");
529 MODULE_LICENSE("GPL");