Hello Michael,

Sorry for the long delay...

Michael Jones wrote:
> This allows the EEPROM layer to send a single i2c write command
> per page, and wait CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS between
> i2c write commands.
> 
> Signed-off-by: Michael Jones <michael.jo...@matrix-vision.de>
> ---
> Changes for v2:
>   - None. Resubmitting to include custodian in cc:
> 
>  drivers/i2c/omap24xx_i2c.c |  134 ++++++++++++++++++-------------------------
>  1 files changed, 56 insertions(+), 78 deletions(-)
> 
> diff --git a/drivers/i2c/omap24xx_i2c.c b/drivers/i2c/omap24xx_i2c.c
> index 966ffc4..4ae03bc 100644
> --- a/drivers/i2c/omap24xx_i2c.c
> +++ b/drivers/i2c/omap24xx_i2c.c
[...]
> @@ -372,26 +301,75 @@ int i2c_read (uchar chip, uint addr, int alen, uchar * 
> buffer, int len)
>  int i2c_write (uchar chip, uint addr, int alen, uchar * buffer, int len)
>  {
>       int i;
> +     u16 status;
> +     int i2c_error = 0;
>  
>       if (alen > 1) {
> -             printf ("I2C read: addr len %d not supported\n", alen);
> +             printf("I2C write: addr len %d not supported\n", alen);
>               return 1;
>       }
>  
>       if (addr + len > 256) {
> -             printf ("I2C read: address out of range\n");
> +             printf("I2C write: address 0x%x + 0x%x out of range\n");
>               return 1;
>       }
>  
> +     /* wait until bus not busy */
> +     wait_for_bb();
> +
> +     /* start address phase - will write regoffset + len bytes data */
> +     /* TODO consider case when !CONFIG_OMAP243X/34XX/44XX */

Do we have this usecase?

> +     writew(alen+len, &i2c_base->cnt);

please change to "alen + len"

> +     /* set slave address */
> +     writew(chip, &i2c_base->sa);
> +     /* stop bit needed here */
> +     writew(I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_TRX |
> +             I2C_CON_STP, &i2c_base->con);
> +
> +     /* Send address byte */
> +     status = wait_for_pin();
> +
> +     if (status == 0 || status & I2C_STAT_NACK) {
> +             i2c_error = 1;
> +             printf("%s:%d error status=0x%x\n", __func__, __LINE__, status);

Can you change this printf to output some more info, instead __func__, __LINE__?

> +             goto write_exit;
> +     }
> +
> +     if (status & I2C_STAT_XRDY) {
> +             writeb(addr & 0xFF, &i2c_base->data);
> +             writew(I2C_STAT_XRDY, &i2c_base->stat);
> +     } else {
> +             i2c_error = 1;
> +             printf("%s:%d error status=0x%x\n", __func__, __LINE__, status);

here too.

> +             goto write_exit;
> +     }
> +
> +     /* address phase is over, now write data */
>       for (i = 0; i < len; i++) {
> -             if (i2c_write_byte (chip, addr + i, buffer[i])) {
> -                     printf ("I2C read: I/O error\n");
> -                     i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
> -                     return 1;
> +             status = wait_for_pin();
> +
> +             if (status == 0 || status & I2C_STAT_NACK) {
> +                     i2c_error = 1;
> +                     printf("%s:%d error status=0x%x\n",
> +                                     __func__, __LINE__, status);

also here ...

> +                     goto write_exit;
> +             }
> +
> +             if (status & I2C_STAT_XRDY) {
> +                     writeb(buffer[i], &i2c_base->data);
> +                     writew(I2C_STAT_XRDY, &i2c_base->stat);
> +             } else {
> +                     i2c_error = 1;
> +                     printf("%s:%d i=%d error status=0x%x\n",
> +                                     __func__, __LINE__, i, status);

and here.

> +                     goto write_exit;
>               }
>       }
>  
> -     return 0;
> +write_exit:
> +     flush_fifo();
> +     writew(0xFFFF, &i2c_base->stat);
> +     return i2c_error;
>  }
>  
>  static void wait_for_bb (void)

bye,
Heiko
-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to