--- /dev/null
+From 5165da5923d6c7df6f2927b0113b2e4d9288661e Mon Sep 17 00:00:00 2001
+From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
+Date: Fri, 5 May 2017 11:06:50 +0200
+Subject: i2c: i2c-tiny-usb: fix buffer not being DMA capable
+
+From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
+
+commit 5165da5923d6c7df6f2927b0113b2e4d9288661e upstream.
+
+Since v4.9 i2c-tiny-usb generates the below call trace
+and longer works, since it can't communicate with the
+USB device. The reason is, that since v4.9 the USB
+stack checks, that the buffer it should transfer is DMA
+capable. This was a requirement since v2.2 days, but it
+usually worked nevertheless.
+
+[ 17.504959] ------------[ cut here ]------------
+[ 17.505488] WARNING: CPU: 0 PID: 93 at drivers/usb/core/hcd.c:1587 usb_hcd_map_urb_for_dma+0x37c/0x570
+[ 17.506545] transfer buffer not dma capable
+[ 17.507022] Modules linked in:
+[ 17.507370] CPU: 0 PID: 93 Comm: i2cdetect Not tainted 4.11.0-rc8+ #10
+[ 17.508103] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1 04/01/2014
+[ 17.509039] Call Trace:
+[ 17.509320] ? dump_stack+0x5c/0x78
+[ 17.509714] ? __warn+0xbe/0xe0
+[ 17.510073] ? warn_slowpath_fmt+0x5a/0x80
+[ 17.510532] ? nommu_map_sg+0xb0/0xb0
+[ 17.510949] ? usb_hcd_map_urb_for_dma+0x37c/0x570
+[ 17.511482] ? usb_hcd_submit_urb+0x336/0xab0
+[ 17.511976] ? wait_for_completion_timeout+0x12f/0x1a0
+[ 17.512549] ? wait_for_completion_timeout+0x65/0x1a0
+[ 17.513125] ? usb_start_wait_urb+0x65/0x160
+[ 17.513604] ? usb_control_msg+0xdc/0x130
+[ 17.514061] ? usb_xfer+0xa4/0x2a0
+[ 17.514445] ? __i2c_transfer+0x108/0x3c0
+[ 17.514899] ? i2c_transfer+0x57/0xb0
+[ 17.515310] ? i2c_smbus_xfer_emulated+0x12f/0x590
+[ 17.515851] ? _raw_spin_unlock_irqrestore+0x11/0x20
+[ 17.516408] ? i2c_smbus_xfer+0x125/0x330
+[ 17.516876] ? i2c_smbus_xfer+0x125/0x330
+[ 17.517329] ? i2cdev_ioctl_smbus+0x1c1/0x2b0
+[ 17.517824] ? i2cdev_ioctl+0x75/0x1c0
+[ 17.518248] ? do_vfs_ioctl+0x9f/0x600
+[ 17.518671] ? vfs_write+0x144/0x190
+[ 17.519078] ? SyS_ioctl+0x74/0x80
+[ 17.519463] ? entry_SYSCALL_64_fastpath+0x1e/0xad
+[ 17.519959] ---[ end trace d047c04982f5ac50 ]---
+
+Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
+Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Acked-by: Till Harbaum <till@harbaum.org>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/i2c/busses/i2c-tiny-usb.c | 25 +++++++++++++++++++++----
+ 1 file changed, 21 insertions(+), 4 deletions(-)
+
+--- a/drivers/i2c/busses/i2c-tiny-usb.c
++++ b/drivers/i2c/busses/i2c-tiny-usb.c
+@@ -178,22 +178,39 @@ static int usb_read(struct i2c_adapter *
+ int value, int index, void *data, int len)
+ {
+ 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 */
+- 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 |
+- 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,
+ int value, int index, void *data, int len)
+ {
+ 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 */
+- 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,
+- 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)
--- /dev/null
+From f5f968f2371ccdebb8a365487649673c9af68d09 Mon Sep 17 00:00:00 2001
+From: Srinath Mannam <srinath.mannam@broadcom.com>
+Date: Thu, 18 May 2017 22:27:40 +0530
+Subject: mmc: sdhci-iproc: suppress spurious interrupt with Multiblock read
+
+From: Srinath Mannam <srinath.mannam@broadcom.com>
+
+commit f5f968f2371ccdebb8a365487649673c9af68d09 upstream.
+
+The stingray SDHCI hardware supports ACMD12 and automatically
+issues after multi block transfer completed.
+
+If ACMD12 in SDHCI is disabled, spurious tx done interrupts are seen
+on multi block read command with below error message:
+
+Got data interrupt 0x00000002 even though no data
+operation was in progress.
+
+This patch uses SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 to enable
+ACM12 support in SDHCI hardware and suppress spurious interrupt.
+
+Signed-off-by: Srinath Mannam <srinath.mannam@broadcom.com>
+Reviewed-by: Ray Jui <ray.jui@broadcom.com>
+Reviewed-by: Scott Branden <scott.branden@broadcom.com>
+Acked-by: Adrian Hunter <adrian.hunter@intel.com>
+Fixes: b580c52d58d9 ("mmc: sdhci-iproc: add IPROC SDHCI driver")
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/mmc/host/sdhci-iproc.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/mmc/host/sdhci-iproc.c
++++ b/drivers/mmc/host/sdhci-iproc.c
+@@ -156,7 +156,8 @@ static const struct sdhci_ops sdhci_ipro
+ };
+
+ static const struct sdhci_pltfm_data sdhci_iproc_pltfm_data = {
+- .quirks = SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK,
++ .quirks = SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
++ SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
+ .quirks2 = SDHCI_QUIRK2_ACMD23_BROKEN,
+ .ops = &sdhci_iproc_ops,
+ };