From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Chou Date: Mon, 12 Jul 2010 12:14:39 +0800 Subject: [U-Boot] [PATCH] i2c: fix SDA contention in read_byte() In-Reply-To: <4C3409F6.9000902@emk-elektronik.de> References: <1278396866-5571-1-git-send-email-thomas@wytron.com.tw> <4C3409F6.9000902@emk-elektronik.de> Message-ID: <4C3A96AF.9080109@wytron.com.tw> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Reinhard Meyer wrote: > Whenever possible by the hardware, I make I2C_SDA/SCL(1) do a tri-state and > I2C_TRISTATE and I2C_ACTIVE are empty. Dear Mike, I traced the i2c-gpio.c of linux and realized that there are potential bus contention with the current soft_i2c.c if the ports are not open-drained. Reinhard suggested a solution, which was similar to what linux driver does. So I would withdraw my SDA patch. For our i2c gpio framework, I added these changes and tested on my boards. Please check if it works on yours. # ifndef I2C_ACTIVE # define I2C_ACTIVE do {} while (0) # endif # ifndef I2C_TRISTATE # define I2C_TRISTATE do {} while (0) # endif # ifndef I2C_SDA # define I2C_SDA(bit) \ if (bit) { \ gpio_direction_input(CONFIG_SOFT_I2C_GPIO_SDA); \ } else { \ gpio_direction_output(CONFIG_SOFT_I2C_GPIO_SDA, 0);\ } # endif I didn't tristate SCL(1) because it cannot be tristated on some nios2 boards. As soft_i2c of u-boot didn't support clock stretching, it shouldn't matter. Best regards, Thomas