ChangeSet 1.2041, 2005/02/03 00:28:34-08:00, [EMAIL PROTECTED]

[PATCH] I2C: Fix DS1621 detection

Dallas Semiconductors as recently changed the design of their DS1621
chips, including the bits that were checked in the kernel driver to
detect it.

The patch below fixes the detection by checking an other bit of the
configuration register instead.

Signed-off-by: Aurelien Jarno <[EMAIL PROTECTED]>
Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>


 drivers/i2c/chips/ds1621.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)


diff -Nru a/drivers/i2c/chips/ds1621.c b/drivers/i2c/chips/ds1621.c
--- a/drivers/i2c/chips/ds1621.c        2005-02-03 09:35:23 -08:00
+++ b/drivers/i2c/chips/ds1621.c        2005-02-03 09:35:23 -08:00
@@ -42,9 +42,8 @@
 /* Many DS1621 constants specified below */
 /* Config register used for detection         */
 /*  7    6    5    4    3    2    1    0      */
-/* |Done|THF |TLF |NVB | 1  | 0  |POL |1SHOT| */
-#define DS1621_REG_CONFIG_MASK         0x0C
-#define DS1621_REG_CONFIG_VAL          0x08
+/* |Done|THF |TLF |NVB | X  | X  |POL |1SHOT| */
+#define DS1621_REG_CONFIG_NVB          0x10
 #define DS1621_REG_CONFIG_POLARITY     0x02
 #define DS1621_REG_CONFIG_1SHOT                0x01
 #define DS1621_REG_CONFIG_DONE         0x80
@@ -55,6 +54,7 @@
 #define DS1621_REG_TEMP_MAX            0xA2 /* word, RW */
 #define DS1621_REG_CONF                        0xAC /* byte, RW */
 #define DS1621_COM_START               0xEE /* no data */
+#define DS1621_COM_STOP                        0x22 /* no data */
 
 /* The DS1621 configuration register */
 #define DS1621_ALARM_TEMP_HIGH         0x40
@@ -212,9 +212,13 @@
 
        /* Now, we do the remaining detection. It is lousy. */
        if (kind < 0) {
+               /* The NVB bit should be low if no EEPROM write has been 
+                  requested during the latest 10ms, which is highly 
+                  improbable in our case. */
                conf = ds1621_read_value(new_client, DS1621_REG_CONF);
-               if ((conf & DS1621_REG_CONFIG_MASK) != DS1621_REG_CONFIG_VAL)
+               if (conf & DS1621_REG_CONFIG_NVB)
                        goto exit_free;
+               /* The 7 lowest bits of a temperature should always be 0. */
                temp = ds1621_read_value(new_client, DS1621_REG_TEMP);
                if (temp & 0x007f)
                        goto exit_free;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to