1/* 2 * rtc-ds1307.c - RTC driver for some mostly-compatible I2C chips. 3 * 4 * Copyright (C) 2005 James Chapman (ds1337 core) 5 * Copyright (C) 2006 David Brownell 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/module.h> 13#include <linux/init.h> 14#include <linux/slab.h> 15#include <linux/i2c.h> 16#include <linux/string.h> 17#include <linux/rtc.h> 18#include <linux/bcd.h> 19 20 21 22/* We can't determine type by probing, but if we expect pre-Linux code 23 * to have set the chip up as a clock (turning on the oscillator and 24 * setting the date and time), Linux can ignore the non-clock features. 25 * That's a natural job for a factory or repair bench. 26 * 27 * If the I2C "force" mechanism is used, we assume the chip is a ds1337. 28 * (Much better would be board-specific tables of I2C devices, along with 29 * the platform_data drivers would use to sort such issues out.) 30 */ 31enum ds_type { 32 unknown = 0, 33 ds_1307, /* or ds1338, ... */ 34 ds_1337, /* or ds1339, ... */ 35 ds_1340, /* or st m41t00, ... */ 36 // rs5c372 too? different address... 37}; 38 39static unsigned short normal_i2c[] = { 0x68, I2C_CLIENT_END }; 40 41I2C_CLIENT_INSMOD; 42 43 44 45/* RTC registers don't differ much, except for the century flag */ 46#define DS1307_REG_SECS 0x00 /* 00-59 */ 47# define DS1307_BIT_CH 0x80 48#define DS1307_REG_MIN 0x01 /* 00-59 */ 49#define DS1307_REG_HOUR 0x02 /* 00-23, or 1-12{am,pm} */ 50# define DS1340_BIT_CENTURY_EN 0x80 /* in REG_HOUR */ 51# define DS1340_BIT_CENTURY 0x40 /* in REG_HOUR */ 52#define DS1307_REG_WDAY 0x03 /* 01-07 */ 53#define DS1307_REG_MDAY 0x04 /* 01-31 */ 54#define DS1307_REG_MONTH 0x05 /* 01-12 */ 55# define DS1337_BIT_CENTURY 0x80 /* in REG_MONTH */ 56#define DS1307_REG_YEAR 0x06 /* 00-99 */ 57 58/* Other registers (control, status, alarms, trickle charge, NVRAM, etc) 59 * start at 7, and they differ a lot. Only control and status matter for RTC; 60 * be careful using them. 61 */ 62#define DS1307_REG_CONTROL 0x07 63# define DS1307_BIT_OUT 0x80 64# define DS1307_BIT_SQWE 0x10 65# define DS1307_BIT_RS1 0x02 66# define DS1307_BIT_RS0 0x01 67#define DS1337_REG_CONTROL 0x0e 68# define DS1337_BIT_nEOSC 0x80 69# define DS1337_BIT_RS2 0x10 70# define DS1337_BIT_RS1 0x08 71# define DS1337_BIT_INTCN 0x04 72# define DS1337_BIT_A2IE 0x02 73# define DS1337_BIT_A1IE 0x01 74#define DS1337_REG_STATUS 0x0f 75# define DS1337_BIT_OSF 0x80 76# define DS1337_BIT_A2I 0x02 77# define DS1337_BIT_A1I 0x01 78#define DS1339_REG_TRICKLE 0x10 79 80 81 82struct ds1307 { 83 u8 reg_addr; 84 u8 regs[8]; 85 enum ds_type type; 86 struct i2c_msg msg[2]; 87 struct i2c_client client; 88 struct rtc_device *rtc; 89}; 90 91 92static int ds1307_get_time(struct device *dev, struct rtc_time *t) 93{ 94 struct ds1307 *ds1307 = dev_get_drvdata(dev); 95 int tmp; 96 97 /* read the RTC registers all at once */ 98 ds1307->msg[1].flags = I2C_M_RD; 99 ds1307->msg[1].len = 7; 100 101 tmp = i2c_transfer(ds1307->client.adapter, ds1307->msg, 2); 102 if (tmp != 2) { 103 dev_err(dev, "%s error %d\n", "read", tmp); 104 return -EIO; 105 } 106 107 dev_dbg(dev, "%s: %02x %02x %02x %02x %02x %02x %02x\n", 108 "read", 109 ds1307->regs[0], ds1307->regs[1], 110 ds1307->regs[2], ds1307->regs[3], 111 ds1307->regs[4], ds1307->regs[5], 112 ds1307->regs[6]); 113 114 t->tm_sec = BCD2BIN(ds1307->regs[DS1307_REG_SECS] & 0x7f); 115 t->tm_min = BCD2BIN(ds1307->regs[DS1307_REG_MIN] & 0x7f); 116 tmp = ds1307->regs[DS1307_REG_HOUR] & 0x3f; 117 t->tm_hour = BCD2BIN(tmp); 118 t->tm_wday = BCD2BIN(ds1307->regs[DS1307_REG_WDAY] & 0x07) - 1; 119 t->tm_mday = BCD2BIN(ds1307->regs[DS1307_REG_MDAY] & 0x3f); 120 tmp = ds1307->regs[DS1307_REG_MONTH] & 0x1f; 121 t->tm_mon = BCD2BIN(tmp) - 1; 122 123 /* assume 20YY not 19YY, and ignore DS1337_BIT_CENTURY */ 124 t->tm_year = BCD2BIN(ds1307->regs[DS1307_REG_YEAR]) + 100; 125 126 dev_dbg(dev, "%s secs=%d, mins=%d, " 127 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", 128 "read", t->tm_sec, t->tm_min, 129 t->tm_hour, t->tm_mday, 130 t->tm_mon, t->tm_year, t->tm_wday); 131 132 return 0; 133} 134 135static int ds1307_set_time(struct device *dev, struct rtc_time *t) 136{ 137 struct ds1307 *ds1307 = dev_get_drvdata(dev); 138 int result; 139 int tmp; 140 u8 *buf = ds1307->regs; 141 142 dev_dbg(dev, "%s secs=%d, mins=%d, " 143 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", 144 "write", t->tm_sec, t->tm_min, 145 t->tm_hour, t->tm_mday, 146 t->tm_mon, t->tm_year, t->tm_wday); 147 148 *buf++ = 0; /* first register addr */ 149 buf[DS1307_REG_SECS] = BIN2BCD(t->tm_sec); 150 buf[DS1307_REG_MIN] = BIN2BCD(t->tm_min); 151 buf[DS1307_REG_HOUR] = BIN2BCD(t->tm_hour); 152 buf[DS1307_REG_WDAY] = BIN2BCD(t->tm_wday + 1); 153 buf[DS1307_REG_MDAY] = BIN2BCD(t->tm_mday); 154 buf[DS1307_REG_MONTH] = BIN2BCD(t->tm_mon + 1); 155 156 /* assume 20YY not 19YY */ 157 tmp = t->tm_year - 100; 158 buf[DS1307_REG_YEAR] = BIN2BCD(tmp); 159 160 if (ds1307->type == ds_1337) 161 buf[DS1307_REG_MONTH] |= DS1337_BIT_CENTURY; 162 else if (ds1307->type == ds_1340) 163 buf[DS1307_REG_HOUR] |= DS1340_BIT_CENTURY_EN 164 | DS1340_BIT_CENTURY; 165 166 ds1307->msg[1].flags = 0; 167 ds1307->msg[1].len = 8; 168 169 dev_dbg(dev, "%s: %02x %02x %02x %02x %02x %02x %02x\n", 170 "write", buf[0], buf[1], buf[2], buf[3], 171 buf[4], buf[5], buf[6]); 172 173 result = i2c_transfer(ds1307->client.adapter, &ds1307->msg[1], 1); 174 if (result != 1) { 175 dev_err(dev, "%s error %d\n", "write", tmp); 176 return -EIO; 177 } 178 return 0; 179} 180 181static const struct rtc_class_ops ds13xx_rtc_ops = { 182 .read_time = ds1307_get_time, 183 .set_time = ds1307_set_time, 184}; 185 186static struct i2c_driver ds1307_driver; 187 188static int __devinit 189ds1307_detect(struct i2c_adapter *adapter, int address, int kind) 190{ 191 struct ds1307 *ds1307; 192 int err = -ENODEV; 193 struct i2c_client *client; 194 int tmp; 195 196 if (!(ds1307 = kzalloc(sizeof(struct ds1307), GFP_KERNEL))) { 197 err = -ENOMEM; 198 goto exit; 199 } 200 201 client = &ds1307->client; 202 client->addr = address; 203 client->adapter = adapter; 204 client->driver = &ds1307_driver; 205 client->flags = 0; 206 207 i2c_set_clientdata(client, ds1307); 208 209 ds1307->msg[0].addr = client->addr; 210 ds1307->msg[0].flags = 0; 211 ds1307->msg[0].len = 1; 212 ds1307->msg[0].buf = &ds1307->reg_addr; 213 214 ds1307->msg[1].addr = client->addr; 215 ds1307->msg[1].flags = I2C_M_RD; 216 ds1307->msg[1].len = sizeof(ds1307->regs); 217 ds1307->msg[1].buf = ds1307->regs; 218 219 /* HACK: "force" implies "needs ds1337-style-oscillator setup" */ 220 if (kind >= 0) { 221 ds1307->type = ds_1337; 222 223 ds1307->reg_addr = DS1337_REG_CONTROL; 224 ds1307->msg[1].len = 2; 225 226 tmp = i2c_transfer(client->adapter, ds1307->msg, 2); 227 if (tmp != 2) { 228 pr_debug("read error %d\n", tmp); 229 err = -EIO; 230 goto exit_free; 231 } 232 233 ds1307->reg_addr = 0; 234 ds1307->msg[1].len = sizeof(ds1307->regs); 235 236 /* oscillator is off; need to turn it on */ 237 if ((ds1307->regs[0] & DS1337_BIT_nEOSC) 238 || (ds1307->regs[1] & DS1337_BIT_OSF)) { 239 printk(KERN_ERR "no ds1337 oscillator code\n"); 240 goto exit_free; 241 } 242 } else 243 ds1307->type = ds_1307; 244 245read_rtc: 246 /* read RTC registers */ 247 248 tmp = i2c_transfer(client->adapter, ds1307->msg, 2); 249 if (tmp != 2) { 250 pr_debug("read error %d\n", tmp); 251 err = -EIO; 252 goto exit_free; 253 } 254 255 /* minimal sanity checking; some chips (like DS1340) don't 256 * specify the extra bits as must-be-zero, but there are 257 * still a few values that are clearly out-of-range. 258 */ 259 tmp = ds1307->regs[DS1307_REG_SECS]; 260 if (tmp & DS1307_BIT_CH) { 261 if (ds1307->type && ds1307->type != ds_1307) { 262 pr_debug("not a ds1307?\n"); 263 goto exit_free; 264 } 265 ds1307->type = ds_1307; 266 267 /* this partial initialization should work for ds1307, 268 * ds1338, ds1340, st m41t00, and more. 269 */ 270 dev_warn(&client->dev, "oscillator started; SET TIME!\n"); 271 i2c_smbus_write_byte_data(client, 0, 0); 272 goto read_rtc; 273 } 274 tmp = BCD2BIN(tmp & 0x7f); 275 if (tmp > 60) 276 goto exit_free; 277 tmp = BCD2BIN(ds1307->regs[DS1307_REG_MIN] & 0x7f); 278 if (tmp > 60) 279 goto exit_free; 280 281 tmp = BCD2BIN(ds1307->regs[DS1307_REG_MDAY] & 0x3f); 282 if (tmp == 0 || tmp > 31) 283 goto exit_free; 284 285 tmp = BCD2BIN(ds1307->regs[DS1307_REG_MONTH] & 0x1f); 286 if (tmp == 0 || tmp > 12) 287 goto exit_free; 288 289 /* force into in 24 hour mode (most chips) or 290 * disable century bit (ds1340) 291 */ 292 tmp = ds1307->regs[DS1307_REG_HOUR]; 293 if (tmp & (1 << 6)) { 294 if (tmp & (1 << 5)) 295 tmp = BCD2BIN(tmp & 0x1f) + 12; 296 else 297 tmp = BCD2BIN(tmp); 298 i2c_smbus_write_byte_data(client, 299 DS1307_REG_HOUR, 300 BIN2BCD(tmp)); 301 } 302 303 304 switch (ds1307->type) { 305 case unknown: 306 strlcpy(client->name, "unknown", I2C_NAME_SIZE); 307 break; 308 case ds_1307: 309 strlcpy(client->name, "ds1307", I2C_NAME_SIZE); 310 break; 311 case ds_1337: 312 strlcpy(client->name, "ds1337", I2C_NAME_SIZE); 313 break; 314 case ds_1340: 315 strlcpy(client->name, "ds1340", I2C_NAME_SIZE); 316 break; 317 } 318 319 /* Tell the I2C layer a new client has arrived */ 320 if ((err = i2c_attach_client(client))) 321 goto exit_free; 322 323 ds1307->rtc = rtc_device_register(client->name, &client->dev, 324 &ds13xx_rtc_ops, THIS_MODULE); 325 if (IS_ERR(ds1307->rtc)) { 326 err = PTR_ERR(ds1307->rtc); 327 dev_err(&client->dev, 328 "unable to register the class device\n"); 329 goto exit_detach; 330 } 331 332 return 0; 333 334exit_detach: 335 i2c_detach_client(client); 336exit_free: 337 kfree(ds1307); 338exit: 339 return err; 340} 341 342static int __devinit 343ds1307_attach_adapter(struct i2c_adapter *adapter) 344{ 345 if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) 346 return 0; 347 return i2c_probe(adapter, &addr_data, ds1307_detect); 348} 349 350static int __devexit ds1307_detach_client(struct i2c_client *client) 351{ 352 int err; 353 struct ds1307 *ds1307 = i2c_get_clientdata(client); 354 355 rtc_device_unregister(ds1307->rtc); 356 if ((err = i2c_detach_client(client))) 357 return err; 358 kfree(ds1307); 359 return 0; 360} 361 362static struct i2c_driver ds1307_driver = { 363 .driver = { 364 .name = "ds1307", 365 .owner = THIS_MODULE, 366 }, 367 .attach_adapter = ds1307_attach_adapter, 368 .detach_client = __devexit_p(ds1307_detach_client), 369}; 370 371static int __init ds1307_init(void) 372{ 373 return i2c_add_driver(&ds1307_driver); 374} 375module_init(ds1307_init); 376 377static void __exit ds1307_exit(void) 378{ 379 i2c_del_driver(&ds1307_driver); 380} 381module_exit(ds1307_exit); 382 383MODULE_DESCRIPTION("RTC driver for DS1307 and similar chips"); 384MODULE_LICENSE("GPL"); 385