diff options
| author | Vincent Stehlé <v-stehle@ti.com> | 2012-12-03 05:23:16 +0000 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2012-12-10 12:45:35 -0700 | 
| commit | febc4cd48a5c030c7fd411be519505701c100838 (patch) | |
| tree | 4167f93568b48a78a3d05a0de2ef2f25ad11c933 /drivers/i2c/omap24xx_i2c.c | |
| parent | dcee1ab3207327f142635b08e834af5e9f9f8cc9 (diff) | |
| download | olio-uboot-2014.01-febc4cd48a5c030c7fd411be519505701c100838.tar.xz olio-uboot-2014.01-febc4cd48a5c030c7fd411be519505701c100838.zip | |
omap24xx_i2c: Handle wait_for_bb error
We add a return code to wait_for_bb() to be able to report errors to the
callers properly. We in turn handle this new error code in i2c_read, i2c_write
and i2c_probe.
Signed-off-by: Vincent Stehlé <v-stehle@ti.com>
Diffstat (limited to 'drivers/i2c/omap24xx_i2c.c')
| -rw-r--r-- | drivers/i2c/omap24xx_i2c.c | 20 | 
1 files changed, 14 insertions, 6 deletions
| diff --git a/drivers/i2c/omap24xx_i2c.c b/drivers/i2c/omap24xx_i2c.c index 094305fdf..1bbb2ca54 100644 --- a/drivers/i2c/omap24xx_i2c.c +++ b/drivers/i2c/omap24xx_i2c.c @@ -31,7 +31,7 @@ DECLARE_GLOBAL_DATA_PTR;  #define I2C_TIMEOUT	1000 -static void wait_for_bb(void); +static int wait_for_bb(void);  static u16 wait_for_pin(void);  static void flush_fifo(void); @@ -159,7 +159,8 @@ static int i2c_read_byte(u8 devaddr, u16 regoffset, u8 alen, u8 *value)  	u16 w;  	/* wait until bus not busy */ -	wait_for_bb(); +	if (wait_for_bb()) +		return 1;  	/* one byte only */  	writew(alen, &i2c_base->cnt); @@ -260,7 +261,8 @@ int i2c_probe(uchar chip)  		return res;  	/* wait until bus not busy */ -	wait_for_bb(); +	if (wait_for_bb()) +		return res;  	/* try to read one byte */  	writew(1, &i2c_base->cnt); @@ -279,7 +281,10 @@ int i2c_probe(uchar chip)  			res = 1;  			writew(0xff, &i2c_base->stat);  			writew (readw (&i2c_base->con) | I2C_CON_STP, &i2c_base->con); -			wait_for_bb (); + +			if (wait_for_bb()) +				res = 1; +  			break;  		}  		if (status & I2C_STAT_ARDY) { @@ -351,7 +356,8 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)  	}  	/* wait until bus not busy */ -	wait_for_bb(); +	if (wait_for_bb()) +		return 1;  	/* start address phase - will write regoffset + len bytes data */  	/* TODO consider case when !CONFIG_OMAP243X/34XX/44XX */ @@ -394,7 +400,7 @@ write_exit:  	return i2c_error;  } -static void wait_for_bb(void) +static int wait_for_bb(void)  {  	int timeout = I2C_TIMEOUT;  	u16 stat; @@ -408,8 +414,10 @@ static void wait_for_bb(void)  	if (timeout <= 0) {  		printf("timed out in wait_for_bb: I2C_STAT=%x\n",  			readw(&i2c_base->stat)); +		return 1;  	}  	writew(0xFFFF, &i2c_base->stat);	 /* clear delayed stuff*/ +	return 0;  }  static u16 wait_for_pin(void) |