serial: 8250_dw: provide a filter for DMA channel detection
The channel IDs are set to -1 by default. It will prevent dmaengine from trying to provide the first free channel if it fails to allocate exclusive channel. This will fix an issue with ACPI enumerated UARTs that do not support DMA but still end up getting a DMA channel incorrectly. Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
fe95855539
commit
7fb8c56c7f
@@ -154,6 +154,14 @@ dw8250_do_pm(struct uart_port *port, unsigned int state, unsigned int old)
|
||||
pm_runtime_put_sync_suspend(port->dev);
|
||||
}
|
||||
|
||||
static bool dw8250_dma_filter(struct dma_chan *chan, void *param)
|
||||
{
|
||||
struct dw8250_data *data = param;
|
||||
|
||||
return chan->chan_id == data->dma.tx_chan_id ||
|
||||
chan->chan_id == data->dma.rx_chan_id;
|
||||
}
|
||||
|
||||
static void dw8250_setup_port(struct uart_8250_port *up)
|
||||
{
|
||||
struct uart_port *p = &up->port;
|
||||
@@ -314,6 +322,12 @@ static int dw8250_probe(struct platform_device *pdev)
|
||||
uart.port.uartclk = clk_get_rate(data->clk);
|
||||
}
|
||||
|
||||
data->dma.rx_chan_id = -1;
|
||||
data->dma.tx_chan_id = -1;
|
||||
data->dma.rx_param = data;
|
||||
data->dma.tx_param = data;
|
||||
data->dma.fn = dw8250_dma_filter;
|
||||
|
||||
uart.port.iotype = UPIO_MEM;
|
||||
uart.port.serial_in = dw8250_serial_in;
|
||||
uart.port.serial_out = dw8250_serial_out;
|
||||
|
||||
Reference in New Issue
Block a user