2  * An I2C driver for Ricoh RS5C372 and RV5C38[67] RTCs
 
   4  * Copyright (C) 2005 Pavel Mironchik <pmironchik@optifacio.net>
 
   5  * Copyright (C) 2006 Tower Technologies
 
   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.
 
  12 #include <linux/i2c.h>
 
  13 #include <linux/rtc.h>
 
  14 #include <linux/bcd.h>
 
  16 #define DRV_VERSION "0.5"
 
  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.
 
  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
 
  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
 
  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) */
 
  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 */
 
  60 /* to read (style 1) or write registers starting at R */
 
  61 #define RS5C_ADDR(R)            (((R) << 4) | 0)
 
  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 },
 
  79 MODULE_DEVICE_TABLE(i2c, rs5c372_id);
 
  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)
 
  87         struct i2c_client       *client;
 
  88         struct rtc_device       *rtc;
 
  96 static int rs5c_get_regs(struct rs5c372 *rs5c)
 
  98         struct i2c_client       *client = rs5c->client;
 
  99         struct i2c_msg          msgs[] = {
 
 100                 { client->addr, I2C_M_RD, sizeof rs5c->buf, rs5c->buf },
 
 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.
 
 107          * The first method doesn't work with the iop3xx adapter driver, on at
 
 108          * least 80219 chips; this works around that bug.
 
 110         if ((i2c_transfer(client->adapter, msgs, 1)) != 1) {
 
 111                 dev_warn(&client->dev, "can't read registers\n");
 
 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]);
 
 126 static unsigned rs5c_reg2hr(struct rs5c372 *rs5c, unsigned reg)
 
 131                 return BCD2BIN(reg & 0x3f);
 
 133         hour = BCD2BIN(reg & 0x1f);
 
 141 static unsigned rs5c_hr2reg(struct rs5c372 *rs5c, unsigned hour)
 
 144                 return BIN2BCD(hour);
 
 147                 return 0x20 | BIN2BCD(hour - 12);
 
 149                 return 0x20 | BIN2BCD(12);
 
 152         return BIN2BCD(hour);
 
 155 static int rs5c372_get_datetime(struct i2c_client *client, struct rtc_time *tm)
 
 157         struct rs5c372  *rs5c = i2c_get_clientdata(client);
 
 158         int             status = rs5c_get_regs(rs5c);
 
 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]);
 
 167         tm->tm_wday = BCD2BIN(rs5c->regs[RS5C372_REG_WDAY] & 0x07);
 
 168         tm->tm_mday = BCD2BIN(rs5c->regs[RS5C372_REG_DAY] & 0x3f);
 
 170         /* tm->tm_mon is zero-based */
 
 171         tm->tm_mon = BCD2BIN(rs5c->regs[RS5C372_REG_MONTH] & 0x1f) - 1;
 
 173         /* year is 1900 + tm->tm_year */
 
 174         tm->tm_year = BCD2BIN(rs5c->regs[RS5C372_REG_YEAR]) + 100;
 
 176         dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
 
 177                 "mday=%d, mon=%d, year=%d, wday=%d\n",
 
 179                 tm->tm_sec, tm->tm_min, tm->tm_hour,
 
 180                 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
 
 182         /* rtc might need initialization */
 
 183         return rtc_valid_tm(tm);
 
 186 static int rs5c372_set_datetime(struct i2c_client *client, struct rtc_time *tm)
 
 188         struct rs5c372  *rs5c = i2c_get_clientdata(client);
 
 189         unsigned char   buf[8];
 
 191         dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d "
 
 192                 "mday=%d, mon=%d, year=%d, wday=%d\n",
 
 194                 tm->tm_sec, tm->tm_min, tm->tm_hour,
 
 195                 tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
 
 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);
 
 206         if ((i2c_master_send(client, buf, 8)) != 8) {
 
 207                 dev_err(&client->dev, "%s: write error\n", __func__);
 
 214 #if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE)
 
 218 #if defined(CONFIG_RTC_INTF_SYSFS) || defined(CONFIG_RTC_INTF_SYSFS_MODULE)
 
 223 static int rs5c372_get_trim(struct i2c_client *client, int *osc, int *trim)
 
 225         struct rs5c372 *rs5c372 = i2c_get_clientdata(client);
 
 226         u8 tmp = rs5c372->regs[RS5C372_REG_TRIM];
 
 229                 *osc = (tmp & RS5C372_TRIM_XSL) ? 32000 : 32768;
 
 232                 dev_dbg(&client->dev, "%s: raw trim=%x\n", __func__, tmp);
 
 233                 tmp &= RS5C372_TRIM_MASK;
 
 238                                 t = (~t | (s8)0xc0) + 1;
 
 252 static int rs5c372_rtc_read_time(struct device *dev, struct rtc_time *tm)
 
 254         return rs5c372_get_datetime(to_i2c_client(dev), tm);
 
 257 static int rs5c372_rtc_set_time(struct device *dev, struct rtc_time *tm)
 
 259         return rs5c372_set_datetime(to_i2c_client(dev), tm);
 
 262 #if defined(CONFIG_RTC_INTF_DEV) || defined(CONFIG_RTC_INTF_DEV_MODULE)
 
 265 rs5c_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
 
 267         struct i2c_client       *client = to_i2c_client(dev);
 
 268         struct rs5c372          *rs5c = i2c_get_clientdata(client);
 
 269         unsigned char           buf[2];
 
 272         buf[1] = rs5c->regs[RS5C_REG_CTRL1];
 
 276                 /* some 327a modes use a different IRQ pin for 1Hz irqs */
 
 277                 if (rs5c->type == rtc_rs5c372a
 
 278                                 && (buf[1] & RS5C372A_CTRL1_SL1))
 
 282                 /* these irq management calls only make sense for chips
 
 283                  * which are wired up to an IRQ.
 
 292         status = rs5c_get_regs(rs5c);
 
 296         buf[0] = RS5C_ADDR(RS5C_REG_CTRL1);
 
 298         case RTC_AIE_OFF:       /* alarm off */
 
 299                 buf[1] &= ~RS5C_CTRL1_AALE;
 
 301         case RTC_AIE_ON:        /* alarm on */
 
 302                 buf[1] |= RS5C_CTRL1_AALE;
 
 304         case RTC_UIE_OFF:       /* update off */
 
 305                 buf[1] &= ~RS5C_CTRL1_CT_MASK;
 
 307         case RTC_UIE_ON:        /* update on */
 
 308                 buf[1] &= ~RS5C_CTRL1_CT_MASK;
 
 309                 buf[1] |= RS5C_CTRL1_CT4;
 
 312         if ((i2c_master_send(client, buf, 2)) != 2) {
 
 313                 printk(KERN_WARNING "%s: can't update alarm\n",
 
 317                 rs5c->regs[RS5C_REG_CTRL1] = buf[1];
 
 322 #define rs5c_rtc_ioctl  NULL
 
 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.
 
 331  * The older x86_pc derived RTC_ALM_{READ,SET} calls require irqs
 
 332  * though, managed through RTC_AIE_{ON,OFF} requests.
 
 335 static int rs5c_read_alarm(struct device *dev, struct rtc_wkalrm *t)
 
 337         struct i2c_client       *client = to_i2c_client(dev);
 
 338         struct rs5c372          *rs5c = i2c_get_clientdata(client);
 
 341         status = rs5c_get_regs(rs5c);
 
 345         /* report alarm time */
 
 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;
 
 351         t->time.tm_year = -1;
 
 352         t->time.tm_wday = -1;
 
 353         t->time.tm_yday = -1;
 
 354         t->time.tm_isdst = -1;
 
 357         t->enabled = !!(rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE);
 
 358         t->pending = !!(rs5c->regs[RS5C_REG_CTRL2] & RS5C_CTRL2_AAFG);
 
 363 static int rs5c_set_alarm(struct device *dev, struct rtc_wkalrm *t)
 
 365         struct i2c_client       *client = to_i2c_client(dev);
 
 366         struct rs5c372          *rs5c = i2c_get_clientdata(client);
 
 368         unsigned char           buf[4];
 
 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)
 
 376         /* REVISIT: round up tm_sec */
 
 378         /* if needed, disable irq (clears pending status) */
 
 379         status = rs5c_get_regs(rs5c);
 
 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);
 
 389                 rs5c->regs[RS5C_REG_CTRL1] = buf[1];
 
 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);
 
 402         /* ... and maybe enable its irq */
 
 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",
 
 409                 rs5c->regs[RS5C_REG_CTRL1] = buf[1];
 
 415 #if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE)
 
 417 static int rs5c372_rtc_proc(struct device *dev, struct seq_file *seq)
 
 421         err = rs5c372_get_trim(to_i2c_client(dev), &osc, &trim);
 
 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);
 
 432 #define rs5c372_rtc_proc        NULL
 
 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,
 
 444 #if defined(CONFIG_RTC_INTF_SYSFS) || defined(CONFIG_RTC_INTF_SYSFS_MODULE)
 
 446 static ssize_t rs5c372_sysfs_show_trim(struct device *dev,
 
 447                                 struct device_attribute *attr, char *buf)
 
 451         err = rs5c372_get_trim(to_i2c_client(dev), NULL, &trim);
 
 455         return sprintf(buf, "%d\n", trim);
 
 457 static DEVICE_ATTR(trim, S_IRUGO, rs5c372_sysfs_show_trim, NULL);
 
 459 static ssize_t rs5c372_sysfs_show_osc(struct device *dev,
 
 460                                 struct device_attribute *attr, char *buf)
 
 464         err = rs5c372_get_trim(to_i2c_client(dev), &osc, NULL);
 
 468         return sprintf(buf, "%d.%03d KHz\n", osc / 1000, osc % 1000);
 
 470 static DEVICE_ATTR(osc, S_IRUGO, rs5c372_sysfs_show_osc, NULL);
 
 472 static int rs5c_sysfs_register(struct device *dev)
 
 476         err = device_create_file(dev, &dev_attr_trim);
 
 479         err = device_create_file(dev, &dev_attr_osc);
 
 481                 device_remove_file(dev, &dev_attr_trim);
 
 486 static void rs5c_sysfs_unregister(struct device *dev)
 
 488         device_remove_file(dev, &dev_attr_trim);
 
 489         device_remove_file(dev, &dev_attr_osc);
 
 493 static int rs5c_sysfs_register(struct device *dev)
 
 498 static void rs5c_sysfs_unregister(struct device *dev)
 
 504 static struct i2c_driver rs5c372_driver;
 
 506 static int rs5c372_probe(struct i2c_client *client,
 
 507                          const struct i2c_device_id *id)
 
 510         struct rs5c372 *rs5c372;
 
 513         dev_dbg(&client->dev, "%s\n", __func__);
 
 515         if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
 
 520         if (!(rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL))) {
 
 525         rs5c372->client = client;
 
 526         i2c_set_clientdata(client, rs5c372);
 
 527         rs5c372->type = id->driver_data;
 
 529         /* we read registers 0x0f then 0x00-0x0f; skip the first one */
 
 530         rs5c372->regs = &rs5c372->buf[1];
 
 532         err = rs5c_get_regs(rs5c372);
 
 536         /* clock may be set for am/pm or 24 hr time */
 
 537         switch (rs5c372->type) {
 
 540                 /* alarm uses ALARM_A; and nINTRA on 372a, nINTR on 372b.
 
 541                  * so does periodic irq, except some 327a modes.
 
 543                 if (rs5c372->regs[RS5C_REG_CTRL2] & RS5C372_CTRL2_24)
 
 548                 if (rs5c372->regs[RS5C_REG_CTRL1] & RV5C387_CTRL1_24)
 
 550                 /* alarm uses ALARM_W; and nINTRB for alarm and periodic
 
 551                  * irq, on both 386 and 387
 
 555                 dev_err(&client->dev, "unknown RTC type\n");
 
 559         /* if the oscillator lost power and no other software (like
 
 560          * the bootloader) set it up, do it here.
 
 562         if (rs5c372->regs[RS5C_REG_CTRL2] & RS5C_CTRL2_XSTP) {
 
 563                 unsigned char buf[3];
 
 565                 rs5c372->regs[RS5C_REG_CTRL2] &= ~RS5C_CTRL2_XSTP;
 
 567                 buf[0] = RS5C_ADDR(RS5C_REG_CTRL1);
 
 568                 buf[1] = rs5c372->regs[RS5C_REG_CTRL1];
 
 569                 buf[2] = rs5c372->regs[RS5C_REG_CTRL2];
 
 572                 switch (rs5c372->type) {
 
 575                         buf[2] |= RS5C372_CTRL2_24;
 
 580                         buf[1] |= RV5C387_CTRL1_24;
 
 588                 if ((i2c_master_send(client, buf, 3)) != 3) {
 
 589                         dev_err(&client->dev, "setup error\n");
 
 592                 rs5c372->regs[RS5C_REG_CTRL1] = buf[1];
 
 593                 rs5c372->regs[RS5C_REG_CTRL2] = buf[2];
 
 596         if (rs5c372_get_datetime(client, &tm) < 0)
 
 597                 dev_warn(&client->dev, "clock needs to be set\n");
 
 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;
 
 607                         rs5c372->time24 ? "24hr" : "am/pm"
 
 610         /* REVISIT use client->irq to register alarm irq ... */
 
 612         rs5c372->rtc = rtc_device_register(rs5c372_driver.driver.name,
 
 613                                 &client->dev, &rs5c372_rtc_ops, THIS_MODULE);
 
 615         if (IS_ERR(rs5c372->rtc)) {
 
 616                 err = PTR_ERR(rs5c372->rtc);
 
 620         err = rs5c_sysfs_register(&client->dev);
 
 627         rtc_device_unregister(rs5c372->rtc);
 
 636 static int rs5c372_remove(struct i2c_client *client)
 
 638         struct rs5c372 *rs5c372 = i2c_get_clientdata(client);
 
 640         rtc_device_unregister(rs5c372->rtc);
 
 641         rs5c_sysfs_unregister(&client->dev);
 
 646 static struct i2c_driver rs5c372_driver = {
 
 648                 .name   = "rtc-rs5c372",
 
 650         .probe          = rs5c372_probe,
 
 651         .remove         = rs5c372_remove,
 
 652         .id_table       = rs5c372_id,
 
 655 static __init int rs5c372_init(void)
 
 657         return i2c_add_driver(&rs5c372_driver);
 
 660 static __exit void rs5c372_exit(void)
 
 662         i2c_del_driver(&rs5c372_driver);
 
 665 module_init(rs5c372_init);
 
 666 module_exit(rs5c372_exit);
 
 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);