Patch "serial: sc16is7xx: fix broken port 0 uart init" has been added to the 5.4-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    serial: sc16is7xx: fix broken port 0 uart init

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     serial-sc16is7xx-fix-broken-port-0-uart-init.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit cd7d91af8b9cd8bc0567238d254997ff56af2634
Author: Hugo Villeneuve <hvilleneuve@xxxxxxxxxxxx>
Date:   Mon Aug 7 17:45:51 2023 -0400

    serial: sc16is7xx: fix broken port 0 uart init
    
    [ Upstream commit 2861ed4d6e6d1a2c9de9bf5b0abd996c2dc673d0 ]
    
    The sc16is7xx_config_rs485() function is called only for the second
    port (index 1, channel B), causing initialization problems for the
    first port.
    
    For the sc16is7xx driver, port->membase and port->mapbase are not set,
    and their default values are 0. And we set port->iobase to the device
    index. This means that when the first device is registered using the
    uart_add_one_port() function, the following values will be in the port
    structure:
        port->membase = 0
        port->mapbase = 0
        port->iobase  = 0
    
    Therefore, the function uart_configure_port() in serial_core.c will
    exit early because of the following check:
            /*
             * If there isn't a port here, don't do anything further.
             */
            if (!port->iobase && !port->mapbase && !port->membase)
                    return;
    
    Typically, I2C and SPI drivers do not set port->membase and
    port->mapbase.
    
    The max310x driver sets port->membase to ~0 (all ones). By
    implementing the same change in this driver, uart_configure_port() is
    now correctly executed for all ports.
    
    Fixes: dfeae619d781 ("serial: sc16is7xx")
    Cc: stable@xxxxxxxxxxxxxxx
    Signed-off-by: Hugo Villeneuve <hvilleneuve@xxxxxxxxxxxx>
    Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
    Reviewed-by: Lech Perczak <lech.perczak@xxxxxxxxxxxxxxx>
    Tested-by: Lech Perczak <lech.perczak@xxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230807214556.540627-2-hugo@xxxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c
index 9b68725d4e9ba..091cf5fe90304 100644
--- a/drivers/tty/serial/sc16is7xx.c
+++ b/drivers/tty/serial/sc16is7xx.c
@@ -1271,6 +1271,12 @@ static int sc16is7xx_probe(struct device *dev,
 		s->p[i].port.fifosize	= SC16IS7XX_FIFO_SIZE;
 		s->p[i].port.flags	= UPF_FIXED_TYPE | UPF_LOW_LATENCY;
 		s->p[i].port.iobase	= i;
+		/*
+		 * Use all ones as membase to make sure uart_configure_port() in
+		 * serial_core.c does not abort for SPI/I2C devices where the
+		 * membase address is not applicable.
+		 */
+		s->p[i].port.membase	= (void __iomem *)~0;
 		s->p[i].port.iotype	= UPIO_PORT;
 		s->p[i].port.uartclk	= freq;
 		s->p[i].port.rs485_config = sc16is7xx_config_rs485;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux