firewire: Implement gap count optimization.
[linux-2.6] / drivers / rtc / rtc-rs5c372.c
1 /*
2  * An I2C driver for Ricoh RS5C372 and RV5C38[67] RTCs
3  *
4  * Copyright (C) 2005 Pavel Mironchik <pmironchik@optifacio.net>
5  * Copyright (C) 2006 Tower Technologies
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11
12 #include <linux/i2c.h>
13 #include <linux/rtc.h>
14 #include <linux/bcd.h>
15
16 #define DRV_VERSION "0.4"
17
18 /* Addresses to scan */
19 static unsigned short normal_i2c[] = { /* 0x32,*/ I2C_CLIENT_END };
20
21 /* Insmod parameters */
22 I2C_CLIENT_INSMOD;
23
24
25 /*
26  * Ricoh has a family of I2C based RTCs, which differ only slightly from
27  * each other.  Differences center on pinout (e.g. how many interrupts,
28  * output clock, etc) and how the control registers are used.  The '372
29  * is significant only because that's the one this driver first supported.
30  */
31 #define RS5C372_REG_SECS        0
32 #define RS5C372_REG_MINS        1
33 #define RS5C372_REG_HOURS       2
34 #define RS5C372_REG_WDAY        3
35 #define RS5C372_REG_DAY         4
36 #define RS5C372_REG_MONTH       5
37 #define RS5C372_REG_YEAR        6
38 #define RS5C372_REG_TRIM        7
39 #       define RS5C372_TRIM_XSL         0x80
40 #       define RS5C372_TRIM_MASK        0x7F
41
42 #define RS5C_REG_ALARM_A_MIN    8                       /* or ALARM_W */
43 #define RS5C_REG_ALARM_A_HOURS  9
44 #define RS5C_REG_ALARM_A_WDAY   10
45
46 #define RS5C_REG_ALARM_B_MIN    11                      /* or ALARM_D */
47 #define RS5C_REG_ALARM_B_HOURS  12
48 #define RS5C_REG_ALARM_B_WDAY   13                      /* (ALARM_B only) */
49
50 #define RS5C_REG_CTRL1          14
51 #       define RS5C_CTRL1_AALE          (1 << 7)        /* or WALE */
52 #       define RS5C_CTRL1_BALE          (1 << 6)        /* or DALE */
53 #       define RV5C387_CTRL1_24         (1 << 5)
54 #       define RS5C372A_CTRL1_SL1       (1 << 5)
55 #       define RS5C_CTRL1_CT_MASK       (7 << 0)
56 #       define RS5C_CTRL1_CT0           (0 << 0)        /* no periodic irq */
57 #       define RS5C_CTRL1_CT4           (4 << 0)        /* 1 Hz level irq */
58 #define RS5C_REG_CTRL2          15
59 #       define RS5C372_CTRL2_24         (1 << 5)
60 #       define RS5C_CTRL2_XSTP          (1 << 4)
61 #       define RS5C_CTRL2_CTFG          (1 << 2)
62 #       define RS5C_CTRL2_AAFG          (1 << 1)        /* or WAFG */
63 #       define RS5C_CTRL2_BAFG          (1 << 0)        /* or DAFG */
64
65
66 /* to read (style 1) or write registers starting at R */
67 #define RS5C_ADDR(R)            (((R) << 4) | 0)
68
69
70 enum rtc_type {
71         rtc_undef = 0,
72         rtc_rs5c372a,
73         rtc_rs5c372b,
74         rtc_rv5c386,
75         rtc_rv5c387a,
76 };
77
78 /* REVISIT:  this assumes that:
79  *  - we're in the 21st century, so it's safe to ignore the century
80  *    bit for rv5c38[67] (REG_MONTH bit 7);
81  *  - we should use ALARM_A not ALARM_B (may be wrong on some boards)
82  */
83 struct rs5c372 {
84         struct i2c_client       *client;
85         struct rtc_device       *rtc;
86         enum rtc_type           type;
87         unsigned                time24:1;
88         unsigned                has_irq:1;
89         char                    buf[17];
90         char                    *regs;
91
92         /* on conversion to a "new style" i2c driver, this vanishes */
93         struct i2c_client       dev;
94 };
95
96 static int rs5c_get_regs(struct rs5c372 *rs5c)
97 {
98         struct i2c_client       *client = rs5c->client;
99         struct i2c_msg          msgs[] = {
100                 { client->addr, I2C_M_RD, sizeof rs5c->buf, rs5c->buf },
101         };
102
103         /* This implements the third reading method from the datasheet, using
104          * an internal address that's reset after each transaction (by STOP)
105          * to 0x0f ... so we read extra registers, and skip the first one.
106          *
107          * The first method doesn't work with the iop3xx adapter driver, on at
108          * least 80219 chips; this works around that bug.
109          */
110         if ((i2c_transfer(client->adapter, msgs, 1)) != 1) {
111                 pr_debug("%s: can't read registers\n", rs5c->rtc->name);
112                 return -EIO;
113         }
114
115         dev_dbg(&client->dev,
116                 "%02x %02x %02x (%02x) %02x %02x %02x (%02x), "
117                 "%02x %02x %02x, %02x %02x %02x; %02x %02x\n",
118                 rs5c->regs[0],  rs5c->regs[1],  rs5c->regs[2],  rs5c->regs[3],
119                 rs5c->regs[4],  rs5c->regs[5],  rs5c->regs[6],  rs5c->regs[7],
120                 rs5c->regs[8],  rs5c->regs[9],  rs5c->regs[10], rs5c->regs[11],
121                 rs5c->regs[12], rs5c->regs[13], rs5c->regs[14], rs5c->regs[15]);
122
123         return 0;
124 }
125
126 static unsigned rs5c_reg2hr(struct rs5c372 *rs5c, unsigned reg)
127 {
128         unsigned        hour;
129
130         if (rs5c->time24)
131                 return BCD2BIN(reg & 0x3f);
132
133         hour = BCD2BIN(reg & 0x1f);
134         if (hour == 12)
135                 hour = 0;
136         if (reg & 0x20)
137                 hour += 12;
138         return hour;
139 }
140
141 static unsigned rs5c_hr2reg(struct rs5c372 *rs5c, unsigned hour)
142 {
143         if (rs5c->time24)
144                 return BIN2BCD(hour);
145
146         if (hour > 12)
147                 return 0x20 | BIN2BCD(hour - 12);
148         if (hour == 12)
149                 return 0x20 | BIN2BCD(12);
150         if (hour == 0)
151                 return BIN2BCD(12);
152         return BIN2BCD(hour);
153 }
154
155 static int rs5c372_get_datetime(struct i2c_client *client, struct rtc_time *tm)
156 {
157         struct rs5c372  *rs5c = i2c_get_clientdata(client);
158         int             status = rs5c_get_regs(rs5c);
159
160         if (status < 0)
161                 return status;
162
163         tm->tm_sec = BCD2BIN(rs5c->regs[RS5C372_REG_SECS] & 0x7f);
164         tm->tm_min = BCD2BIN(rs5c->regs[RS5C372_REG_MINS] & 0x7f);
165         tm->tm_hour = rs5c_reg2hr(rs5c, rs5c->regs[RS5C372_REG_HOURS]);
166
167         tm->tm_wday = BCD2BIN(rs5c->regs[RS5C372_REG_WDAY] & 0x07);
168         tm->tm_mday = BCD2BIN(rs5c->regs[RS5C372_REG_DAY] & 0x3f);
169
170         /* tm->tm_mon is zero-based */
171         tm->tm_mon = BCD2BIN(rs5c->regs[RS5C372_REG_MONTH] & 0x1f) - 1;
172
173         /* year is 1900 + tm->tm_year */
174         tm->tm_year = BCD2BIN(rs5c->regs[RS5C372_REG_YEAR]) + 100;
175
176         dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
177                 "mday=%d, mon=%d, year=%d, wday=%d\n",
178                 __FUNCTION__,
179                 tm->tm_sec, tm->tm_min, tm->tm_hour,
180                 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
181
182         /* rtc might need initialization */
183         return rtc_valid_tm(tm);
184 }
185
186 static int rs5c372_set_datetime(struct i2c_client *client, struct rtc_time *tm)
187 {
188         struct rs5c372  *rs5c = i2c_get_clientdata(client);
189         unsigned char   buf[8];
190
191         dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d "
192                 "mday=%d, mon=%d, year=%d, wday=%d\n",
193                 __FUNCTION__,
194                 tm->tm_sec, tm->tm_min, tm->tm_hour,
195                 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
196
197         buf[0] = RS5C_ADDR(RS5C372_REG_SECS);
198         buf[1] = BIN2BCD(tm->tm_sec);
199         buf[2] = BIN2BCD(tm->tm_min);
200         buf[3] = rs5c_hr2reg(rs5c, tm->tm_hour);
201         buf[4] = BIN2BCD(tm->tm_wday);
202         buf[5] = BIN2BCD(tm->tm_mday);
203         buf[6] = BIN2BCD(tm->tm_mon + 1);
204         buf[7] = BIN2BCD(tm->tm_year - 100);
205
206         if ((i2c_master_send(client, buf, 8)) != 8) {
207                 dev_err(&client->dev, "%s: write error\n", __FUNCTION__);
208                 return -EIO;
209         }
210
211         return 0;
212 }
213
214 #if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE)
215 #define NEED_TRIM
216 #endif
217
218 #if defined(CONFIG_RTC_INTF_SYSFS) || defined(CONFIG_RTC_INTF_SYSFS_MODULE)
219 #define NEED_TRIM
220 #endif
221
222 #ifdef  NEED_TRIM
223 static int rs5c372_get_trim(struct i2c_client *client, int *osc, int *trim)
224 {
225         struct rs5c372 *rs5c372 = i2c_get_clientdata(client);
226         u8 tmp = rs5c372->regs[RS5C372_REG_TRIM];
227
228         if (osc)
229                 *osc = (tmp & RS5C372_TRIM_XSL) ? 32000 : 32768;
230
231         if (trim) {
232                 dev_dbg(&client->dev, "%s: raw trim=%x\n", __FUNCTION__, tmp);
233                 tmp &= RS5C372_TRIM_MASK;
234                 if (tmp & 0x3e) {
235                         int t = tmp & 0x3f;
236
237                         if (tmp & 0x40)
238                                 t = (~t | (s8)0xc0) + 1;
239                         else
240                                 t = t - 1;
241
242                         tmp = t * 2;
243                 } else
244                         tmp = 0;
245                 *trim = tmp;
246         }
247
248         return 0;
249 }
250 #endif
251
252 static int rs5c372_rtc_read_time(struct device *dev, struct rtc_time *tm)
253 {
254         return rs5c372_get_datetime(to_i2c_client(dev), tm);
255 }
256
257 static int rs5c372_rtc_set_time(struct device *dev, struct rtc_time *tm)
258 {
259         return rs5c372_set_datetime(to_i2c_client(dev), tm);
260 }
261
262 #if defined(CONFIG_RTC_INTF_DEV) || defined(CONFIG_RTC_INTF_DEV_MODULE)
263
264 static int
265 rs5c_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
266 {
267         struct i2c_client       *client = to_i2c_client(dev);
268         struct rs5c372          *rs5c = i2c_get_clientdata(client);
269         unsigned char           buf[2];
270         int                     status;
271
272         buf[1] = rs5c->regs[RS5C_REG_CTRL1];
273         switch (cmd) {
274         case RTC_UIE_OFF:
275         case RTC_UIE_ON:
276                 /* some 327a modes use a different IRQ pin for 1Hz irqs */
277                 if (rs5c->type == rtc_rs5c372a
278                                 && (buf[1] & RS5C372A_CTRL1_SL1))
279                         return -ENOIOCTLCMD;
280         case RTC_AIE_OFF:
281         case RTC_AIE_ON:
282                 /* these irq management calls only make sense for chips
283                  * which are wired up to an IRQ.
284                  */
285                 if (!rs5c->has_irq)
286                         return -ENOIOCTLCMD;
287                 break;
288         default:
289                 return -ENOIOCTLCMD;
290         }
291
292         status = rs5c_get_regs(rs5c);
293         if (status < 0)
294                 return status;
295
296         buf[0] = RS5C_ADDR(RS5C_REG_CTRL1);
297         switch (cmd) {
298         case RTC_AIE_OFF:       /* alarm off */
299                 buf[1] &= ~RS5C_CTRL1_AALE;
300                 break;
301         case RTC_AIE_ON:        /* alarm on */
302                 buf[1] |= RS5C_CTRL1_AALE;
303                 break;
304         case RTC_UIE_OFF:       /* update off */
305                 buf[1] &= ~RS5C_CTRL1_CT_MASK;
306                 break;
307         case RTC_UIE_ON:        /* update on */
308                 buf[1] &= ~RS5C_CTRL1_CT_MASK;
309                 buf[1] |= RS5C_CTRL1_CT4;
310                 break;
311         }
312         if ((i2c_master_send(client, buf, 2)) != 2) {
313                 printk(KERN_WARNING "%s: can't update alarm\n",
314                         rs5c->rtc->name);
315                 status = -EIO;
316         } else
317                 rs5c->regs[RS5C_REG_CTRL1] = buf[1];
318         return status;
319 }
320
321 #else
322 #define rs5c_rtc_ioctl  NULL
323 #endif
324
325
326 /* NOTE:  Since RTC_WKALM_{RD,SET} were originally defined for EFI,
327  * which only exposes a polled programming interface; and since
328  * these calls map directly to those EFI requests; we don't demand
329  * we have an IRQ for this chip when we go through this API.
330  *
331  * The older x86_pc derived RTC_ALM_{READ,SET} calls require irqs
332  * though, managed through RTC_AIE_{ON,OFF} requests.
333  */
334
335 static int rs5c_read_alarm(struct device *dev, struct rtc_wkalrm *t)
336 {
337         struct i2c_client       *client = to_i2c_client(dev);
338         struct rs5c372          *rs5c = i2c_get_clientdata(client);
339         int                     status;
340
341         status = rs5c_get_regs(rs5c);
342         if (status < 0)
343                 return status;
344
345         /* report alarm time */
346         t->time.tm_sec = 0;
347         t->time.tm_min = BCD2BIN(rs5c->regs[RS5C_REG_ALARM_A_MIN] & 0x7f);
348         t->time.tm_hour = rs5c_reg2hr(rs5c, rs5c->regs[RS5C_REG_ALARM_A_HOURS]);
349         t->time.tm_mday = -1;
350         t->time.tm_mon = -1;
351         t->time.tm_year = -1;
352         t->time.tm_wday = -1;
353         t->time.tm_yday = -1;
354         t->time.tm_isdst = -1;
355
356         /* ... and status */
357         t->enabled = !!(rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE);
358         t->pending = !!(rs5c->regs[RS5C_REG_CTRL2] & RS5C_CTRL2_AAFG);
359
360         return 0;
361 }
362
363 static int rs5c_set_alarm(struct device *dev, struct rtc_wkalrm *t)
364 {
365         struct i2c_client       *client = to_i2c_client(dev);
366         struct rs5c372          *rs5c = i2c_get_clientdata(client);
367         int                     status;
368         unsigned char           buf[4];
369
370         /* only handle up to 24 hours in the future, like RTC_ALM_SET */
371         if (t->time.tm_mday != -1
372                         || t->time.tm_mon != -1
373                         || t->time.tm_year != -1)
374                 return -EINVAL;
375
376         /* REVISIT: round up tm_sec */
377
378         /* if needed, disable irq (clears pending status) */
379         status = rs5c_get_regs(rs5c);
380         if (status < 0)
381                 return status;
382         if (rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE) {
383                 buf[0] = RS5C_ADDR(RS5C_REG_CTRL1);
384                 buf[1] = rs5c->regs[RS5C_REG_CTRL1] & ~RS5C_CTRL1_AALE;
385                 if (i2c_master_send(client, buf, 2) != 2) {
386                         pr_debug("%s: can't disable alarm\n", rs5c->rtc->name);
387                         return -EIO;
388                 }
389                 rs5c->regs[RS5C_REG_CTRL1] = buf[1];
390         }
391
392         /* set alarm */
393         buf[0] = RS5C_ADDR(RS5C_REG_ALARM_A_MIN);
394         buf[1] = BIN2BCD(t->time.tm_min);
395         buf[2] = rs5c_hr2reg(rs5c, t->time.tm_hour);
396         buf[3] = 0x7f;  /* any/all days */
397         if ((i2c_master_send(client, buf, 4)) != 4) {
398                 pr_debug("%s: can't set alarm time\n", rs5c->rtc->name);
399                 return -EIO;
400         }
401
402         /* ... and maybe enable its irq */
403         if (t->enabled) {
404                 buf[0] = RS5C_ADDR(RS5C_REG_CTRL1);
405                 buf[1] = rs5c->regs[RS5C_REG_CTRL1] | RS5C_CTRL1_AALE;
406                 if ((i2c_master_send(client, buf, 2)) != 2)
407                         printk(KERN_WARNING "%s: can't enable alarm\n",
408                                 rs5c->rtc->name);
409                 rs5c->regs[RS5C_REG_CTRL1] = buf[1];
410         }
411
412         return 0;
413 }
414
415 #if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE)
416
417 static int rs5c372_rtc_proc(struct device *dev, struct seq_file *seq)
418 {
419         int err, osc, trim;
420
421         err = rs5c372_get_trim(to_i2c_client(dev), &osc, &trim);
422         if (err == 0) {
423                 seq_printf(seq, "crystal\t\t: %d.%03d KHz\n",
424                                 osc / 1000, osc % 1000);
425                 seq_printf(seq, "trim\t\t: %d\n", trim);
426         }
427
428         return 0;
429 }
430
431 #else
432 #define rs5c372_rtc_proc        NULL
433 #endif
434
435 static const struct rtc_class_ops rs5c372_rtc_ops = {
436         .proc           = rs5c372_rtc_proc,
437         .ioctl          = rs5c_rtc_ioctl,
438         .read_time      = rs5c372_rtc_read_time,
439         .set_time       = rs5c372_rtc_set_time,
440         .read_alarm     = rs5c_read_alarm,
441         .set_alarm      = rs5c_set_alarm,
442 };
443
444 #if defined(CONFIG_RTC_INTF_SYSFS) || defined(CONFIG_RTC_INTF_SYSFS_MODULE)
445
446 static ssize_t rs5c372_sysfs_show_trim(struct device *dev,
447                                 struct device_attribute *attr, char *buf)
448 {
449         int err, trim;
450
451         err = rs5c372_get_trim(to_i2c_client(dev), NULL, &trim);
452         if (err)
453                 return err;
454
455         return sprintf(buf, "%d\n", trim);
456 }
457 static DEVICE_ATTR(trim, S_IRUGO, rs5c372_sysfs_show_trim, NULL);
458
459 static ssize_t rs5c372_sysfs_show_osc(struct device *dev,
460                                 struct device_attribute *attr, char *buf)
461 {
462         int err, osc;
463
464         err = rs5c372_get_trim(to_i2c_client(dev), &osc, NULL);
465         if (err)
466                 return err;
467
468         return sprintf(buf, "%d.%03d KHz\n", osc / 1000, osc % 1000);
469 }
470 static DEVICE_ATTR(osc, S_IRUGO, rs5c372_sysfs_show_osc, NULL);
471
472 static int rs5c_sysfs_register(struct device *dev)
473 {
474         int err;
475
476         err = device_create_file(dev, &dev_attr_trim);
477         if (err)
478                 return err;
479         err = device_create_file(dev, &dev_attr_osc);
480         if (err)
481                 device_remove_file(dev, &dev_attr_trim);
482
483         return err;
484 }
485
486 #else
487 static int rs5c_sysfs_register(struct device *dev)
488 {
489         return 0;
490 }
491 #endif  /* SYSFS */
492
493 static struct i2c_driver rs5c372_driver;
494
495 static int rs5c372_probe(struct i2c_adapter *adapter, int address, int kind)
496 {
497         int err = 0;
498         struct i2c_client *client;
499         struct rs5c372 *rs5c372;
500         struct rtc_time tm;
501
502         dev_dbg(&adapter->dev, "%s\n", __FUNCTION__);
503
504         if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
505                 err = -ENODEV;
506                 goto exit;
507         }
508
509         if (!(rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL))) {
510                 err = -ENOMEM;
511                 goto exit;
512         }
513
514         /* we read registers 0x0f then 0x00-0x0f; skip the first one */
515         rs5c372->regs=&rs5c372->buf[1];
516
517         /* On conversion to a "new style" i2c driver, we'll be handed
518          * the i2c_client (we won't create it)
519          */
520         client = &rs5c372->dev;
521         rs5c372->client = client;
522
523         /* I2C client */
524         client->addr = address;
525         client->driver = &rs5c372_driver;
526         client->adapter = adapter;
527
528         strlcpy(client->name, rs5c372_driver.driver.name, I2C_NAME_SIZE);
529
530         i2c_set_clientdata(client, rs5c372);
531
532         /* Inform the i2c layer */
533         if ((err = i2c_attach_client(client)))
534                 goto exit_kfree;
535
536         err = rs5c_get_regs(rs5c372);
537         if (err < 0)
538                 goto exit_detach;
539
540         /* For "new style" drivers, irq is in i2c_client and chip type
541          * info comes from i2c_client.dev.platform_data.  Meanwhile:
542          *
543          * STICK BOARD-SPECIFIC SETUP CODE RIGHT HERE
544          */
545         if (rs5c372->type == rtc_undef) {
546                 rs5c372->type = rtc_rs5c372b;
547                 dev_warn(&client->dev, "assuming rs5c372b\n");
548         }
549
550         /* clock may be set for am/pm or 24 hr time */
551         switch (rs5c372->type) {
552         case rtc_rs5c372a:
553         case rtc_rs5c372b:
554                 /* alarm uses ALARM_A; and nINTRA on 372a, nINTR on 372b.
555                  * so does periodic irq, except some 327a modes.
556                  */
557                 if (rs5c372->regs[RS5C_REG_CTRL2] & RS5C372_CTRL2_24)
558                         rs5c372->time24 = 1;
559                 break;
560         case rtc_rv5c386:
561         case rtc_rv5c387a:
562                 if (rs5c372->regs[RS5C_REG_CTRL1] & RV5C387_CTRL1_24)
563                         rs5c372->time24 = 1;
564                 /* alarm uses ALARM_W; and nINTRB for alarm and periodic
565                  * irq, on both 386 and 387
566                  */
567                 break;
568         default:
569                 dev_err(&client->dev, "unknown RTC type\n");
570                 goto exit_detach;
571         }
572
573         /* if the oscillator lost power and no other software (like
574          * the bootloader) set it up, do it here.
575          */
576         if (rs5c372->regs[RS5C_REG_CTRL2] & RS5C_CTRL2_XSTP) {
577                 unsigned char buf[3];
578
579                 rs5c372->regs[RS5C_REG_CTRL2] &= ~RS5C_CTRL2_XSTP;
580
581                 buf[0] = RS5C_ADDR(RS5C_REG_CTRL1);
582                 buf[1] = rs5c372->regs[RS5C_REG_CTRL1];
583                 buf[2] = rs5c372->regs[RS5C_REG_CTRL2];
584
585                 /* use 24hr mode */
586                 switch (rs5c372->type) {
587                 case rtc_rs5c372a:
588                 case rtc_rs5c372b:
589                         buf[2] |= RS5C372_CTRL2_24;
590                         rs5c372->time24 = 1;
591                         break;
592                 case rtc_rv5c386:
593                 case rtc_rv5c387a:
594                         buf[1] |= RV5C387_CTRL1_24;
595                         rs5c372->time24 = 1;
596                         break;
597                 default:
598                         /* impossible */
599                         break;
600                 }
601
602                 if ((i2c_master_send(client, buf, 3)) != 3) {
603                         dev_err(&client->dev, "setup error\n");
604                         goto exit_detach;
605                 }
606                 rs5c372->regs[RS5C_REG_CTRL1] = buf[1];
607                 rs5c372->regs[RS5C_REG_CTRL2] = buf[2];
608         }
609
610         if (rs5c372_get_datetime(client, &tm) < 0)
611                 dev_warn(&client->dev, "clock needs to be set\n");
612
613         dev_info(&client->dev, "%s found, %s, driver version " DRV_VERSION "\n",
614                         ({ char *s; switch (rs5c372->type) {
615                         case rtc_rs5c372a:      s = "rs5c372a"; break;
616                         case rtc_rs5c372b:      s = "rs5c372b"; break;
617                         case rtc_rv5c386:       s = "rv5c386"; break;
618                         case rtc_rv5c387a:      s = "rv5c387a"; break;
619                         default:                s = "chip"; break;
620                         }; s;}),
621                         rs5c372->time24 ? "24hr" : "am/pm"
622                         );
623
624         /* FIXME when client->irq exists, use it to register alarm irq */
625
626         rs5c372->rtc = rtc_device_register(rs5c372_driver.driver.name,
627                                 &client->dev, &rs5c372_rtc_ops, THIS_MODULE);
628
629         if (IS_ERR(rs5c372->rtc)) {
630                 err = PTR_ERR(rs5c372->rtc);
631                 goto exit_detach;
632         }
633
634         err = rs5c_sysfs_register(&client->dev);
635         if (err)
636                 goto exit_devreg;
637
638         return 0;
639
640 exit_devreg:
641         rtc_device_unregister(rs5c372->rtc);
642
643 exit_detach:
644         i2c_detach_client(client);
645
646 exit_kfree:
647         kfree(rs5c372);
648
649 exit:
650         return err;
651 }
652
653 static int rs5c372_attach(struct i2c_adapter *adapter)
654 {
655         return i2c_probe(adapter, &addr_data, rs5c372_probe);
656 }
657
658 static int rs5c372_detach(struct i2c_client *client)
659 {
660         int err;
661         struct rs5c372 *rs5c372 = i2c_get_clientdata(client);
662
663         if (rs5c372->rtc)
664                 rtc_device_unregister(rs5c372->rtc);
665
666         /* REVISIT properly destroy the sysfs files ... */
667
668         if ((err = i2c_detach_client(client)))
669                 return err;
670
671         kfree(rs5c372);
672         return 0;
673 }
674
675 static struct i2c_driver rs5c372_driver = {
676         .driver         = {
677                 .name   = "rtc-rs5c372",
678         },
679         .attach_adapter = &rs5c372_attach,
680         .detach_client  = &rs5c372_detach,
681 };
682
683 static __init int rs5c372_init(void)
684 {
685         return i2c_add_driver(&rs5c372_driver);
686 }
687
688 static __exit void rs5c372_exit(void)
689 {
690         i2c_del_driver(&rs5c372_driver);
691 }
692
693 module_init(rs5c372_init);
694 module_exit(rs5c372_exit);
695
696 MODULE_AUTHOR(
697                 "Pavel Mironchik <pmironchik@optifacio.net>, "
698                 "Alessandro Zummo <a.zummo@towertech.it>");
699 MODULE_DESCRIPTION("Ricoh RS5C372 RTC driver");
700 MODULE_LICENSE("GPL");
701 MODULE_VERSION(DRV_VERSION);