/* * 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; }