Merge branch 'for-linus' of git://git.infradead.org/users/vkoul/slave-dma
[linux-2.6-block.git] / drivers / tty / serial / 8250 / 8250_pci.c
index 4f1cd296f1b13bb4a56d55f5b5e96d76a2a0b6fe..beb9d71cd47ae499cc6e9bc585f8affe16d1d8ad 100644 (file)
@@ -25,6 +25,9 @@
 #include <asm/byteorder.h>
 #include <asm/io.h>
 
+#include <linux/dmaengine.h>
+#include <linux/platform_data/dma-dw.h>
+
 #include "8250.h"
 
 /*
@@ -1349,6 +1352,9 @@ ce4100_serial_setup(struct serial_private *priv,
 #define PCI_DEVICE_ID_INTEL_BYT_UART1  0x0f0a
 #define PCI_DEVICE_ID_INTEL_BYT_UART2  0x0f0c
 
+#define PCI_DEVICE_ID_INTEL_BSW_UART1  0x228a
+#define PCI_DEVICE_ID_INTEL_BSW_UART2  0x228c
+
 #define BYT_PRV_CLK                    0x800
 #define BYT_PRV_CLK_EN                 (1 << 0)
 #define BYT_PRV_CLK_M_VAL_SHIFT                1
@@ -1414,7 +1420,13 @@ byt_set_termios(struct uart_port *p, struct ktermios *termios,
 
 static bool byt_dma_filter(struct dma_chan *chan, void *param)
 {
-       return chan->chan_id == *(int *)param;
+       struct dw_dma_slave *dws = param;
+
+       if (dws->dma_dev != chan->device->dev)
+               return false;
+
+       chan->private = dws;
+       return true;
 }
 
 static int
@@ -1422,35 +1434,57 @@ byt_serial_setup(struct serial_private *priv,
                 const struct pciserial_board *board,
                 struct uart_8250_port *port, int idx)
 {
+       struct pci_dev *pdev = priv->dev;
+       struct device *dev = port->port.dev;
        struct uart_8250_dma *dma;
+       struct dw_dma_slave *tx_param, *rx_param;
+       struct pci_dev *dma_dev;
        int ret;
 
-       dma = devm_kzalloc(port->port.dev, sizeof(*dma), GFP_KERNEL);
+       dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL);
        if (!dma)
                return -ENOMEM;
 
-       switch (priv->dev->device) {
+       tx_param = devm_kzalloc(dev, sizeof(*tx_param), GFP_KERNEL);
+       if (!tx_param)
+               return -ENOMEM;
+
+       rx_param = devm_kzalloc(dev, sizeof(*rx_param), GFP_KERNEL);
+       if (!rx_param)
+               return -ENOMEM;
+
+       switch (pdev->device) {
        case PCI_DEVICE_ID_INTEL_BYT_UART1:
-               dma->rx_chan_id = 3;
-               dma->tx_chan_id = 2;
+       case PCI_DEVICE_ID_INTEL_BSW_UART1:
+               rx_param->src_id = 3;
+               tx_param->dst_id = 2;
                break;
        case PCI_DEVICE_ID_INTEL_BYT_UART2:
-               dma->rx_chan_id = 5;
-               dma->tx_chan_id = 4;
+       case PCI_DEVICE_ID_INTEL_BSW_UART2:
+               rx_param->src_id = 5;
+               tx_param->dst_id = 4;
                break;
        default:
                return -EINVAL;
        }
 
-       dma->rxconf.slave_id = dma->rx_chan_id;
+       rx_param->src_master = 1;
+       rx_param->dst_master = 0;
+
        dma->rxconf.src_maxburst = 16;
 
-       dma->txconf.slave_id = dma->tx_chan_id;
+       tx_param->src_master = 1;
+       tx_param->dst_master = 0;
+
        dma->txconf.dst_maxburst = 16;
 
+       dma_dev = pci_get_slot(pdev->bus, PCI_DEVFN(PCI_SLOT(pdev->devfn), 0));
+       rx_param->dma_dev = &dma_dev->dev;
+       tx_param->dma_dev = &dma_dev->dev;
+
        dma->fn = byt_dma_filter;
-       dma->rx_param = &dma->rx_chan_id;
-       dma->tx_param = &dma->tx_chan_id;
+       dma->rx_param = rx_param;
+       dma->tx_param = tx_param;
 
        ret = pci_default_setup(priv, board, port, idx);
        port->port.iotype = UPIO_MEM;
@@ -1893,6 +1927,20 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
                .subdevice      = PCI_ANY_ID,
                .setup          = pci_default_setup,
        },
+       {
+               .vendor         = PCI_VENDOR_ID_INTEL,
+               .device         = PCI_DEVICE_ID_INTEL_BSW_UART1,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = byt_serial_setup,
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_INTEL,
+               .device         = PCI_DEVICE_ID_INTEL_BSW_UART2,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = byt_serial_setup,
+       },
        /*
         * ITE
         */
@@ -5192,6 +5240,14 @@ static struct pci_device_id serial_pci_tbl[] = {
                PCI_ANY_ID,  PCI_ANY_ID,
                PCI_CLASS_COMMUNICATION_SERIAL << 8, 0xff0000,
                pbn_byt },
+       {       PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BSW_UART1,
+               PCI_ANY_ID,  PCI_ANY_ID,
+               PCI_CLASS_COMMUNICATION_SERIAL << 8, 0xff0000,
+               pbn_byt },
+       {       PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BSW_UART2,
+               PCI_ANY_ID,  PCI_ANY_ID,
+               PCI_CLASS_COMMUNICATION_SERIAL << 8, 0xff0000,
+               pbn_byt },
 
        /*
         * Intel Quark x1000