lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 342/343] serial: stm32: fix clearing interrupt error flags
    Date
    From: Fabrice Gasnier <fabrice.gasnier@st.com>

    [ Upstream commit 1250ed7114a977cdc2a67a0c09d6cdda63970eb9 ]

    The interrupt clear flag register is a "write 1 to clear" register.
    So, only writing ones allows to clear flags:
    - Replace buggy stm32_clr_bits() by a simple write to clear error flags
    - Replace useless read/modify/write stm32_set_bits() routine by a
    simple write to clear TC (transfer complete) flag.

    Fixes: 4f01d833fdcd ("serial: stm32: fix rx error handling")
    Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/1574323849-1909-1-git-send-email-fabrice.gasnier@st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/tty/serial/stm32-usart.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c
    index f8f3f8fafd9f0..1e854e1851fbb 100644
    --- a/drivers/tty/serial/stm32-usart.c
    +++ b/drivers/tty/serial/stm32-usart.c
    @@ -132,8 +132,8 @@ static void stm32_receive_chars(struct uart_port *port, bool threaded)
    * cleared by the sequence [read SR - read DR].
    */
    if ((sr & USART_SR_ERR_MASK) && ofs->icr != UNDEF_REG)
    - stm32_clr_bits(port, ofs->icr, USART_ICR_ORECF |
    - USART_ICR_PECF | USART_ICR_FECF);
    + writel_relaxed(sr & USART_SR_ERR_MASK,
    + port->membase + ofs->icr);

    c = stm32_get_char(port, &sr, &stm32_port->last_res);
    port->icount.rx++;
    @@ -302,7 +302,7 @@ static void stm32_transmit_chars(struct uart_port *port)
    if (ofs->icr == UNDEF_REG)
    stm32_clr_bits(port, ofs->isr, USART_SR_TC);
    else
    - stm32_set_bits(port, ofs->icr, USART_ICR_TCCF);
    + writel_relaxed(USART_ICR_TCCF, port->membase + ofs->icr);

    if (stm32_port->tx_ch)
    stm32_transmit_chars_dma(port);
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-24 11:08    [W:4.085 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site