diff mbox

[U-Boot,05/24] mxc_i2c: create i2c_init_transfer

Message ID 1340338339-11626-5-git-send-email-troy.kisky@boundarydevices.com
State Superseded
Delegated to: Heiko Schocher
Headers show

Commit Message

Troy Kisky June 22, 2012, 4:12 a.m. UTC
Initial code of i2c_read and i2c_write
is identical, move to subroutine.

Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
---
 drivers/i2c/mxc_i2c.c |   44 ++++++++++++++++++--------------------------
 1 file changed, 18 insertions(+), 26 deletions(-)

Comments

Marek Vasut June 22, 2012, 4:59 p.m. UTC | #1
Dear Troy Kisky,

> Initial code of i2c_read and i2c_write
> is identical, move to subroutine.
> 
> Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>

Acked-by: Marek Vasut <marex@denx.de>

> ---
>  drivers/i2c/mxc_i2c.c |   44 ++++++++++++++++++--------------------------
>  1 file changed, 18 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
> index bae9335..626960d 100644
> --- a/drivers/i2c/mxc_i2c.c
> +++ b/drivers/i2c/mxc_i2c.c
> @@ -275,19 +275,29 @@ void i2c_imx_stop(void)
>  }
> 
>  /*
> - * Write register address
> + * Send start signal, chip address and
> + * write register address
>   */
> -int i2c_imx_set_reg_addr(uint addr, int alen)
> +static int i2c_init_transfer(struct mxc_i2c_regs *i2c_regs,
> +		uchar chip, uint addr, int alen)
>  {
> -	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE;
> -	int ret = 0;
> +	int ret = i2c_imx_start();
> +	if (ret)
> +		goto exit;
> +
> +	/* write slave address */
> +	ret = tx_byte(i2c_regs, chip << 1);
> +	if (ret < 0)
> +		goto exit;
> 
>  	while (alen--) {
>  		ret =  tx_byte(i2c_regs, (addr >> (alen * 8)) & 0xff);
>  		if (ret < 0)
> -			break;
> +			goto exit;
>  	}
> -
> +	return 0;
> +exit:
> +	i2c_imx_stop();
>  	return ret;
>  }
> 
> @@ -322,16 +332,7 @@ int i2c_read(uchar chip, uint addr, int alen, uchar
> *buf, int len) unsigned int temp;
>  	int i;
> 
> -	ret = i2c_imx_start();
> -	if (ret)
> -		return ret;
> -
> -	/* write slave address */
> -	ret = tx_byte(i2c_regs, chip << 1);
> -	if (ret)
> -		return ret;
> -
> -	ret = i2c_imx_set_reg_addr(addr, alen);
> +	ret = i2c_init_transfer(i2c_regs, chip, addr, alen);
>  	if (ret)
>  		return ret;
> 
> @@ -389,16 +390,7 @@ int i2c_write(uchar chip, uint addr, int alen, uchar
> *buf, int len) int ret;
>  	int i;
> 
> -	ret = i2c_imx_start();
> -	if (ret)
> -		return ret;
> -
> -	/* write slave address */
> -	ret = tx_byte(i2c_regs, chip << 1);
> -	if (ret)
> -		return ret;
> -
> -	ret = i2c_imx_set_reg_addr(addr, alen);
> +	ret = i2c_init_transfer(i2c_regs, chip, addr, alen);
>  	if (ret)
>  		return ret;

Best regards,
Marek Vasut
Stefano Babic June 24, 2012, 8:06 a.m. UTC | #2
On 22/06/2012 06:12, Troy Kisky wrote:
> Initial code of i2c_read and i2c_write
> is identical, move to subroutine.
> 
> Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
> ---

Acked-by: Stefano Babic <sbabic@denx.de>

Best regards,
Stefano Babic
diff mbox

Patch

diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
index bae9335..626960d 100644
--- a/drivers/i2c/mxc_i2c.c
+++ b/drivers/i2c/mxc_i2c.c
@@ -275,19 +275,29 @@  void i2c_imx_stop(void)
 }
 
 /*
- * Write register address
+ * Send start signal, chip address and
+ * write register address
  */
-int i2c_imx_set_reg_addr(uint addr, int alen)
+static int i2c_init_transfer(struct mxc_i2c_regs *i2c_regs,
+		uchar chip, uint addr, int alen)
 {
-	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE;
-	int ret = 0;
+	int ret = i2c_imx_start();
+	if (ret)
+		goto exit;
+
+	/* write slave address */
+	ret = tx_byte(i2c_regs, chip << 1);
+	if (ret < 0)
+		goto exit;
 
 	while (alen--) {
 		ret =  tx_byte(i2c_regs, (addr >> (alen * 8)) & 0xff);
 		if (ret < 0)
-			break;
+			goto exit;
 	}
-
+	return 0;
+exit:
+	i2c_imx_stop();
 	return ret;
 }
 
@@ -322,16 +332,7 @@  int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
 	unsigned int temp;
 	int i;
 
-	ret = i2c_imx_start();
-	if (ret)
-		return ret;
-
-	/* write slave address */
-	ret = tx_byte(i2c_regs, chip << 1);
-	if (ret)
-		return ret;
-
-	ret = i2c_imx_set_reg_addr(addr, alen);
+	ret = i2c_init_transfer(i2c_regs, chip, addr, alen);
 	if (ret)
 		return ret;
 
@@ -389,16 +390,7 @@  int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
 	int ret;
 	int i;
 
-	ret = i2c_imx_start();
-	if (ret)
-		return ret;
-
-	/* write slave address */
-	ret = tx_byte(i2c_regs, chip << 1);
-	if (ret)
-		return ret;
-
-	ret = i2c_imx_set_reg_addr(addr, alen);
+	ret = i2c_init_transfer(i2c_regs, chip, addr, alen);
 	if (ret)
 		return ret;