Skip to content

Commit 56fff1b

Browse files
committed
Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c fixes from Wolfram Sang: "Fix the i2c-designware regression of rc2. Also, a DMA buffer fix for the tiny-usb driver where the USB core now loudly complains about the non DMA-capable buffer" [ I had cherry-picked the designware fix separately because it hit my laptop, but here is the proper sync with the i2c tree - Linus ] * 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: designware: Fix bogus sda_hold_time due to uninitialized vars i2c: i2c-tiny-usb: fix buffer not being DMA capable
2 parents fde8e33 + e2c8249 commit 56fff1b

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

drivers/i2c/busses/i2c-tiny-usb.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,22 +178,39 @@ static int usb_read(struct i2c_adapter *adapter, int cmd,
178178
int value, int index, void *data, int len)
179179
{
180180
struct i2c_tiny_usb *dev = (struct i2c_tiny_usb *)adapter->algo_data;
181+
void *dmadata = kmalloc(len, GFP_KERNEL);
182+
int ret;
183+
184+
if (!dmadata)
185+
return -ENOMEM;
181186

182187
/* do control transfer */
183-
return usb_control_msg(dev->usb_dev, usb_rcvctrlpipe(dev->usb_dev, 0),
188+
ret = usb_control_msg(dev->usb_dev, usb_rcvctrlpipe(dev->usb_dev, 0),
184189
cmd, USB_TYPE_VENDOR | USB_RECIP_INTERFACE |
185-
USB_DIR_IN, value, index, data, len, 2000);
190+
USB_DIR_IN, value, index, dmadata, len, 2000);
191+
192+
memcpy(data, dmadata, len);
193+
kfree(dmadata);
194+
return ret;
186195
}
187196

188197
static int usb_write(struct i2c_adapter *adapter, int cmd,
189198
int value, int index, void *data, int len)
190199
{
191200
struct i2c_tiny_usb *dev = (struct i2c_tiny_usb *)adapter->algo_data;
201+
void *dmadata = kmemdup(data, len, GFP_KERNEL);
202+
int ret;
203+
204+
if (!dmadata)
205+
return -ENOMEM;
192206

193207
/* do control transfer */
194-
return usb_control_msg(dev->usb_dev, usb_sndctrlpipe(dev->usb_dev, 0),
208+
ret = usb_control_msg(dev->usb_dev, usb_sndctrlpipe(dev->usb_dev, 0),
195209
cmd, USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
196-
value, index, data, len, 2000);
210+
value, index, dmadata, len, 2000);
211+
212+
kfree(dmadata);
213+
return ret;
197214
}
198215

199216
static void i2c_tiny_usb_free(struct i2c_tiny_usb *dev)

0 commit comments

Comments
 (0)