|
@@ -89,9 +89,13 @@ struct technisat_usb2_state {
|
|
|
static int technisat_usb2_i2c_access(struct usb_device *udev,
|
|
|
u8 device_addr, u8 *tx, u8 txlen, u8 *rx, u8 rxlen)
|
|
|
{
|
|
|
- u8 b[64];
|
|
|
+ u8 *b;
|
|
|
int ret, actual_length;
|
|
|
|
|
|
+ b = kmalloc(64, GFP_KERNEL);
|
|
|
+ if (!b)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
deb_i2c("i2c-access: %02x, tx: ", device_addr);
|
|
|
debug_dump(tx, txlen, deb_i2c);
|
|
|
deb_i2c(" ");
|
|
@@ -123,7 +127,7 @@ static int technisat_usb2_i2c_access(struct usb_device *udev,
|
|
|
|
|
|
if (ret < 0) {
|
|
|
err("i2c-error: out failed %02x = %d", device_addr, ret);
|
|
|
- return -ENODEV;
|
|
|
+ goto err;
|
|
|
}
|
|
|
|
|
|
ret = usb_bulk_msg(udev,
|
|
@@ -131,7 +135,7 @@ static int technisat_usb2_i2c_access(struct usb_device *udev,
|
|
|
b, 64, &actual_length, 1000);
|
|
|
if (ret < 0) {
|
|
|
err("i2c-error: in failed %02x = %d", device_addr, ret);
|
|
|
- return -ENODEV;
|
|
|
+ goto err;
|
|
|
}
|
|
|
|
|
|
if (b[0] != I2C_STATUS_OK) {
|
|
@@ -140,7 +144,7 @@ static int technisat_usb2_i2c_access(struct usb_device *udev,
|
|
|
if (!(b[0] == I2C_STATUS_NAK &&
|
|
|
device_addr == 0x60
|
|
|
/* && device_is_technisat_usb2 */))
|
|
|
- return -ENODEV;
|
|
|
+ goto err;
|
|
|
}
|
|
|
|
|
|
deb_i2c("status: %d, ", b[0]);
|
|
@@ -154,7 +158,9 @@ static int technisat_usb2_i2c_access(struct usb_device *udev,
|
|
|
|
|
|
deb_i2c("\n");
|
|
|
|
|
|
- return 0;
|
|
|
+err:
|
|
|
+ kfree(b);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static int technisat_usb2_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
|