Commit e113d65a authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

media: tegra-cec: reset rx_buf_cnt when start bit detected

If a start bit is detected, then reset the receive buffer counter to 0.

This ensures that no stale data is in the buffer if a message is
broken off midstream due to e.g. a Low Drive condition and then
retransmitted.

The only Rx interrupts we need to listen to are RX_REGISTER_FULL (i.e.
a valid byte was received) and RX_START_BIT_DETECTED (i.e. a new
message starts and we need to reset the counter).
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Cc: <stable@vger.kernel.org>      # for v4.15 and up
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 2fe4c22c
...@@ -172,16 +172,13 @@ static irqreturn_t tegra_cec_irq_handler(int irq, void *data) ...@@ -172,16 +172,13 @@ static irqreturn_t tegra_cec_irq_handler(int irq, void *data)
} }
} }
if (status & (TEGRA_CEC_INT_STAT_RX_REGISTER_OVERRUN | if (status & TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED) {
TEGRA_CEC_INT_STAT_RX_BUS_ANOMALY_DETECTED |
TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED |
TEGRA_CEC_INT_STAT_RX_BUS_ERROR_DETECTED)) {
cec_write(cec, TEGRA_CEC_INT_STAT, cec_write(cec, TEGRA_CEC_INT_STAT,
(TEGRA_CEC_INT_STAT_RX_REGISTER_OVERRUN | TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED);
TEGRA_CEC_INT_STAT_RX_BUS_ANOMALY_DETECTED | cec->rx_done = false;
TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED | cec->rx_buf_cnt = 0;
TEGRA_CEC_INT_STAT_RX_BUS_ERROR_DETECTED)); }
} else if (status & TEGRA_CEC_INT_STAT_RX_REGISTER_FULL) { if (status & TEGRA_CEC_INT_STAT_RX_REGISTER_FULL) {
u32 v; u32 v;
cec_write(cec, TEGRA_CEC_INT_STAT, cec_write(cec, TEGRA_CEC_INT_STAT,
...@@ -255,7 +252,7 @@ static int tegra_cec_adap_enable(struct cec_adapter *adap, bool enable) ...@@ -255,7 +252,7 @@ static int tegra_cec_adap_enable(struct cec_adapter *adap, bool enable)
TEGRA_CEC_INT_MASK_TX_BUS_ANOMALY_DETECTED | TEGRA_CEC_INT_MASK_TX_BUS_ANOMALY_DETECTED |
TEGRA_CEC_INT_MASK_TX_FRAME_TRANSMITTED | TEGRA_CEC_INT_MASK_TX_FRAME_TRANSMITTED |
TEGRA_CEC_INT_MASK_RX_REGISTER_FULL | TEGRA_CEC_INT_MASK_RX_REGISTER_FULL |
TEGRA_CEC_INT_MASK_RX_REGISTER_OVERRUN); TEGRA_CEC_INT_MASK_RX_START_BIT_DETECTED);
cec_write(cec, TEGRA_CEC_HW_CONTROL, TEGRA_CEC_HWCTRL_TX_RX_MODE); cec_write(cec, TEGRA_CEC_HW_CONTROL, TEGRA_CEC_HWCTRL_TX_RX_MODE);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment