soft_i2c.c add option for repeated start in i2c_read()
authorAndrew Dyer <adyer@righthandtech.com>
Mon, 29 Dec 2008 23:36:01 +0000 (17:36 -0600)
committerWolfgang Denk <wd@denx.de>
Tue, 27 Jan 2009 21:26:31 +0000 (22:26 +0100)
This patch adds a #define to optionally change the behaviour of
i2c_read() in soft_i2c.c to send an I2C repeated start instead of a
stop-start between sending the device address pointer write and
reading back the data.  The current behaviour is retained as the
default.

While most devices will work either way, I have a smart battery(*)
that requires repeated start, and someone at some point found a
device that required a stop-start.

(*) http://www.inspired-energy.com/Standard_Products/NL2054/NL2054%20Rev1.0%20Data%20Sheet.pdf

Signed-off-by: Andrew Dyer <adyer@righthandtech.com>
README
drivers/i2c/soft_i2c.c

diff --git a/README b/README
index ad792d394fbbf092ba810c3821f6fe8962d4e19c..afcc6714b16439e3cfd1ee83fe121a640dfa5066 100644 (file)
--- a/README
+++ b/README
@@ -1509,6 +1509,15 @@ The following options need to be configured:
                Bus on the MPC8260. But it should be not so difficult
                to add this option to other architectures.
 
+               CONFIG_SOFT_I2C_READ_REPEATED_START
+
+               defining this will force the i2c_read() function in
+               the soft_i2c driver to perform an I2C repeated start
+               between writing the address pointer and reading the
+               data.  If this define is omitted the default behaviour
+               of doing a stop-start sequence will be used.  Most I2C
+               devices can use either method, but some require one or
+               the other.
 
 - SPI Support: CONFIG_SPI
 
index a27de5a7ec7887e836461bb1648cb64f8ab35b9a..da6cec1fa28090bf708c25f35317d85a27771f35 100644 (file)
@@ -385,8 +385,18 @@ int  i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
                        }
                        shift -= 8;
                }
-               send_stop();    /* reportedly some chips need a full stop */
+
+               /* Some I2C chips need a stop/start sequence here,
+                * other chips don't work with a full stop and need
+                * only a start.  Default behaviour is to send the
+                * stop/start sequence.
+                */
+#ifdef CONFIG_SOFT_I2C_READ_REPEATED_START
                send_start();
+#else
+               send_stop();
+               send_start();
+#endif
        }
        /*
         * Send the chip address again, this time for a read cycle.