• Hans Verkuil's avatar
    omapdrm/dss/hdmi4_cec: fix interrupt handling · df29c9db
    Hans Verkuil authored
    The omap4 CEC hardware cannot tell a Nack from a Low Drive from an
    Arbitration Lost error, so just report a Nack, which is almost
    certainly the reason for the error anyway.
    
    This also simplifies the implementation. The only three interrupts
    that need to be enabled are:
    
    Transmit Buffer Full/Empty Change event: triggered when the
    transmit finished successfully and cleared the buffer.
    
    Receiver FIFO Not Empty event: triggered when a message was received.
    
    Frame Retransmit Count Exceeded event: triggered when a transmit
    failed repeatedly, usually due to the message being Nacked. Other
    reasons are possible (Low Drive, Arbitration Lost) but there is no
    way to know. If this happens the TX buffer needs to be cleared
    manually.
    
    While testing various error conditions I noticed that the hardware
    can receive messages up to 18 bytes in total, which exceeds the legal
    maximum of 16. This could cause a buffer overflow, so we check for
    this and constrain the size to 16 bytes.
    
    The old incorrect interrupt handler could cause the CEC framework to
    enter into a bad state because it mis-detected the "Start Bit Irregularity
    event" as an ARB_LOST transmit error when it actually is a receive error
    which should be ignored.
    Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
    Reported-by: default avatarHenrik Austad <haustad@cisco.com>
    Tested-by: default avatarHenrik Austad <haustad@cisco.com>
    Tested-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
    Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
    df29c9db
hdmi4_cec.c 10.2 KB