omap_i2c_complete_cmd(dev, 0);
                        continue;
                }
 -              if (stat & OMAP_I2C_STAT_RRDY) {
 -                      w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG);
 -                      if (dev->buf_len) {
 -                              *dev->buf++ = w;
 -                              dev->buf_len--;
 +              if (stat & (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR)) {
 +                      u8 num_bytes = 1;
 +                      if (dev->fifo_size) {
 +                              num_bytes = (stat & OMAP_I2C_STAT_RRDY) ? dev->fifo_size :
 +                                              omap_i2c_read_reg(dev, OMAP_I2C_BUFSTAT_REG);
 +                      }
 +                      while (num_bytes) {
 +                              num_bytes--;
 +                              w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG);
                                if (dev->buf_len) {
 -                                      *dev->buf++ = w >> 8;
 +                                      *dev->buf++ = w;
                                        dev->buf_len--;
-                                               dev_err(dev->dev, "RRDY IRQ while no data"
 +                                      /* Data reg from 2430 is 8 bit wide */
 +                                      if (!cpu_is_omap2430() &&
 +                                                      !cpu_is_omap34xx()) {
 +                                              if (dev->buf_len) {
 +                                                      *dev->buf++ = w >> 8;
 +                                                      dev->buf_len--;
 +                                              }
 +                                      }
 +                              } else {
 +                                      if (stat & OMAP_I2C_STAT_RRDY)
-                                               dev_err(dev->dev, "RDR IRQ while no data"
++                                              dev_err(dev->dev, "RRDY IRQ while no data "
 +                                                              "requested\n");
 +                                      if (stat & OMAP_I2C_STAT_RDR)
++                                              dev_err(dev->dev, "RDR IRQ while no data "
 +                                                              "requested\n");
 +                                      break;
                                }
 -                      } else
 -                              dev_err(dev->dev, "RRDY IRQ while no data "
 -                                              "requested\n");
 -                      omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RRDY);
 +                      }
 +                      omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR));
                        continue;
                }
 -              if (stat & OMAP_I2C_STAT_XRDY) {
 -                      w = 0;
 -                      if (dev->buf_len) {
 -                              w = *dev->buf++;
 -                              dev->buf_len--;
 +              if (stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)) {
 +                      u8 num_bytes = 1;
 +                      if (dev->fifo_size) {
 +                              num_bytes = (stat & OMAP_I2C_STAT_XRDY) ? dev->fifo_size :
 +                                              omap_i2c_read_reg(dev, OMAP_I2C_BUFSTAT_REG);
 +                      }
 +                      while (num_bytes) {
 +                              num_bytes--;
 +                              w = 0;
                                if (dev->buf_len) {
 -                                      w |= *dev->buf++ << 8;
 +                                      w = *dev->buf++;
                                        dev->buf_len--;
-                                               dev_err(dev->dev, "XRDY IRQ while no"
 +                                      /* Data reg from  2430 is 8 bit wide */
 +                                      if (!cpu_is_omap2430() &&
 +                                                      !cpu_is_omap34xx()) {
 +                                              if (dev->buf_len) {
 +                                                      w |= *dev->buf++ << 8;
 +                                                      dev->buf_len--;
 +                                              }
 +                                      }
 +                              } else {
 +                                      if (stat & OMAP_I2C_STAT_XRDY)
-                                               dev_err(dev->dev, "XDR IRQ while no"
++                                              dev_err(dev->dev, "XRDY IRQ while no "
 +                                                              "data to send\n");
 +                                      if (stat & OMAP_I2C_STAT_XDR)
++                                              dev_err(dev->dev, "XDR IRQ while no "
 +                                                              "data to send\n");
 +                                      break;
                                }
 -                      } else
 -                              dev_err(dev->dev, "XRDY IRQ while no "
 -                                      "data to send\n");
 -                      omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w);
 -                      omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XRDY);
 +                              omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w);
 +                      }
 +                      omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
                        continue;
                }
                if (stat & OMAP_I2C_STAT_ROVR) {