serial: pl011: Add device tree support for RX DMA polling

Add equivalent attributes to those provided in the platform data
for use when RX DMA is enabled.

Signed-off-by: Andrew Jackson <Andrew.Jackson@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Andrew Jackson 2014-11-07 14:14:23 +00:00 committed by Greg Kroah-Hartman
parent 2d3b7d6e7d
commit 98267d33e2
2 changed files with 30 additions and 9 deletions

View File

@ -6,12 +6,17 @@ Required properties:
- interrupts: exactly one interrupt specifier - interrupts: exactly one interrupt specifier
Optional properties: Optional properties:
- pinctrl: When present, must have one state named "sleep" - pinctrl: When present, must have one state named "sleep"
and one state named "default" and one state named "default"
- clocks: When present, must refer to exactly one clock named - clocks: When present, must refer to exactly one clock named
"apb_pclk" "apb_pclk"
- dmas: When present, may have one or two dma channels. - dmas: When present, may have one or two dma channels.
The first one must be named "rx", the second one The first one must be named "rx", the second one
must be named "tx". must be named "tx".
- auto-poll: Enables polling when using RX DMA.
- poll-rate-ms: Rate at which poll occurs when auto-poll is set,
default 100ms.
- poll-timeout-ms: Poll timeout when auto-poll is set, default
3000ms.
See also bindings/arm/primecell.txt See also bindings/arm/primecell.txt

View File

@ -341,6 +341,7 @@ static void pl011_dma_probe_initcall(struct device *dev, struct uart_amba_port *
dmaengine_slave_config(chan, &rx_conf); dmaengine_slave_config(chan, &rx_conf);
uap->dmarx.chan = chan; uap->dmarx.chan = chan;
uap->dmarx.auto_poll_rate = false;
if (plat && plat->dma_rx_poll_enable) { if (plat && plat->dma_rx_poll_enable) {
/* Set poll rate if specified. */ /* Set poll rate if specified. */
if (plat->dma_rx_poll_rate) { if (plat->dma_rx_poll_rate) {
@ -361,9 +362,24 @@ static void pl011_dma_probe_initcall(struct device *dev, struct uart_amba_port *
plat->dma_rx_poll_timeout; plat->dma_rx_poll_timeout;
else else
uap->dmarx.poll_timeout = 3000; uap->dmarx.poll_timeout = 3000;
} else } else if (!plat && dev->of_node) {
uap->dmarx.auto_poll_rate = false; uap->dmarx.auto_poll_rate = of_property_read_bool(
dev->of_node, "auto-poll");
if (uap->dmarx.auto_poll_rate) {
u32 x;
if (0 == of_property_read_u32(dev->of_node,
"poll-rate-ms", &x))
uap->dmarx.poll_rate = x;
else
uap->dmarx.poll_rate = 100;
if (0 == of_property_read_u32(dev->of_node,
"poll-timeout-ms", &x))
uap->dmarx.poll_timeout = x;
else
uap->dmarx.poll_timeout = 3000;
}
}
dev_info(uap->port.dev, "DMA channel RX %s\n", dev_info(uap->port.dev, "DMA channel RX %s\n",
dma_chan_name(uap->dmarx.chan)); dma_chan_name(uap->dmarx.chan));
} }