
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.jones@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