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