Re: [PATCH] Enable OMAP UART port UPF_BOOT_AUTOCONF auto-configuration

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Peter,

On 2016-02-03 00:16, Peter Hurley wrote:
Won't this turn on h/w flow control for designs where RTS/CTS
is unconnected?

I don't believe so. What I believe it will do is flag the physical device as being capable of supporting H/W flow control, which all devices supported by omap-serial.c are. It will not enable h/w flow control, as you may or may not want it for your particular setup. You may have a UART that supports h/w flow control, but not physical wire connection for RTS signal.

My understanding of the code is that this code

    if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW) {
        /* Enable AUTORTS and AUTOCTS */
        up->efr |= UART_EFR_CTS | UART_EFR_RTS;

in serial_omap_set_termios() will mean that h/w flow control will not be enabled unless requested via termios.

In fact, without the UPF_HARD_FLOW flag set in the up->port.flags, it is not possible to enable h/w flow-control, and any request to do so via termios will silently fail.

Without this UPF_BOOT_AUTOCONF flag set, the serial_omap_config_port() configuration function is never called for the omap-serial device. This function is written and has the code to enable UPF_SOFT_FLOW and UPF_HARD_FLOW, as well as to flag the port as type = PORT_OMAP. However it is (I presume accidentally) dead code without the UPF_BOOT_AUTOCONF flag. This is because the call to the serial_omap_config_port() function is protected in serial_core.c by a test for the flag UPF_BOOT_AUTOCONF .

 if (port->flags & UPF_BOOT_AUTOCONF) {
        if (!(port->flags & UPF_FIXED_TYPE)) {
            port->type = PORT_UNKNOWN;
            flags |= UART_CONFIG_TYPE;
        }
port->ops->config_port(port, flags); // this is a pointer to the device specific configuration function, serial_omap_config_port in this case
    }

You can compare this to the behaviour of the 8250/8250_core.c driver, which I think (but am unsure) that the omap-serial driver was based on.

It's serial8250_register_8250_port function (called by serial8250_probe()), specifically sets the UPF_BOOT_AUTOCONF flag. As do many of the other serial drivers.

uart->port.flags        = up->port.flags | UPF_BOOT_AUTOCONF;

Without this patch, we are not able to turn on h/w flow control.

Thanks,

Greg


On 2016-02-03 00:16, Peter Hurley wrote:
On 01/25/2016 04:00 AM, Greg Farrell wrote:

Enable the UPF_BOOT_AUTOCONF flag in serial_omap_probe().
This will cause serial_omap_config_port() to be run and
the hardware to correctly be flagged as supporting hardware
and software flow-control.

Without this, it is not possible to enable flow control.

Won't this turn on h/w flow control for designs where RTS/CTS
is unconnected?


Signed-off-by: Greg Farrell <greg@xxxxxxxxxxxxxxx>
---
 drivers/tty/serial/omap-serial.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index b645f92..5e82238 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -1664,7 +1664,10 @@ static int serial_omap_probe(struct platform_device *pdev)
    sprintf(up->name, "OMAP UART%d", up->port.line);
    up->port.mapbase = mem->start;
    up->port.membase = base;
-   up->port.flags = omap_up_info->flags;
+   /*
+ * Enable UPF_BOOT_AUTOCONF so that serial_omap_config_port will execute
+    */
+   up->port.flags = omap_up_info->flags | UPF_BOOT_AUTOCONF;
    up->port.uartclk = omap_up_info->uartclk;
    up->port.rs485_config = serial_omap_config_rs485;
    if (!up->port.uartclk) {

--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux