• Paul Walmsley's avatar
    tty: serial: OMAP: block idle while the UART is transferring data in PIO mode · be4b0281
    Paul Walmsley authored
    Prevent OMAP UARTs from going idle while they are still transferring
    data in PIO mode.  This works around an oversight in the OMAP UART
    hardware present in OMAP34xx and earlier: an idle UART won't send a
    wakeup when the TX FIFO threshold is reached.  This causes long delays
    during data transmission when the MPU powerdomain enters a low-power
    mode.  The MPU interrupt controller is not able to respond to
    interrupts when it's in a low-power state, so the TX buffer is not
    refilled until another wakeup event occurs.
    
    This fix changes the erratum i291 DMA idle workaround.  Rather than
    toggling between force-idle and no-idle, it will toggle between
    smart-idle and no-idle.  The important part of the workaround is the
    no-idle part, so this shouldn't result in any change in behavior.
    
    This fix should work on all OMAP UARTs.  Future patches intended for
    the 3.4 merge window will make this workaround conditional on a
    "feature" flag, and will use the OMAP36xx+ TX event wakeup support.
    
    Thanks to Kevin Hilman <khilman@ti.com> for mentioning the erratum i291
    workaround, which led to the development of this approach.
    Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
    Cc: Alan Cox <alan@linux.intel.com>
    Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
    Acked-by: default avatarGovindraj.R <govindraj.raja@ti.com>
    Reviewed-by: default avatarKevin Hilman <khilman@ti.com>
    Tested-by: default avatarKevin Hilman <khilman@ti.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    be4b0281
omap-serial.c 44.8 KB