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.5" 17 18 19 /* 20 * Ricoh has a family of I2C based RTCs, which differ only slightly from 21 * each other. Differences center on pinout (e.g. how many interrupts, 22 * output clock, etc) and how the control registers are used. The '372 23 * is significant only because that's the one this driver first supported. 24 */ 25 #define RS5C372_REG_SECS 0 26 #define RS5C372_REG_MINS 1 27 #define RS5C372_REG_HOURS 2 28 #define RS5C372_REG_WDAY 3 29 #define RS5C372_REG_DAY 4 30 #define RS5C372_REG_MONTH 5 31 #define RS5C372_REG_YEAR 6 32 #define RS5C372_REG_TRIM 7 33 # define RS5C372_TRIM_XSL 0x80 34 # define RS5C372_TRIM_MASK 0x7F 35 36 #define RS5C_REG_ALARM_A_MIN 8 /* or ALARM_W */ 37 #define RS5C_REG_ALARM_A_HOURS 9 38 #define RS5C_REG_ALARM_A_WDAY 10 39 40 #define RS5C_REG_ALARM_B_MIN 11 /* or ALARM_D */ 41 #define RS5C_REG_ALARM_B_HOURS 12 42 #define RS5C_REG_ALARM_B_WDAY 13 /* (ALARM_B only) */ 43 44 #define RS5C_REG_CTRL1 14 45 # define RS5C_CTRL1_AALE (1 << 7) /* or WALE */ 46 # define RS5C_CTRL1_BALE (1 << 6) /* or DALE */ 47 # define RV5C387_CTRL1_24 (1 << 5) 48 # define RS5C372A_CTRL1_SL1 (1 << 5) 49 # define RS5C_CTRL1_CT_MASK (7 << 0) 50 # define RS5C_CTRL1_CT0 (0 << 0) /* no periodic irq */ 51 # define RS5C_CTRL1_CT4 (4 << 0) /* 1 Hz level irq */ 52 #define RS5C_REG_CTRL2 15 53 # define RS5C372_CTRL2_24 (1 << 5) 54 # define RS5C_CTRL2_XSTP (1 << 4) 55 # define RS5C_CTRL2_CTFG (1 << 2) 56 # define RS5C_CTRL2_AAFG (1 << 1) /* or WAFG */ 57 # define RS5C_CTRL2_BAFG (1 << 0) /* or DAFG */ 58 59 60 /* to read (style 1) or write registers starting at R */ 61 #define RS5C_ADDR(R) (((R) << 4) | 0) 62 63 64 enum rtc_type { 65 rtc_undef = 0, 66 rtc_rs5c372a, 67 rtc_rs5c372b, 68 rtc_rv5c386, 69 rtc_rv5c387a, 70 }; 71 72 static const struct i2c_device_id rs5c372_id[] = { 73 { "rs5c372a", rtc_rs5c372a }, 74 { "rs5c372b", rtc_rs5c372b }, 75 { "rv5c386", rtc_rv5c386 }, 76 { "rv5c387a", rtc_rv5c387a }, 77 { } 78 }; 79 MODULE_DEVICE_TABLE(i2c, rs5c372_id); 80 81 /* REVISIT: this assumes that: 82 * - we're in the 21st century, so it's safe to ignore the century 83 * bit for rv5c38[67] (REG_MONTH bit 7); 84 * - we should use ALARM_A not ALARM_B (may be wrong on some boards) 85 */ 86 struct rs5c372 { 87 struct i2c_client *client; 88 struct rtc_device *rtc; 89 enum rtc_type type; 90 unsigned time24:1; 91 unsigned has_irq:1; 92 char buf[17]; 93 char *regs; 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 dev_warn(&client->dev, "can't read registers\n"); 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 __func__, 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 __func__, 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", __func__); 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", __func__, 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 static void rs5c_sysfs_unregister(struct device *dev) 487 { 488 device_remove_file(dev, &dev_attr_trim); 489 device_remove_file(dev, &dev_attr_osc); 490 } 491 492 #else 493 static int rs5c_sysfs_register(struct device *dev) 494 { 495 return 0; 496 } 497 498 static void rs5c_sysfs_unregister(struct device *dev) 499 { 500 /* nothing */ 501 } 502 #endif /* SYSFS */ 503 504 static struct i2c_driver rs5c372_driver; 505 506 static int rs5c372_probe(struct i2c_client *client, 507 const struct i2c_device_id *id) 508 { 509 int err = 0; 510 struct rs5c372 *rs5c372; 511 struct rtc_time tm; 512 513 dev_dbg(&client->dev, "%s\n", __func__); 514 515 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 516 err = -ENODEV; 517 goto exit; 518 } 519 520 if (!(rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL))) { 521 err = -ENOMEM; 522 goto exit; 523 } 524 525 rs5c372->client = client; 526 i2c_set_clientdata(client, rs5c372); 527 rs5c372->type = id->driver_data; 528 529 /* we read registers 0x0f then 0x00-0x0f; skip the first one */ 530 rs5c372->regs = &rs5c372->buf[1]; 531 532 err = rs5c_get_regs(rs5c372); 533 if (err < 0) 534 goto exit_kfree; 535 536 /* clock may be set for am/pm or 24 hr time */ 537 switch (rs5c372->type) { 538 case rtc_rs5c372a: 539 case rtc_rs5c372b: 540 /* alarm uses ALARM_A; and nINTRA on 372a, nINTR on 372b. 541 * so does periodic irq, except some 327a modes. 542 */ 543 if (rs5c372->regs[RS5C_REG_CTRL2] & RS5C372_CTRL2_24) 544 rs5c372->time24 = 1; 545 break; 546 case rtc_rv5c386: 547 case rtc_rv5c387a: 548 if (rs5c372->regs[RS5C_REG_CTRL1] & RV5C387_CTRL1_24) 549 rs5c372->time24 = 1; 550 /* alarm uses ALARM_W; and nINTRB for alarm and periodic 551 * irq, on both 386 and 387 552 */ 553 break; 554 default: 555 dev_err(&client->dev, "unknown RTC type\n"); 556 goto exit_kfree; 557 } 558 559 /* if the oscillator lost power and no other software (like 560 * the bootloader) set it up, do it here. 561 */ 562 if (rs5c372->regs[RS5C_REG_CTRL2] & RS5C_CTRL2_XSTP) { 563 unsigned char buf[3]; 564 565 rs5c372->regs[RS5C_REG_CTRL2] &= ~RS5C_CTRL2_XSTP; 566 567 buf[0] = RS5C_ADDR(RS5C_REG_CTRL1); 568 buf[1] = rs5c372->regs[RS5C_REG_CTRL1]; 569 buf[2] = rs5c372->regs[RS5C_REG_CTRL2]; 570 571 /* use 24hr mode */ 572 switch (rs5c372->type) { 573 case rtc_rs5c372a: 574 case rtc_rs5c372b: 575 buf[2] |= RS5C372_CTRL2_24; 576 rs5c372->time24 = 1; 577 break; 578 case rtc_rv5c386: 579 case rtc_rv5c387a: 580 buf[1] |= RV5C387_CTRL1_24; 581 rs5c372->time24 = 1; 582 break; 583 default: 584 /* impossible */ 585 break; 586 } 587 588 if ((i2c_master_send(client, buf, 3)) != 3) { 589 dev_err(&client->dev, "setup error\n"); 590 goto exit_kfree; 591 } 592 rs5c372->regs[RS5C_REG_CTRL1] = buf[1]; 593 rs5c372->regs[RS5C_REG_CTRL2] = buf[2]; 594 } 595 596 if (rs5c372_get_datetime(client, &tm) < 0) 597 dev_warn(&client->dev, "clock needs to be set\n"); 598 599 dev_info(&client->dev, "%s found, %s, driver version " DRV_VERSION "\n", 600 ({ char *s; switch (rs5c372->type) { 601 case rtc_rs5c372a: s = "rs5c372a"; break; 602 case rtc_rs5c372b: s = "rs5c372b"; break; 603 case rtc_rv5c386: s = "rv5c386"; break; 604 case rtc_rv5c387a: s = "rv5c387a"; break; 605 default: s = "chip"; break; 606 }; s;}), 607 rs5c372->time24 ? "24hr" : "am/pm" 608 ); 609 610 /* REVISIT use client->irq to register alarm irq ... */ 611 612 rs5c372->rtc = rtc_device_register(rs5c372_driver.driver.name, 613 &client->dev, &rs5c372_rtc_ops, THIS_MODULE); 614 615 if (IS_ERR(rs5c372->rtc)) { 616 err = PTR_ERR(rs5c372->rtc); 617 goto exit_kfree; 618 } 619 620 err = rs5c_sysfs_register(&client->dev); 621 if (err) 622 goto exit_devreg; 623 624 return 0; 625 626 exit_devreg: 627 rtc_device_unregister(rs5c372->rtc); 628 629 exit_kfree: 630 kfree(rs5c372); 631 632 exit: 633 return err; 634 } 635 636 static int rs5c372_remove(struct i2c_client *client) 637 { 638 struct rs5c372 *rs5c372 = i2c_get_clientdata(client); 639 640 rtc_device_unregister(rs5c372->rtc); 641 rs5c_sysfs_unregister(&client->dev); 642 kfree(rs5c372); 643 return 0; 644 } 645 646 static struct i2c_driver rs5c372_driver = { 647 .driver = { 648 .name = "rtc-rs5c372", 649 }, 650 .probe = rs5c372_probe, 651 .remove = rs5c372_remove, 652 .id_table = rs5c372_id, 653 }; 654 655 static __init int rs5c372_init(void) 656 { 657 return i2c_add_driver(&rs5c372_driver); 658 } 659 660 static __exit void rs5c372_exit(void) 661 { 662 i2c_del_driver(&rs5c372_driver); 663 } 664 665 module_init(rs5c372_init); 666 module_exit(rs5c372_exit); 667 668 MODULE_AUTHOR( 669 "Pavel Mironchik <pmironchik@optifacio.net>, " 670 "Alessandro Zummo <a.zummo@towertech.it>"); 671 MODULE_DESCRIPTION("Ricoh RS5C372 RTC driver"); 672 MODULE_LICENSE("GPL"); 673 MODULE_VERSION(DRV_VERSION); 674