mirror of https://gitee.com/openkylin/linux.git
[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:
parent
2e3e13f8e9
commit
f9e8957937
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue