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 */ 19static unsigned short normal_i2c[] = { /* 0x32,*/ I2C_CLIENT_END }; 20 21/* Insmod parameters */ 22I2C_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 70enum 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 */ 83struct 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 96static 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 126static 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 141static 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 155static 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 186static 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 223static 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 252static 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 257static 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 264static int 265rs5c_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 335static 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 363static 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 417static 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 435static 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 446static 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} 457static DEVICE_ATTR(trim, S_IRUGO, rs5c372_sysfs_show_trim, NULL); 458 459static 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} 470static DEVICE_ATTR(osc, S_IRUGO, rs5c372_sysfs_show_osc, NULL); 471 472static 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 487static int rs5c_sysfs_register(struct device *dev) 488{ 489 return 0; 490} 491#endif /* SYSFS */ 492 493static struct i2c_driver rs5c372_driver; 494 495static 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 625 rs5c372->rtc = rtc_device_register(rs5c372_driver.driver.name, 626 &client->dev, &rs5c372_rtc_ops, THIS_MODULE); 627 628 if (IS_ERR(rs5c372->rtc)) { 629 err = PTR_ERR(rs5c372->rtc); 630 goto exit_detach; 631 } 632 633 err = rs5c_sysfs_register(&client->dev); 634 if (err) 635 goto exit_devreg; 636 637 return 0; 638 639exit_devreg: 640 rtc_device_unregister(rs5c372->rtc); 641 642exit_detach: 643 i2c_detach_client(client); 644 645exit_kfree: 646 kfree(rs5c372); 647 648exit: 649 return err; 650} 651 652static int rs5c372_attach(struct i2c_adapter *adapter) 653{ 654 return i2c_probe(adapter, &addr_data, rs5c372_probe); 655} 656 657static int rs5c372_detach(struct i2c_client *client) 658{ 659 int err; 660 struct rs5c372 *rs5c372 = i2c_get_clientdata(client); 661 662 if (rs5c372->rtc) 663 rtc_device_unregister(rs5c372->rtc); 664 665 /* REVISIT properly destroy the sysfs files ... */ 666 667 if ((err = i2c_detach_client(client))) 668 return err; 669 670 kfree(rs5c372); 671 return 0; 672} 673 674static struct i2c_driver rs5c372_driver = { 675 .driver = { 676 .name = "rtc-rs5c372", 677 }, 678 .attach_adapter = &rs5c372_attach, 679 .detach_client = &rs5c372_detach, 680}; 681 682static __init int rs5c372_init(void) 683{ 684 return i2c_add_driver(&rs5c372_driver); 685} 686 687static __exit void rs5c372_exit(void) 688{ 689 i2c_del_driver(&rs5c372_driver); 690} 691 692module_init(rs5c372_init); 693module_exit(rs5c372_exit); 694 695MODULE_AUTHOR( 696 "Pavel Mironchik <pmironchik@optifacio.net>, " 697 "Alessandro Zummo <a.zummo@towertech.it>"); 698MODULE_DESCRIPTION("Ricoh RS5C372 RTC driver"); 699MODULE_LICENSE("GPL"); 700MODULE_VERSION(DRV_VERSION); 701