diff options
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/rtc-davinci.c | 1 | ||||
| -rw-r--r-- | drivers/rtc/rtc-ds1307.c | 4 | ||||
| -rw-r--r-- | drivers/rtc/rtc-rx8581.c | 20 | 
3 files changed, 20 insertions, 5 deletions
| diff --git a/drivers/rtc/rtc-davinci.c b/drivers/rtc/rtc-davinci.c index 92a8f6cacda..34647fc1ee9 100644 --- a/drivers/rtc/rtc-davinci.c +++ b/drivers/rtc/rtc-davinci.c @@ -29,6 +29,7 @@  #include <linux/bcd.h>  #include <linux/platform_device.h>  #include <linux/io.h> +#include <linux/slab.h>  /*   * The DaVinci RTC is a simple RTC with the following diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index de033b7ac21..d827ce570a8 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -777,7 +777,7 @@ static int __devinit ds1307_probe(struct i2c_client *client,  read_rtc:  	/* read RTC registers */ -	tmp = ds1307->read_block_data(ds1307->client, 0, 8, buf); +	tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, buf);  	if (tmp != 8) {  		pr_debug("read error %d\n", tmp);  		err = -EIO; @@ -862,7 +862,7 @@ read_rtc:  		if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM)  			tmp += 12;  		i2c_smbus_write_byte_data(client, -				DS1307_REG_HOUR, +				ds1307->offset + DS1307_REG_HOUR,  				bin2bcd(tmp));  	} diff --git a/drivers/rtc/rtc-rx8581.c b/drivers/rtc/rtc-rx8581.c index 9718aaaa821..600b890a3c1 100644 --- a/drivers/rtc/rtc-rx8581.c +++ b/drivers/rtc/rtc-rx8581.c @@ -168,7 +168,7 @@ static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm)  		return -EIO;  	} -	err = i2c_smbus_write_byte_data(client, RX8581_REG_FLAG, +	err = i2c_smbus_write_byte_data(client, RX8581_REG_CTRL,  		(data | RX8581_CTRL_STOP));  	if (err < 0) {  		dev_err(&client->dev, "Unable to write control register\n"); @@ -182,6 +182,20 @@ static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm)  		return -EIO;  	} +	/* get VLF and clear it */ +	data = i2c_smbus_read_byte_data(client, RX8581_REG_FLAG); +	if (data < 0) { +		dev_err(&client->dev, "Unable to read flag register\n"); +		return -EIO; +	} + +	err = i2c_smbus_write_byte_data(client, RX8581_REG_FLAG, +		(data & ~(RX8581_FLAG_VLF))); +	if (err != 0) { +		dev_err(&client->dev, "Unable to write flag register\n"); +		return -EIO; +	} +  	/* Restart the clock */  	data = i2c_smbus_read_byte_data(client, RX8581_REG_CTRL);  	if (data < 0) { @@ -189,8 +203,8 @@ static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm)  		return -EIO;  	} -	err = i2c_smbus_write_byte_data(client, RX8581_REG_FLAG, -		(data | ~(RX8581_CTRL_STOP))); +	err = i2c_smbus_write_byte_data(client, RX8581_REG_CTRL, +		(data & ~(RX8581_CTRL_STOP)));  	if (err != 0) {  		dev_err(&client->dev, "Unable to write control register\n");  		return -EIO; | 
