|
@@ -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;
|
|
|
|