[i2c] [PATCH 1/2] S3C24XX: fix i2c SDA to SCL setup time

Jean Delvare khali at linux-fr.org
Sat Apr 21 21:07:03 CEST 2007


Hi Ben,

On Fri, 20 Apr 2007 11:04:39 +0100, Ben Dooks wrote:
> 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,

Applied, thanks.

-- 
Jean Delvare



More information about the i2c mailing list