Commit e60c1e87 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by Mauro Carvalho Chehab

[media] media: rc: nuvoton-cir: improve locking in both interrupt handlers

Extend the locking to protect more critical actions like register accesses
in the interrupt handlers.
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent d42fd297
...@@ -727,7 +727,6 @@ static void nvt_handle_rx_fifo_overrun(struct nvt_dev *nvt) ...@@ -727,7 +727,6 @@ static void nvt_handle_rx_fifo_overrun(struct nvt_dev *nvt)
/* copy data from hardware rx fifo into driver buffer */ /* copy data from hardware rx fifo into driver buffer */
static void nvt_get_rx_ir_data(struct nvt_dev *nvt) static void nvt_get_rx_ir_data(struct nvt_dev *nvt)
{ {
unsigned long flags;
u8 fifocount, val; u8 fifocount, val;
unsigned int b_idx; unsigned int b_idx;
bool overrun = false; bool overrun = false;
...@@ -746,8 +745,6 @@ static void nvt_get_rx_ir_data(struct nvt_dev *nvt) ...@@ -746,8 +745,6 @@ static void nvt_get_rx_ir_data(struct nvt_dev *nvt)
nvt_dbg("attempting to fetch %u bytes from hw rx fifo", fifocount); nvt_dbg("attempting to fetch %u bytes from hw rx fifo", fifocount);
spin_lock_irqsave(&nvt->nvt_lock, flags);
b_idx = nvt->pkts; b_idx = nvt->pkts;
/* This should never happen, but lets check anyway... */ /* This should never happen, but lets check anyway... */
...@@ -769,8 +766,6 @@ static void nvt_get_rx_ir_data(struct nvt_dev *nvt) ...@@ -769,8 +766,6 @@ static void nvt_get_rx_ir_data(struct nvt_dev *nvt)
if (overrun) if (overrun)
nvt_handle_rx_fifo_overrun(nvt); nvt_handle_rx_fifo_overrun(nvt);
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
} }
static void nvt_cir_log_irqs(u8 status, u8 iren) static void nvt_cir_log_irqs(u8 status, u8 iren)
...@@ -811,6 +806,8 @@ static irqreturn_t nvt_cir_isr(int irq, void *data) ...@@ -811,6 +806,8 @@ static irqreturn_t nvt_cir_isr(int irq, void *data)
nvt_dbg_verbose("%s firing", __func__); nvt_dbg_verbose("%s firing", __func__);
spin_lock_irqsave(&nvt->nvt_lock, flags);
/* /*
* Get IR Status register contents. Write 1 to ack/clear * Get IR Status register contents. Write 1 to ack/clear
* *
...@@ -831,6 +828,7 @@ static irqreturn_t nvt_cir_isr(int irq, void *data) ...@@ -831,6 +828,7 @@ static irqreturn_t nvt_cir_isr(int irq, void *data)
* status bit whether the related interrupt source is enabled * status bit whether the related interrupt source is enabled
*/ */
if (!(status & iren)) { if (!(status & iren)) {
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
nvt_dbg_verbose("%s exiting, IRSTS 0x0", __func__); nvt_dbg_verbose("%s exiting, IRSTS 0x0", __func__);
return IRQ_NONE; return IRQ_NONE;
} }
...@@ -852,16 +850,14 @@ static irqreturn_t nvt_cir_isr(int irq, void *data) ...@@ -852,16 +850,14 @@ static irqreturn_t nvt_cir_isr(int irq, void *data)
if (nvt_cir_tx_inactive(nvt)) if (nvt_cir_tx_inactive(nvt))
nvt_get_rx_ir_data(nvt); nvt_get_rx_ir_data(nvt);
spin_lock_irqsave(&nvt->nvt_lock, flags);
cur_state = nvt->study_state; cur_state = nvt->study_state;
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
if (cur_state == ST_STUDY_NONE) if (cur_state == ST_STUDY_NONE)
nvt_clear_cir_fifo(nvt); nvt_clear_cir_fifo(nvt);
} }
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
if (status & CIR_IRSTS_TE) if (status & CIR_IRSTS_TE)
nvt_clear_tx_fifo(nvt); nvt_clear_tx_fifo(nvt);
...@@ -910,14 +906,18 @@ static irqreturn_t nvt_cir_wake_isr(int irq, void *data) ...@@ -910,14 +906,18 @@ static irqreturn_t nvt_cir_wake_isr(int irq, void *data)
nvt_dbg_wake("%s firing", __func__); nvt_dbg_wake("%s firing", __func__);
spin_lock_irqsave(&nvt->nvt_lock, flags);
status = nvt_cir_wake_reg_read(nvt, CIR_WAKE_IRSTS); status = nvt_cir_wake_reg_read(nvt, CIR_WAKE_IRSTS);
iren = nvt_cir_wake_reg_read(nvt, CIR_WAKE_IREN); iren = nvt_cir_wake_reg_read(nvt, CIR_WAKE_IREN);
/* IRQ may be shared with CIR, therefore check for each /* IRQ may be shared with CIR, therefore check for each
* status bit whether the related interrupt source is enabled * status bit whether the related interrupt source is enabled
*/ */
if (!(status & iren)) if (!(status & iren)) {
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
return IRQ_NONE; return IRQ_NONE;
}
if (status & CIR_WAKE_IRSTS_IR_PENDING) if (status & CIR_WAKE_IRSTS_IR_PENDING)
nvt_clear_cir_wake_fifo(nvt); nvt_clear_cir_wake_fifo(nvt);
...@@ -933,11 +933,11 @@ static irqreturn_t nvt_cir_wake_isr(int irq, void *data) ...@@ -933,11 +933,11 @@ static irqreturn_t nvt_cir_wake_isr(int irq, void *data)
} }
nvt_cir_wake_reg_write(nvt, 0, CIR_WAKE_IREN); nvt_cir_wake_reg_write(nvt, 0, CIR_WAKE_IREN);
spin_lock_irqsave(&nvt->nvt_lock, flags);
nvt->wake_state = ST_WAKE_FINISH; nvt->wake_state = ST_WAKE_FINISH;
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
} }
spin_unlock_irqrestore(&nvt->nvt_lock, flags);
nvt_dbg_wake("%s done", __func__); nvt_dbg_wake("%s done", __func__);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
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