Commit c73942e2 authored by Heikki Krogerus's avatar Heikki Krogerus Committed by Greg Kroah-Hartman

serial: 8250_dw: proper support for UARTs without busy functionality

If the DW_apb_uart is configured with UART_16550_COMPATIBLE
configuration parameter set, then the Busy Functionality is
not available. These UARTs will never generate the Busy
detect indication interrupt, and therefore don't need
handling for it.

This creates a small optimization for the DW_apb_uarts
configured without the busy functionality, but more
importantly, it removes the small but real risk of hitting
potential issues caused by busy functionality handling when
no busy functionality exist.
Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9e08fa50
...@@ -15,6 +15,9 @@ The supplying peripheral clock can also be handled, needing a second property ...@@ -15,6 +15,9 @@ The supplying peripheral clock can also be handled, needing a second property
Required elements: "baudclk", "apb_pclk" Required elements: "baudclk", "apb_pclk"
Optional properties: Optional properties:
- snps,uart-16550-compatible : reflects the value of UART_16550_COMPATIBLE
configuration parameter. Define this if your UART does not implement the busy
functionality.
- resets : phandle to the parent reset controller. - resets : phandle to the parent reset controller.
- reg-shift : quantity to shift the register offsets by. If this property is - reg-shift : quantity to shift the register offsets by. If this property is
not present then the register offsets are not shifted. not present then the register offsets are not shifted.
......
...@@ -65,6 +65,7 @@ struct dw8250_data { ...@@ -65,6 +65,7 @@ struct dw8250_data {
struct uart_8250_dma dma; struct uart_8250_dma dma;
unsigned int skip_autocfg:1; unsigned int skip_autocfg:1;
unsigned int uart_16550_compatible:1;
}; };
#define BYT_PRV_CLK 0x800 #define BYT_PRV_CLK 0x800
...@@ -317,8 +318,9 @@ static void dw8250_quirks(struct uart_port *p, struct dw8250_data *data) ...@@ -317,8 +318,9 @@ static void dw8250_quirks(struct uart_port *p, struct dw8250_data *data)
p->iotype = UPIO_MEM32; p->iotype = UPIO_MEM32;
p->regshift = 2; p->regshift = 2;
p->serial_in = dw8250_serial_in32; p->serial_in = dw8250_serial_in32;
p->serial_out = dw8250_serial_out32;
p->set_termios = dw8250_set_termios; p->set_termios = dw8250_set_termios;
/* So far none of there implement the Busy Functionality */
data->uart_16550_compatible = true;
} }
/* Platforms with iDMA */ /* Platforms with iDMA */
...@@ -375,6 +377,9 @@ static int dw8250_probe(struct platform_device *pdev) ...@@ -375,6 +377,9 @@ static int dw8250_probe(struct platform_device *pdev)
data->usr_reg = DW_UART_USR; data->usr_reg = DW_UART_USR;
p->private_data = data; p->private_data = data;
data->uart_16550_compatible = device_property_read_bool(p->dev,
"snps,uart-16550-compatible");
err = device_property_read_u32(p->dev, "reg-shift", &val); err = device_property_read_u32(p->dev, "reg-shift", &val);
if (!err) if (!err)
p->regshift = val; p->regshift = val;
...@@ -461,6 +466,12 @@ static int dw8250_probe(struct platform_device *pdev) ...@@ -461,6 +466,12 @@ static int dw8250_probe(struct platform_device *pdev)
dw8250_quirks(p, data); dw8250_quirks(p, data);
/* If the Busy Functionality is not implemented, don't handle it */
if (data->uart_16550_compatible) {
p->serial_out = NULL;
p->handle_irq = NULL;
}
if (!data->skip_autocfg) if (!data->skip_autocfg)
dw8250_setup_port(&uart); dw8250_setup_port(&uart);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment