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); 702