提交 fcd8db00 编写于 作者: F frederic Rodo 提交者: Linus Torvalds

rtc ds1307: ds_1340 change init

For DS140, clear the oscillator fault flag as needed.
Signed-off-by: NFrederic RODO <f.rodo@til-technologies.fr>
[ And remove some "sparse" warnings. ]
Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 75b61022
...@@ -256,7 +256,7 @@ ds1307_nvram_read(struct kobject *kobj, struct bin_attribute *attr, ...@@ -256,7 +256,7 @@ ds1307_nvram_read(struct kobject *kobj, struct bin_attribute *attr,
struct i2c_msg msg[2]; struct i2c_msg msg[2];
int result; int result;
client = to_i2c_client(container_of(kobj, struct device, kobj)); client = kobj_to_i2c_client(kobj);
ds1307 = i2c_get_clientdata(client); ds1307 = i2c_get_clientdata(client);
if (unlikely(off >= NVRAM_SIZE)) if (unlikely(off >= NVRAM_SIZE))
...@@ -294,7 +294,7 @@ ds1307_nvram_write(struct kobject *kobj, struct bin_attribute *attr, ...@@ -294,7 +294,7 @@ ds1307_nvram_write(struct kobject *kobj, struct bin_attribute *attr,
u8 buffer[NVRAM_SIZE + 1]; u8 buffer[NVRAM_SIZE + 1];
int ret; int ret;
client = to_i2c_client(container_of(kobj, struct device, kobj)); client = kobj_to_i2c_client(kobj);
if (unlikely(off >= NVRAM_SIZE)) if (unlikely(off >= NVRAM_SIZE))
return -EFBIG; return -EFBIG;
...@@ -412,11 +412,6 @@ static int __devinit ds1307_probe(struct i2c_client *client) ...@@ -412,11 +412,6 @@ static int __devinit ds1307_probe(struct i2c_client *client)
*/ */
tmp = ds1307->regs[DS1307_REG_SECS]; tmp = ds1307->regs[DS1307_REG_SECS];
switch (ds1307->type) { switch (ds1307->type) {
case ds_1340:
/* FIXME read register with DS1340_BIT_OSF, use that to
* trigger the "set time" warning (*after* restarting the
* oscillator!) instead of this weaker ds1307/m41t00 test.
*/
case ds_1307: case ds_1307:
case m41t00: case m41t00:
/* clock halted? turn it on, so clock can tick. */ /* clock halted? turn it on, so clock can tick. */
...@@ -440,6 +435,24 @@ static int __devinit ds1307_probe(struct i2c_client *client) ...@@ -440,6 +435,24 @@ static int __devinit ds1307_probe(struct i2c_client *client)
goto read_rtc; goto read_rtc;
} }
break; break;
case ds_1340:
/* clock halted? turn it on, so clock can tick. */
if (tmp & DS1340_BIT_nEOSC)
i2c_smbus_write_byte_data(client, DS1307_REG_SECS, 0);
tmp = i2c_smbus_read_byte_data(client, DS1340_REG_FLAG);
if (tmp < 0) {
pr_debug("read error %d\n", tmp);
err = -EIO;
goto exit_free;
}
/* oscillator fault? clear flag, and warn */
if (tmp & DS1340_BIT_OSF) {
i2c_smbus_write_byte_data(client, DS1340_REG_FLAG, 0);
dev_warn(&client->dev, "SET TIME!\n");
}
break;
case ds_1337: case ds_1337:
case ds_1339: case ds_1339:
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册