V4L/DVB (5505): Fix Kernel Bugzilla #8301: spinlock fix for flexcop-pci
authorHendrik Borghorst <hendrik@borghorst.org>
Thu, 5 Apr 2007 17:28:11 +0000 (14:28 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Fri, 27 Apr 2007 18:45:29 +0000 (15:45 -0300)
If you modprobe the b2c2-flexcop-pci module you got a hardlock of your system.
This is due the usage of spin_lock before spin_lock_init is called.

Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/dvb/b2c2/flexcop-pci.c

index 6e166801505d23636014d2a120d479538933a2d7..01af4d237eb13b585ba6f8136494c07a3a17f27c 100644 (file)
@@ -127,10 +127,11 @@ static irqreturn_t flexcop_pci_isr(int irq, void *dev_id)
 {
        struct flexcop_pci *fc_pci = dev_id;
        struct flexcop_device *fc = fc_pci->fc_dev;
+       unsigned long flags;
        flexcop_ibi_value v;
        irqreturn_t ret = IRQ_HANDLED;
 
-       spin_lock_irq(&fc_pci->irq_lock);
+       spin_lock_irqsave(&fc_pci->irq_lock,flags);
 
        v = fc->read_ibi_reg(fc,irq_20c);
 
@@ -194,7 +195,7 @@ static irqreturn_t flexcop_pci_isr(int irq, void *dev_id)
                ret = IRQ_NONE;
        }
 
-       spin_unlock_irq(&fc_pci->irq_lock);
+       spin_unlock_irqrestore(&fc_pci->irq_lock,flags);
 
        return ret;
 }
@@ -293,12 +294,12 @@ static int flexcop_pci_init(struct flexcop_pci *fc_pci)
        }
 
        pci_set_drvdata(fc_pci->pdev, fc_pci);
-
+       spin_lock_init(&fc_pci->irq_lock);
        if ((ret = request_irq(fc_pci->pdev->irq, flexcop_pci_isr,
                                        IRQF_SHARED, DRIVER_NAME, fc_pci)) != 0)
                goto err_pci_iounmap;
 
-       spin_lock_init(&fc_pci->irq_lock);
+
 
        fc_pci->init_state |= FC_PCI_INIT;
        return ret;