diff options
author | Hans Verkuil <hverkuil-cisco@xs4all.nl> | 2019-12-11 17:22:26 +0100 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2019-12-16 11:59:59 +0100 |
commit | b7d0567f552a46c965d9cc30d5f7afa73a88450a (patch) | |
tree | f7a1f49685a1245552a4e16a49e396a83c409c86 /drivers/media/usb | |
parent | 92eee37d398cc738369b5a073b4f596e36958641 (diff) | |
download | linux-b7d0567f552a46c965d9cc30d5f7afa73a88450a.tar.gz |
media: pulse8-cec: set tx_done_status for transmit_done status
Instead of translating work_result to a transmit_done status
in pulse8_irq_work_handler(), pass the CEC_TX_STATUS via a
new tx_done_status field.
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Diffstat (limited to 'drivers/media/usb')
-rw-r--r-- | drivers/media/usb/pulse8-cec/pulse8-cec.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/drivers/media/usb/pulse8-cec/pulse8-cec.c b/drivers/media/usb/pulse8-cec/pulse8-cec.c index 5ac257d01243..68bc2462c829 100644 --- a/drivers/media/usb/pulse8-cec/pulse8-cec.c +++ b/drivers/media/usb/pulse8-cec/pulse8-cec.c @@ -174,6 +174,7 @@ struct pulse8 { u8 work_result; struct delayed_work ping_eeprom_work; struct cec_msg rx_msg; + u32 tx_done_status; u8 data[DATA_SIZE]; unsigned int len; u8 buf[DATA_SIZE]; @@ -266,30 +267,20 @@ static void pulse8_irq_work_handler(struct work_struct *work) struct pulse8 *pulse8 = container_of(work, struct pulse8, work); u8 result = pulse8->work_result; + u32 status; pulse8->work_result = 0; switch (result & 0x3f) { case MSGCODE_FRAME_DATA: cec_received_msg(pulse8->adap, &pulse8->rx_msg); break; - case MSGCODE_TRANSMIT_SUCCEEDED: - mutex_lock(&pulse8->lock); - cec_transmit_attempt_done(pulse8->adap, CEC_TX_STATUS_OK); - mutex_unlock(&pulse8->lock); - break; - case MSGCODE_TRANSMIT_FAILED_ACK: - mutex_lock(&pulse8->lock); - cec_transmit_attempt_done(pulse8->adap, CEC_TX_STATUS_NACK); - mutex_unlock(&pulse8->lock); - break; - case MSGCODE_TRANSMIT_FAILED_LINE: - case MSGCODE_TRANSMIT_FAILED_TIMEOUT_DATA: - case MSGCODE_TRANSMIT_FAILED_TIMEOUT_LINE: - mutex_lock(&pulse8->lock); - cec_transmit_attempt_done(pulse8->adap, CEC_TX_STATUS_ERROR); - mutex_unlock(&pulse8->lock); - break; } + mutex_lock(&pulse8->lock); + status = pulse8->tx_done_status; + pulse8->tx_done_status = 0; + mutex_unlock(&pulse8->lock); + if (status) + cec_transmit_attempt_done(pulse8->adap, status); } static irqreturn_t pulse8_interrupt(struct serio *serio, unsigned char data, @@ -331,12 +322,20 @@ static irqreturn_t pulse8_interrupt(struct serio *serio, unsigned char data, } break; case MSGCODE_TRANSMIT_SUCCEEDED: - case MSGCODE_TRANSMIT_FAILED_LINE: + WARN_ON(pulse8->tx_done_status); + pulse8->tx_done_status = CEC_TX_STATUS_OK; + schedule_work(&pulse8->work); + break; case MSGCODE_TRANSMIT_FAILED_ACK: + WARN_ON(pulse8->tx_done_status); + pulse8->tx_done_status = CEC_TX_STATUS_NACK; + schedule_work(&pulse8->work); + break; + case MSGCODE_TRANSMIT_FAILED_LINE: case MSGCODE_TRANSMIT_FAILED_TIMEOUT_DATA: case MSGCODE_TRANSMIT_FAILED_TIMEOUT_LINE: - WARN_ON(pulse8->work_result); - pulse8->work_result = msgcode; + WARN_ON(pulse8->tx_done_status); + pulse8->tx_done_status = CEC_TX_STATUS_ERROR; schedule_work(&pulse8->work); break; case MSGCODE_HIGH_ERROR: @@ -383,6 +382,8 @@ static int pulse8_cec_adap_enable(struct cec_adapter *adap, bool enable) cmd[1] = enable; err = pulse8_send_and_wait(pulse8, cmd, 2, MSGCODE_COMMAND_ACCEPTED, 1); + if (!enable) + pulse8->tx_done_status = 0; mutex_unlock(&pulse8->lock); return enable ? err : 0; } |