lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 602/779] serial: 8250_bcm7271: Save/restore RTS in suspend/resume
    Date
    From: Doug Berger <opendmb@gmail.com>

    [ Upstream commit 3182efd036c1b955403d131258234896cbd9fbeb ]

    Commit 9cabe26e65a8 ("serial: 8250_bcm7271: UART errors after resuming
    from S2") prevented an early enabling of RTS during resume, but it did
    not actively restore the RTS state after resume.

    Fixes: 9cabe26e65a8 ("serial: 8250_bcm7271: UART errors after resuming from S2")
    Signed-off-by: Doug Berger <opendmb@gmail.com>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Link: https://lore.kernel.org/r/20220714031316.404918-1-f.fainelli@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/tty/serial/8250/8250_bcm7271.c | 24 ++++++++++++++++++------
    1 file changed, 18 insertions(+), 6 deletions(-)

    diff --git a/drivers/tty/serial/8250/8250_bcm7271.c b/drivers/tty/serial/8250/8250_bcm7271.c
    index 0877cf24f7de..711cf30e835a 100644
    --- a/drivers/tty/serial/8250/8250_bcm7271.c
    +++ b/drivers/tty/serial/8250/8250_bcm7271.c
    @@ -1141,16 +1141,19 @@ static int __maybe_unused brcmuart_suspend(struct device *dev)
    struct brcmuart_priv *priv = dev_get_drvdata(dev);
    struct uart_8250_port *up = serial8250_get_port(priv->line);
    struct uart_port *port = &up->port;
    -
    - serial8250_suspend_port(priv->line);
    - clk_disable_unprepare(priv->baud_mux_clk);
    + unsigned long flags;

    /*
    * This will prevent resume from enabling RTS before the
    - * baud rate has been resored.
    + * baud rate has been restored.
    */
    + spin_lock_irqsave(&port->lock, flags);
    priv->saved_mctrl = port->mctrl;
    - port->mctrl = 0;
    + port->mctrl &= ~TIOCM_RTS;
    + spin_unlock_irqrestore(&port->lock, flags);
    +
    + serial8250_suspend_port(priv->line);
    + clk_disable_unprepare(priv->baud_mux_clk);

    return 0;
    }
    @@ -1160,6 +1163,7 @@ static int __maybe_unused brcmuart_resume(struct device *dev)
    struct brcmuart_priv *priv = dev_get_drvdata(dev);
    struct uart_8250_port *up = serial8250_get_port(priv->line);
    struct uart_port *port = &up->port;
    + unsigned long flags;
    int ret;

    ret = clk_prepare_enable(priv->baud_mux_clk);
    @@ -1182,7 +1186,15 @@ static int __maybe_unused brcmuart_resume(struct device *dev)
    start_rx_dma(serial8250_get_port(priv->line));
    }
    serial8250_resume_port(priv->line);
    - port->mctrl = priv->saved_mctrl;
    +
    + if (priv->saved_mctrl & TIOCM_RTS) {
    + /* Restore RTS */
    + spin_lock_irqsave(&port->lock, flags);
    + port->mctrl |= TIOCM_RTS;
    + port->ops->set_mctrl(port, port->mctrl);
    + spin_unlock_irqrestore(&port->lock, flags);
    + }
    +
    return 0;
    }

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-15 21:37    [W:2.105 / U:0.548 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site