serial: 8250_dw: support ACPI platforms with integrated DMA engine
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>
Tue, 26 May 2015 12:59:32 +0000 (15:59 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 31 May 2015 21:55:12 +0000 (06:55 +0900)
On many new Intel SoCs the UART has an integrated DMA engine
(iDMA). In order to use it a special filter function is needed.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_dw.c

index 176f18f2e3ab5e16013ebcf7a71e7db2e85cd7db..d48b50641e9a6c63ed874399f6b587ccd844556d 100644 (file)
@@ -377,6 +377,16 @@ static int dw8250_probe_of(struct uart_port *p,
        return 0;
 }
 
+static bool dw8250_idma_filter(struct dma_chan *chan, void *param)
+{
+       struct device *dev = param;
+
+       if (dev != chan->device->dev->parent)
+               return false;
+
+       return true;
+}
+
 static int dw8250_probe_acpi(struct uart_8250_port *up,
                             struct dw8250_data *data)
 {
@@ -389,8 +399,15 @@ static int dw8250_probe_acpi(struct uart_8250_port *up,
        p->serial_out = dw8250_serial_out32;
        p->regshift = 2;
 
-       up->dma = &data->dma;
+       /* Platforms with iDMA */
+       if (platform_get_resource_byname(to_platform_device(up->port.dev),
+                                        IORESOURCE_MEM, "lpss_priv")) {
+               data->dma.rx_param = up->port.dev->parent;
+               data->dma.tx_param = up->port.dev->parent;
+               data->dma.fn = dw8250_idma_filter;
+       }
 
+       up->dma = &data->dma;
        up->dma->rxconf.src_maxburst = p->fifosize / 4;
        up->dma->txconf.dst_maxburst = p->fifosize / 4;