media: rc: nuvoton: fix locking issue with nvt_enable_cir
Subsystems (2)
PATCH 1/3 media: rc: nuvoton: fix locking issue with nvt_enable_cir
nvt_enable_cir calls nvt_enable_logical_dev (that may sleep) while holding a spinlock.
This patch fixes this and moves the content of nvt_enable_cir to nvt_open as this is the only caller.
Signed-off-by Heiner Kallweit <[email protected]>
--- drivers/media/rc/nuvoton-cir.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-)
drivers/media/rc/nuvoton-cir.c +15 -18
@@ -942,23 +942,6 @@ static irqreturn_t nvt_cir_wake_isr(int irq, void *data)return IRQ_HANDLED ; } -static void nvt_enable_cir (struct nvt_dev *nvt) -{ -/* set function enable flags */ -nvt_cir_reg_write (nvt,CIR_IRCON_TXEN |CIR_IRCON_RXEN | -CIR_IRCON_RXINV |CIR_IRCON_SAMPLE_PERIOD_SEL , -CIR_IRCON ); - -/* enable the CIR logical device */ -nvt_enable_logical_dev (nvt,LOGICAL_DEV_CIR ); - -/* clear all pending interrupts */ -nvt_cir_reg_write (nvt,0xff ,CIR_IRSTS ); - -/* enable interrupts */ -nvt_set_cir_iren (nvt); -} -static void nvt_disable_cir (struct nvt_dev *nvt) {/* disable CIR interrupts */
@@ -984,9 +967,23 @@ static int nvt_open(struct rc_dev *dev)unsigned long flags;spin_lock_irqsave (&nvt->nvt_lock, flags); -nvt_enable_cir (nvt); + +/* set function enable flags */ +nvt_cir_reg_write (nvt,CIR_IRCON_TXEN |CIR_IRCON_RXEN | +CIR_IRCON_RXINV |CIR_IRCON_SAMPLE_PERIOD_SEL , +CIR_IRCON ); + +/* clear all pending interrupts */ +nvt_cir_reg_write (nvt,0xff ,CIR_IRSTS ); + +/* enable interrupts */ +nvt_set_cir_iren (nvt); +spin_unlock_irqrestore (&nvt->nvt_lock, flags); +/* enable the CIR logical device */ +nvt_enable_logical_dev (nvt,LOGICAL_DEV_CIR ); +return 0 ; }
Signature · 1 line
2.7.0