Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=763d9c046a2e511ec090a8986d3f85edf7448e7e
Commit:     763d9c046a2e511ec090a8986d3f85edf7448e7e
Parent:     a980a99ae5ada5260ddae15da45582dad32dbb93
Author:     Dirk Eibach <[EMAIL PROTECTED]>
AuthorDate: Sun Dec 10 21:21:31 2006 +0100
Committer:  Jean Delvare <[EMAIL PROTECTED]>
CommitDate: Sun Dec 10 21:21:31 2006 +0100

    i2c: fix broken ds1337 initialization
    
    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 <[EMAIL PROTECTED]>
    Signed-off-by: Dirk Eibach <[EMAIL PROTECTED]>
    Signed-off-by: Jean Delvare <[EMAIL PROTECTED]>
---
 drivers/i2c/chips/ds1337.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/drivers/i2c/chips/ds1337.c b/drivers/i2c/chips/ds1337.c
index 93d483b..ec17d6b 100644
--- a/drivers/i2c/chips/ds1337.c
+++ b/drivers/i2c/chips/ds1337.c
@@ -347,13 +347,19 @@ static void ds1337_init_client(struct i2c_client *client)
 
        if ((status & 0x80) || (control & 0x80)) {
                /* RTC not running */
-               u8 buf[16];
+               u8 buf[1+16];   /* 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[1+DS1337_REG_DAY] = 1;
+               buf[1+DS1337_REG_DATE] = 1;
+               buf[1+DS1337_REG_MONTH] = 1;
+
                msg[0].addr = client->addr;
                msg[0].flags = 0;
                msg[0].len = sizeof(buf);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to