/* * Prepare controller for a transaction and call i2c_davinci_xfer_msg */ static int i2c_davinci_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], int num) { struct davinci_i2c_dev *dev = bus->priv; int i; int ret; i2c_dbg("%s: msgs: %d\n", __func__, num); ret = i2c_davinci_wait_bus_not_busy(dev, 1); if (ret < 0) { i2c_dbg("timeout waiting for bus ready\n"); return ret; } for (i = 0; i < num; i++) { ret = i2c_davinci_xfer_msg(bus, &msgs[i], (i == (num - 1))); i2c_dbg("%s [%d/%d] ret: %d\n", __func__, i + 1, num, ret); if (ret < 0) return ret; } return num; }
/* * Prepare controller for a transaction and call i2c_davinci_xfer_msg */ static int i2c_davinci_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) { int count; int ret = 0; char retries = 5; DEB1("msgs: %d", num); if (num < 1 || num > MAX_MESSAGES) return -EINVAL; /* Check for valid parameters in messages */ for (count = 0; count < num; count++) if (msgs[count].buf == NULL) return -EINVAL; if ((ret = i2c_davinci_wait_for_bb(1, adap)) < 0) return ret; for (count = 0; count < num; count++) { DEB1("msg: %d, addr: 0x%04x, len: %d, flags: 0x%x", count, msgs[count].addr, msgs[count].len, msgs[count].flags); do { ret = i2c_davinci_xfer_msg(adap, &msgs[count], (count == (num - 1))); if (ret < 0) { struct i2c_davinci_device *dev = i2c_get_adapdata(adap); DEB1("i2c: retry %d - icstr = 0x%x", retries, dev->regs->icstr); mdelay (1); retries--; } else break; } while (retries); DEB1("ret: %d", ret); if (ret != msgs[count].len) break; } if (ret >= 0 && num >= 1) ret = num; DEB1("ret: %d", ret); return ret; }
/* * Prepare controller for a transaction and call i2c_davinci_xfer_msg */ static int i2c_davinci_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) { int count; int ret = 0; DEB1("msgs: %d", num); if (num < 1 || num > MAX_MESSAGES) return -EINVAL; /* Check for valid parameters in messages */ for (count = 0; count < num; count++) if (msgs[count].buf == NULL) return -EINVAL; if ((ret = i2c_davinci_wait_for_bb(1)) < 0) return ret; for (count = 0; count < num; count++) { DEB1("msg: %d, addr: 0x%04x, len: %d, flags: 0x%x", count, msgs[count].addr, msgs[count].len, msgs[count].flags); ret = i2c_davinci_xfer_msg(adap, &msgs[count], (count == (num - 1))); DEB1("ret: %d", ret); if (ret != msgs[count].len) break; } if (ret >= 0 && num > 1) ret = num; DEB1("ret xfer: %d", ret); return ret; }