[PATCH] i2c: Extend ds1337 initialization

Add code to handle case where board firmware does not start the
RTC.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
CC: James Chapman <jchapman@katalix.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Michael Burian 2005-11-07 22:30:14 +01:00 committed by Greg Kroah-Hartman
parent 2e3e13f8e9
commit f9e8957937
1 changed files with 31 additions and 6 deletions

View File

@ -337,13 +337,38 @@ static int ds1337_detect(struct i2c_adapter *adapter, int address, int kind)
static void ds1337_init_client(struct i2c_client *client) static void ds1337_init_client(struct i2c_client *client)
{ {
s32 val; u8 status, control;
/* Ensure that device is set in 24-hour mode */ /* On some boards, the RTC isn't configured by boot firmware.
val = i2c_smbus_read_byte_data(client, DS1337_REG_HOUR); * Handle that case by starting/configuring the RTC now.
if ((val >= 0) && (val & (1 << 6))) */
i2c_smbus_write_byte_data(client, DS1337_REG_HOUR, status = i2c_smbus_read_byte_data(client, DS1337_REG_STATUS);
val & 0x3f); control = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL);
if ((status & 0x80) || (control & 0x80)) {
/* RTC not running */
u8 buf[16];
struct i2c_msg msg[1];
dev_dbg(&client->dev, "%s: RTC not running!\n", __FUNCTION__);
/* Initialize all, including STATUS and CONTROL to zero */
memset(buf, 0, sizeof(buf));
msg[0].addr = client->addr;
msg[0].flags = 0;
msg[0].len = sizeof(buf);
msg[0].buf = &buf[0];
i2c_transfer(client->adapter, msg, 1);
} else {
/* Running: ensure that device is set in 24-hour mode */
s32 val;
val = i2c_smbus_read_byte_data(client, DS1337_REG_HOUR);
if ((val >= 0) && (val & (1 << 6)))
i2c_smbus_write_byte_data(client, DS1337_REG_HOUR,
val & 0x3f);
}
} }
static int ds1337_detach_client(struct i2c_client *client) static int ds1337_detach_client(struct i2c_client *client)