Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9e89579 authored by Michael Burian's avatar Michael Burian Committed by Greg Kroah-Hartman
Browse files

[PATCH] i2c: Extend ds1337 initialization



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

Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
CC: James Chapman <jchapman@katalix.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 2e3e13f8
Loading
Loading
Loading
Loading
+31 −6
Original line number Diff line number Diff line
@@ -337,14 +337,39 @@ static int ds1337_detect(struct i2c_adapter *adapter, int address, int kind)

static void ds1337_init_client(struct i2c_client *client)
{
	u8 status, control;

	/* On some boards, the RTC isn't configured by boot firmware.
	 * Handle that case by starting/configuring the RTC now.
	 */
	status = i2c_smbus_read_byte_data(client, DS1337_REG_STATUS);
	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;

	/* Ensure that device is set in 24-hour mode */
		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)
{