* 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++;
        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);