+ i2c-fix-broken-ds1337-initialization.patch added to -mm tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch titled
     i2c: fix broken ds1337 initialization
has been added to the -mm tree.  Its filename is
     i2c-fix-broken-ds1337-initialization.patch

See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this

------------------------------------------------------
Subject: i2c: fix broken ds1337 initialization
From: Dirk Eibach <eibach@xxxxxxxx>

On a custom board with ds1337 RTC I found that upgrade from 2.6.15 to
2.6.18 broke RTC support.

The main problem are changes to ds1337_init_client().

When a ds1337 recognizes a problem (e.g.  power or clock failure) bit 7 in
status register is set.  This has to be reset by writing 0 to status
register.  But since there are only 16 byte written to the chip and the
first byte is interpreted as an address, the status register (which is the
16th) is never written.

The other problem is, that initializing all registers to zero is not valid
for day, date and month register.  Funny enough this is checked by
ds1337_detect(), which depends on this values not being zero.  So then
treated by ds1337_init_client() the ds1337 is not detected anymore, whereas
the failure bit in the status register is still set.

Signed-off-by: Dirk Stieler <stieler@xxxxxxxx>
Signed-off-by: Dirk Eibach <eibach@xxxxxxxx>
Cc: Alessandro Zummo <a.zummo@xxxxxxxxxxxx>
Cc: Jean Delvare <khali@xxxxxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 drivers/i2c/chips/ds1337.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletion(-)

diff -puN drivers/i2c/chips/ds1337.c~i2c-fix-broken-ds1337-initialization drivers/i2c/chips/ds1337.c
--- a/drivers/i2c/chips/ds1337.c~i2c-fix-broken-ds1337-initialization
+++ a/drivers/i2c/chips/ds1337.c
@@ -347,13 +347,19 @@ static void ds1337_init_client(struct i2
 
 	if ((status & 0x80) || (control & 0x80)) {
 		/* RTC not running */
-		u8 buf[16];
+		u8 buf[17]; /* First byte is interpreted as address */
 		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));
+
+		/* Write valid values in the date/time registers */
+		buf[4] = 1; /* Day */
+		buf[5] = 1; /* Date */
+		buf[6] = 1; /* Month */
+
 		msg[0].addr = client->addr;
 		msg[0].flags = 0;
 		msg[0].len = sizeof(buf);
_

Patches currently in -mm which might be from eibach@xxxxxxxx are

i2c-fix-broken-ds1337-initialization.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux