static int usbvision_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num) { struct i2c_msg *pmsg; struct usb_usbvision *usbvision; int i, ret; unsigned char addr = 0; usbvision = (struct usb_usbvision *)i2c_get_adapdata(i2c_adap); for (i = 0; i < num; i++) { pmsg = &msgs[i]; ret = usb_find_address(i2c_adap, pmsg, i2c_adap->retries, &addr); if (ret != 0) { PDEBUG(DBG_I2C, "got NAK from device, message #%d", i); return (ret < 0) ? ret : -EREMOTEIO; } if (pmsg->flags & I2C_M_RD) { /* */ ret = (usbvision_i2c_read(usbvision, addr, pmsg->buf, pmsg->len)); if (ret < pmsg->len) return (ret < 0) ? ret : -EREMOTEIO; } else { /* */ ret = (usbvision_i2c_write(usbvision, addr, pmsg->buf, pmsg->len)); if (ret < pmsg->len) return (ret < 0) ? ret : -EREMOTEIO; } } return num; }
static inline int try_read_address(struct i2c_adapter *i2c_adap, unsigned char addr, int retries) { struct usb_usbvision *usbvision; int i, ret = -1; char buf[4]; usbvision = (struct usb_usbvision *)i2c_get_adapdata(i2c_adap); for (i = 0; i <= retries; i++) { ret = (usbvision_i2c_read(usbvision, addr, buf, 1)); if (ret == 1) break; /* success! */ udelay(5); if (i == retries) /* no success */ break; udelay(10); } if (i) { PDEBUG(DBG_I2C,"Needed %d retries for address %#2x", i, addr); PDEBUG(DBG_I2C,"Maybe there's no device at this address"); } return ret; }