aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-ds1307.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-ds1307.c')
-rw-r--r--drivers/rtc/rtc-ds1307.c189
1 files changed, 177 insertions, 12 deletions
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
index 7e5155e88ac..2c4a65302a9 100644
--- a/drivers/rtc/rtc-ds1307.c
+++ b/drivers/rtc/rtc-ds1307.c
@@ -3,6 +3,7 @@
3 * 3 *
4 * Copyright (C) 2005 James Chapman (ds1337 core) 4 * Copyright (C) 2005 James Chapman (ds1337 core)
5 * Copyright (C) 2006 David Brownell 5 * Copyright (C) 2006 David Brownell
6 * Copyright (C) 2009 Matthias Fuchs (rx8025 support)
6 * 7 *
7 * This program is free software; you can redistribute it and/or modify 8 * 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 * it under the terms of the GNU General Public License version 2 as
@@ -31,6 +32,7 @@ enum ds_type {
31 ds_1339, 32 ds_1339,
32 ds_1340, 33 ds_1340,
33 m41t00, 34 m41t00,
35 rx_8025,
34 // rs5c372 too? different address... 36 // rs5c372 too? different address...
35}; 37};
36 38
@@ -83,6 +85,12 @@ enum ds_type {
83#define DS1339_REG_ALARM1_SECS 0x07 85#define DS1339_REG_ALARM1_SECS 0x07
84#define DS1339_REG_TRICKLE 0x10 86#define DS1339_REG_TRICKLE 0x10
85 87
88#define RX8025_REG_CTRL1 0x0e
89# define RX8025_BIT_2412 0x20
90#define RX8025_REG_CTRL2 0x0f
91# define RX8025_BIT_PON 0x10
92# define RX8025_BIT_VDET 0x40
93# define RX8025_BIT_XST 0x20
86 94
87 95
88struct ds1307 { 96struct ds1307 {
@@ -94,6 +102,10 @@ struct ds1307 {
94 struct i2c_client *client; 102 struct i2c_client *client;
95 struct rtc_device *rtc; 103 struct rtc_device *rtc;
96 struct work_struct work; 104 struct work_struct work;
105 s32 (*read_block_data)(struct i2c_client *client, u8 command,
106 u8 length, u8 *values);
107 s32 (*write_block_data)(struct i2c_client *client, u8 command,
108 u8 length, const u8 *values);
97}; 109};
98 110
99struct chip_desc { 111struct chip_desc {
@@ -117,6 +129,8 @@ static const struct chip_desc chips[] = {
117[ds_1340] = { 129[ds_1340] = {
118}, 130},
119[m41t00] = { 131[m41t00] = {
132},
133[rx_8025] = {
120}, }; 134}, };
121 135
122static const struct i2c_device_id ds1307_id[] = { 136static const struct i2c_device_id ds1307_id[] = {
@@ -126,12 +140,86 @@ static const struct i2c_device_id ds1307_id[] = {
126 { "ds1339", ds_1339 }, 140 { "ds1339", ds_1339 },
127 { "ds1340", ds_1340 }, 141 { "ds1340", ds_1340 },
128 { "m41t00", m41t00 }, 142 { "m41t00", m41t00 },
143 { "rx8025", rx_8025 },
129 { } 144 { }
130}; 145};
131MODULE_DEVICE_TABLE(i2c, ds1307_id); 146MODULE_DEVICE_TABLE(i2c, ds1307_id);
132 147
133/*----------------------------------------------------------------------*/ 148/*----------------------------------------------------------------------*/
134 149
150#define BLOCK_DATA_MAX_TRIES 10
151
152static s32 ds1307_read_block_data_once(struct i2c_client *client, u8 command,
153 u8 length, u8 *values)
154{
155 s32 i, data;
156
157 for (i = 0; i < length; i++) {
158 data = i2c_smbus_read_byte_data(client, command + i);
159 if (data < 0)
160 return data;
161 values[i] = data;
162 }
163 return i;
164}
165
166static s32 ds1307_read_block_data(struct i2c_client *client, u8 command,
167 u8 length, u8 *values)
168{
169 u8 oldvalues[I2C_SMBUS_BLOCK_MAX];
170 s32 ret;
171 int tries = 0;
172
173 dev_dbg(&client->dev, "ds1307_read_block_data (length=%d)\n", length);
174 ret = ds1307_read_block_data_once(client, command, length, values);
175 if (ret < 0)
176 return ret;
177 do {
178 if (++tries > BLOCK_DATA_MAX_TRIES) {
179 dev_err(&client->dev,
180 "ds1307_read_block_data failed\n");
181 return -EIO;
182 }
183 memcpy(oldvalues, values, length);
184 ret = ds1307_read_block_data_once(client, command, length,
185 values);
186 if (ret < 0)
187 return ret;
188 } while (memcmp(oldvalues, values, length));
189 return length;
190}
191
192static s32 ds1307_write_block_data(struct i2c_client *client, u8 command,
193 u8 length, const u8 *values)
194{
195 u8 currvalues[I2C_SMBUS_BLOCK_MAX];
196 int tries = 0;
197
198 dev_dbg(&client->dev, "ds1307_write_block_data (length=%d)\n", length);
199 do {
200 s32 i, ret;
201
202 if (++tries > BLOCK_DATA_MAX_TRIES) {
203 dev_err(&client->dev,
204 "ds1307_write_block_data failed\n");
205 return -EIO;
206 }
207 for (i = 0; i < length; i++) {
208 ret = i2c_smbus_write_byte_data(client, command + i,
209 values[i]);
210 if (ret < 0)
211 return ret;
212 }
213 ret = ds1307_read_block_data_once(client, command, length,
214 currvalues);
215 if (ret < 0)
216 return ret;
217 } while (memcmp(currvalues, values, length));
218 return length;
219}
220
221/*----------------------------------------------------------------------*/
222
135/* 223/*
136 * The IRQ logic includes a "real" handler running in IRQ context just 224 * The IRQ logic includes a "real" handler running in IRQ context just
137 * long enough to schedule this workqueue entry. We need a task context 225 * long enough to schedule this workqueue entry. We need a task context
@@ -202,7 +290,7 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t)
202 int tmp; 290 int tmp;
203 291
204 /* read the RTC date and time registers all at once */ 292 /* read the RTC date and time registers all at once */
205 tmp = i2c_smbus_read_i2c_block_data(ds1307->client, 293 tmp = ds1307->read_block_data(ds1307->client,
206 DS1307_REG_SECS, 7, ds1307->regs); 294 DS1307_REG_SECS, 7, ds1307->regs);
207 if (tmp != 7) { 295 if (tmp != 7) {
208 dev_err(dev, "%s error %d\n", "read", tmp); 296 dev_err(dev, "%s error %d\n", "read", tmp);
@@ -279,7 +367,7 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
279 "write", buf[0], buf[1], buf[2], buf[3], 367 "write", buf[0], buf[1], buf[2], buf[3],
280 buf[4], buf[5], buf[6]); 368 buf[4], buf[5], buf[6]);
281 369
282 result = i2c_smbus_write_i2c_block_data(ds1307->client, 0, 7, buf); 370 result = ds1307->write_block_data(ds1307->client, 0, 7, buf);
283 if (result < 0) { 371 if (result < 0) {
284 dev_err(dev, "%s error %d\n", "write", result); 372 dev_err(dev, "%s error %d\n", "write", result);
285 return result; 373 return result;
@@ -297,7 +385,7 @@ static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t)
297 return -EINVAL; 385 return -EINVAL;
298 386
299 /* read all ALARM1, ALARM2, and status registers at once */ 387 /* read all ALARM1, ALARM2, and status registers at once */
300 ret = i2c_smbus_read_i2c_block_data(client, 388 ret = ds1307->read_block_data(client,
301 DS1339_REG_ALARM1_SECS, 9, ds1307->regs); 389 DS1339_REG_ALARM1_SECS, 9, ds1307->regs);
302 if (ret != 9) { 390 if (ret != 9) {
303 dev_err(dev, "%s error %d\n", "alarm read", ret); 391 dev_err(dev, "%s error %d\n", "alarm read", ret);
@@ -356,7 +444,7 @@ static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
356 t->enabled, t->pending); 444 t->enabled, t->pending);
357 445
358 /* read current status of both alarms and the chip */ 446 /* read current status of both alarms and the chip */
359 ret = i2c_smbus_read_i2c_block_data(client, 447 ret = ds1307->read_block_data(client,
360 DS1339_REG_ALARM1_SECS, 9, buf); 448 DS1339_REG_ALARM1_SECS, 9, buf);
361 if (ret != 9) { 449 if (ret != 9) {
362 dev_err(dev, "%s error %d\n", "alarm write", ret); 450 dev_err(dev, "%s error %d\n", "alarm write", ret);
@@ -391,7 +479,7 @@ static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t)
391 } 479 }
392 buf[8] = status & ~(DS1337_BIT_A1I | DS1337_BIT_A2I); 480 buf[8] = status & ~(DS1337_BIT_A1I | DS1337_BIT_A2I);
393 481
394 ret = i2c_smbus_write_i2c_block_data(client, 482 ret = ds1307->write_block_data(client,
395 DS1339_REG_ALARM1_SECS, 9, buf); 483 DS1339_REG_ALARM1_SECS, 9, buf);
396 if (ret < 0) { 484 if (ret < 0) {
397 dev_err(dev, "can't set alarm time\n"); 485 dev_err(dev, "can't set alarm time\n");
@@ -479,7 +567,7 @@ ds1307_nvram_read(struct kobject *kobj, struct bin_attribute *attr,
479 if (unlikely(!count)) 567 if (unlikely(!count))
480 return count; 568 return count;
481 569
482 result = i2c_smbus_read_i2c_block_data(client, 8 + off, count, buf); 570 result = ds1307->read_block_data(client, 8 + off, count, buf);
483 if (result < 0) 571 if (result < 0)
484 dev_err(&client->dev, "%s error %d\n", "nvram read", result); 572 dev_err(&client->dev, "%s error %d\n", "nvram read", result);
485 return result; 573 return result;
@@ -490,9 +578,11 @@ ds1307_nvram_write(struct kobject *kobj, struct bin_attribute *attr,
490 char *buf, loff_t off, size_t count) 578 char *buf, loff_t off, size_t count)
491{ 579{
492 struct i2c_client *client; 580 struct i2c_client *client;
581 struct ds1307 *ds1307;
493 int result; 582 int result;
494 583
495 client = kobj_to_i2c_client(kobj); 584 client = kobj_to_i2c_client(kobj);
585 ds1307 = i2c_get_clientdata(client);
496 586
497 if (unlikely(off >= NVRAM_SIZE)) 587 if (unlikely(off >= NVRAM_SIZE))
498 return -EFBIG; 588 return -EFBIG;
@@ -501,7 +591,7 @@ ds1307_nvram_write(struct kobject *kobj, struct bin_attribute *attr,
501 if (unlikely(!count)) 591 if (unlikely(!count))
502 return count; 592 return count;
503 593
504 result = i2c_smbus_write_i2c_block_data(client, 8 + off, count, buf); 594 result = ds1307->write_block_data(client, 8 + off, count, buf);
505 if (result < 0) { 595 if (result < 0) {
506 dev_err(&client->dev, "%s error %d\n", "nvram write", result); 596 dev_err(&client->dev, "%s error %d\n", "nvram write", result);
507 return result; 597 return result;
@@ -535,9 +625,8 @@ static int __devinit ds1307_probe(struct i2c_client *client,
535 int want_irq = false; 625 int want_irq = false;
536 unsigned char *buf; 626 unsigned char *buf;
537 627
538 if (!i2c_check_functionality(adapter, 628 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)
539 I2C_FUNC_SMBUS_WRITE_BYTE_DATA | 629 && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK))
540 I2C_FUNC_SMBUS_I2C_BLOCK))
541 return -EIO; 630 return -EIO;
542 631
543 if (!(ds1307 = kzalloc(sizeof(struct ds1307), GFP_KERNEL))) 632 if (!(ds1307 = kzalloc(sizeof(struct ds1307), GFP_KERNEL)))
@@ -547,6 +636,13 @@ static int __devinit ds1307_probe(struct i2c_client *client,
547 i2c_set_clientdata(client, ds1307); 636 i2c_set_clientdata(client, ds1307);
548 ds1307->type = id->driver_data; 637 ds1307->type = id->driver_data;
549 buf = ds1307->regs; 638 buf = ds1307->regs;
639 if (i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) {
640 ds1307->read_block_data = i2c_smbus_read_i2c_block_data;
641 ds1307->write_block_data = i2c_smbus_write_i2c_block_data;
642 } else {
643 ds1307->read_block_data = ds1307_read_block_data;
644 ds1307->write_block_data = ds1307_write_block_data;
645 }
550 646
551 switch (ds1307->type) { 647 switch (ds1307->type) {
552 case ds_1337: 648 case ds_1337:
@@ -557,7 +653,7 @@ static int __devinit ds1307_probe(struct i2c_client *client,
557 want_irq = true; 653 want_irq = true;
558 } 654 }
559 /* get registers that the "rtc" read below won't read... */ 655 /* get registers that the "rtc" read below won't read... */
560 tmp = i2c_smbus_read_i2c_block_data(ds1307->client, 656 tmp = ds1307->read_block_data(ds1307->client,
561 DS1337_REG_CONTROL, 2, buf); 657 DS1337_REG_CONTROL, 2, buf);
562 if (tmp != 2) { 658 if (tmp != 2) {
563 pr_debug("read error %d\n", tmp); 659 pr_debug("read error %d\n", tmp);
@@ -589,13 +685,79 @@ static int __devinit ds1307_probe(struct i2c_client *client,
589 dev_warn(&client->dev, "SET TIME!\n"); 685 dev_warn(&client->dev, "SET TIME!\n");
590 } 686 }
591 break; 687 break;
688
689 case rx_8025:
690 tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
691 RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
692 if (tmp != 2) {
693 pr_debug("read error %d\n", tmp);
694 err = -EIO;
695 goto exit_free;
696 }
697
698 /* oscillator off? turn it on, so clock can tick. */
699 if (!(ds1307->regs[1] & RX8025_BIT_XST)) {
700 ds1307->regs[1] |= RX8025_BIT_XST;
701 i2c_smbus_write_byte_data(client,
702 RX8025_REG_CTRL2 << 4 | 0x08,
703 ds1307->regs[1]);
704 dev_warn(&client->dev,
705 "oscillator stop detected - SET TIME!\n");
706 }
707
708 if (ds1307->regs[1] & RX8025_BIT_PON) {
709 ds1307->regs[1] &= ~RX8025_BIT_PON;
710 i2c_smbus_write_byte_data(client,
711 RX8025_REG_CTRL2 << 4 | 0x08,
712 ds1307->regs[1]);
713 dev_warn(&client->dev, "power-on detected\n");
714 }
715
716 if (ds1307->regs[1] & RX8025_BIT_VDET) {
717 ds1307->regs[1] &= ~RX8025_BIT_VDET;
718 i2c_smbus_write_byte_data(client,
719 RX8025_REG_CTRL2 << 4 | 0x08,
720 ds1307->regs[1]);
721 dev_warn(&client->dev, "voltage drop detected\n");
722 }
723
724 /* make sure we are running in 24hour mode */
725 if (!(ds1307->regs[0] & RX8025_BIT_2412)) {
726 u8 hour;
727
728 /* switch to 24 hour mode */
729 i2c_smbus_write_byte_data(client,
730 RX8025_REG_CTRL1 << 4 | 0x08,
731 ds1307->regs[0] |
732 RX8025_BIT_2412);
733
734 tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
735 RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
736 if (tmp != 2) {
737 pr_debug("read error %d\n", tmp);
738 err = -EIO;
739 goto exit_free;
740 }
741
742 /* correct hour */
743 hour = bcd2bin(ds1307->regs[DS1307_REG_HOUR]);
744 if (hour == 12)
745 hour = 0;
746 if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)
747 hour += 12;
748
749 i2c_smbus_write_byte_data(client,
750 DS1307_REG_HOUR << 4 | 0x08,
751 hour);
752 }
753 break;
592 default: 754 default:
593 break; 755 break;
594 } 756 }
595 757
596read_rtc: 758read_rtc:
597 /* read RTC registers */ 759 /* read RTC registers */
598 tmp = i2c_smbus_read_i2c_block_data(ds1307->client, 0, 8, buf); 760 tmp = ds1307->read_block_data(ds1307->client, 0, 8, buf);
599 if (tmp != 8) { 761 if (tmp != 8) {
600 pr_debug("read error %d\n", tmp); 762 pr_debug("read error %d\n", tmp);
601 err = -EIO; 763 err = -EIO;
@@ -649,6 +811,7 @@ read_rtc:
649 dev_warn(&client->dev, "SET TIME!\n"); 811 dev_warn(&client->dev, "SET TIME!\n");
650 } 812 }
651 break; 813 break;
814 case rx_8025:
652 case ds_1337: 815 case ds_1337:
653 case ds_1339: 816 case ds_1339:
654 break; 817 break;
@@ -662,6 +825,8 @@ read_rtc:
662 * systems that will run through year 2100. 825 * systems that will run through year 2100.
663 */ 826 */
664 break; 827 break;
828 case rx_8025:
829 break;
665 default: 830 default:
666 if (!(tmp & DS1307_BIT_12HR)) 831 if (!(tmp & DS1307_BIT_12HR))
667 break; 832 break;