[i2c] [PATCH 1/2] S3C24XX: fix i2c SDA to SCL setup time
Ben Dooks
ben-linux at fluff.org
Fri Apr 20 12:04:39 CEST 2007
Fix the setup time for SDA to SCL due to the way
the S3C24XX I2C controller works (see the comments
in the changes for full explanation)
Signed-off-by: Ben Dooks <ben-linux at fluff.org>
diff -urpN -X linux-2.6.21-rc6/Documentation/dontdiff linux-2.6.21-rc6/drivers/i2c/busses/i2c-s3c2410.c linux-2.6.21-rc6-i2cfix1/drivers/i2c/busses/i2c-s3c2410.c
--- linux-2.6.21-rc6/drivers/i2c/busses/i2c-s3c2410.c 2007-04-14 13:42:46.000000000 +0100
+++ linux-2.6.21-rc6-i2cfix1/drivers/i2c/busses/i2c-s3c2410.c 2007-04-17 23:35:22.000000000 +0100
@@ -61,6 +61,8 @@ struct s3c24xx_i2c {
unsigned int msg_idx;
unsigned int msg_ptr;
+ unsigned int tx_setup;
+
enum s3c24xx_i2c_state state;
void __iomem *regs;
@@ -199,8 +201,11 @@ static void s3c24xx_i2c_message_start(st
dev_dbg(i2c->dev, "START: %08lx to IICSTAT, %02x to DS\n", stat, addr);
writeb(addr, i2c->regs + S3C2410_IICDS);
- // delay a bit and reset iiccon before setting start (per samsung)
- udelay(1);
+ /* delay here to ensure the data byte has gotten onto the bus
+ * before the transaction is started */
+
+ ndelay(i2c->tx_setup);
+
dev_dbg(i2c->dev, "iiccon, %08lx\n", iiccon);
writel(iiccon, i2c->regs + S3C2410_IICCON);
@@ -322,7 +327,15 @@ static int i2s_s3c_irq_nextbyte(struct s
if (!is_msgend(i2c)) {
byte = i2c->msg->buf[i2c->msg_ptr++];
writeb(byte, i2c->regs + S3C2410_IICDS);
-
+
+ /* delay after writing the byte to allow the
+ * data setup time on the bus, as writing the
+ * data to the register causes the first bit
+ * to appear on SDA, and SCL will change as
+ * soon as the interrupt is acknowledged */
+
+ ndelay(i2c->tx_setup);
+
} else if (!is_lastmsg(i2c)) {
/* we need to go to the next i2c message */
@@ -570,9 +583,10 @@ static const struct i2c_algorithm s3c24x
};
static struct s3c24xx_i2c s3c24xx_i2c = {
- .lock = SPIN_LOCK_UNLOCKED,
- .wait = __WAIT_QUEUE_HEAD_INITIALIZER(s3c24xx_i2c.wait),
- .adap = {
+ .lock = SPIN_LOCK_UNLOCKED,
+ .wait = __WAIT_QUEUE_HEAD_INITIALIZER(s3c24xx_i2c.wait),
+ .tx_setup = 50,
+ .adap = {
.name = "s3c2410-i2c",
.owner = THIS_MODULE,
.algo = &s3c24xx_i2c_algorithm,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 2621-rc6-s3c24xx-i2c-setuptime.patch
Type: text/x-diff
Size: 2308 bytes
Desc: not available
Url : http://lists.lm-sensors.org/pipermail/i2c/attachments/20070420/72a952cf/attachment.bin
More information about the i2c
mailing list