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

Marek Vasut
2012-06-22T16:59:51Z

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