On 12.07.2022 02:44, Chanho Park wrote: >>> + if (mctrl & TIOCM_LOOP) >>> + ucon |= S3C2410_UCON_LOOPBACK; >>> + else >>> + ucon &= ~S3C2410_UCON_LOOPBACK; >>> + >>> + wr_regl(port, S3C2410_UCON, ucon); >> S3C2410_UCON must be modified at least under the local_irq_save() or port >> lock, otherwise it breaks kernel console operation on older Exynos SoCs >> (especially when DMA mode is used). >> >> The above read-modify-write sequence should be replaced with the following >> pattern: >> >> if (mctrl & TIOCM_LOOP) >> s3c24xx_set_bit(port, S3C2410_UCON_LOOPBACK, S3C2410_UCON); >> else >> s3c24xx_clear_bit(port, S3C2410_UCON_LOOPBACK, S3C2410_UCON); > All the set_mctrl() call can be protected by spin_[un]lock_irq[save/restore] with port->lock. > So, I think it is not required. Right. The problem is elsewhere. You used rd_reg(port, S3C2410_UCON) instead of rd_regl(port, S3C2410_UCON) what always zeroed upper bits. I will send a fix in a few minutes. Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland