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
This commit is contained in:
commit
56fff1bb0f
@ -178,22 +178,39 @@ static int usb_read(struct i2c_adapter *adapter, int cmd,
|
|||||||
int value, int index, void *data, int len)
|
int value, int index, void *data, int len)
|
||||||
{
|
{
|
||||||
struct i2c_tiny_usb *dev = (struct i2c_tiny_usb *)adapter->algo_data;
|
struct i2c_tiny_usb *dev = (struct i2c_tiny_usb *)adapter->algo_data;
|
||||||
|
void *dmadata = kmalloc(len, GFP_KERNEL);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!dmadata)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
/* do control transfer */
|
/* do control transfer */
|
||||||
return usb_control_msg(dev->usb_dev, usb_rcvctrlpipe(dev->usb_dev, 0),
|
ret = usb_control_msg(dev->usb_dev, usb_rcvctrlpipe(dev->usb_dev, 0),
|
||||||
cmd, USB_TYPE_VENDOR | USB_RECIP_INTERFACE |
|
cmd, USB_TYPE_VENDOR | USB_RECIP_INTERFACE |
|
||||||
USB_DIR_IN, value, index, data, len, 2000);
|
USB_DIR_IN, value, index, dmadata, len, 2000);
|
||||||
|
|
||||||
|
memcpy(data, dmadata, len);
|
||||||
|
kfree(dmadata);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_write(struct i2c_adapter *adapter, int cmd,
|
static int usb_write(struct i2c_adapter *adapter, int cmd,
|
||||||
int value, int index, void *data, int len)
|
int value, int index, void *data, int len)
|
||||||
{
|
{
|
||||||
struct i2c_tiny_usb *dev = (struct i2c_tiny_usb *)adapter->algo_data;
|
struct i2c_tiny_usb *dev = (struct i2c_tiny_usb *)adapter->algo_data;
|
||||||
|
void *dmadata = kmemdup(data, len, GFP_KERNEL);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!dmadata)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
/* do control transfer */
|
/* do control transfer */
|
||||||
return usb_control_msg(dev->usb_dev, usb_sndctrlpipe(dev->usb_dev, 0),
|
ret = usb_control_msg(dev->usb_dev, usb_sndctrlpipe(dev->usb_dev, 0),
|
||||||
cmd, USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
|
cmd, USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
|
||||||
value, index, data, len, 2000);
|
value, index, dmadata, len, 2000);
|
||||||
|
|
||||||
|
kfree(dmadata);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void i2c_tiny_usb_free(struct i2c_tiny_usb *dev)
|
static void i2c_tiny_usb_free(struct i2c_tiny_usb *dev)
|
||||||
|
Loading…
Reference in New Issue
Block a user