serial: pl011: Don't enable RX DMA if residue processing not supported
authorAndrew Jackson <Andrew.Jackson@arm.com>
Fri, 7 Nov 2014 14:14:47 +0000 (14:14 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Nov 2014 16:35:56 +0000 (08:35 -0800)
If the DMA engine doesn't support residue processing then the RX DMA
handling won't work terribly well if polling is enabled.  So, disable
RX DMA if residue handling isn't available.

Signed-off-by: Andrew Jackson <Andrew.Jackson@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/amba-pl011.c

index 55dc00d..d984a97 100644 (file)
@@ -322,7 +322,22 @@ static void pl011_dma_probe_initcall(struct device *dev, struct uart_amba_port *
                        .src_maxburst = uap->fifosize >> 2,
                        .device_fc = false,
                };
+               struct dma_slave_caps caps;
 
+               /*
+                * Some DMA controllers provide information on their capabilities.
+                * If the controller does, check for suitable residue processing
+                * otherwise assime all is well.
+                */
+               if (0 == dma_get_slave_caps(chan, &caps)) {
+                       if (caps.residue_granularity ==
+                                       DMA_RESIDUE_GRANULARITY_DESCRIPTOR) {
+                               dma_release_channel(chan);
+                               dev_info(uap->port.dev,
+                                       "RX DMA disabled - no residue processing\n");
+                               return;
+                       }
+               }
                dmaengine_slave_config(chan, &rx_conf);
                uap->dmarx.chan = chan;