gpio-langwell: initialize lock before usage
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 22 May 2013 10:20:10 +0000 (13:20 +0300)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 30 May 2013 17:30:44 +0000 (19:30 +0200)
Otherwise we will end up with traceback from LOCKDEP:

INFO: trying to register non-static key.
the code is fine but needs lockdep annotation.
turning off the locking correctness validator.
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.10.0-rc2-next-20130521-00028-g09aa9fc #487
 00000000 00000000 f6c55c54 c1541fe4 f6040bf8 f6c55c8c c1069ef1 c1726bc1
 c1726cc8 c1726c9e 00000000 f6c584e0 f6c58000 f6c55ce8 00000000 f6040bf8
 f6040bf8 00000046 f6c58000 f6c55d00 c106a18d 00000a2b 00000003 00004f02
Call Trace:
 [<c1541fe4>] dump_stack+0x49/0x77
 [<c1069ef1>] register_lock_class+0x58/0x260
 [<c106a18d>] __lock_acquire+0x94/0xcff
 [<c106adc8>] ? __lock_acquire+0xccf/0xcff
 [<c106b2ad>] lock_acquire+0xcc/0x10d
 [<c1269c7c>] ? lnw_irq_type+0x63/0xe9
 [<c1545da0>] _raw_spin_lock_irqsave+0x32/0x42
 [<c1269c7c>] ? lnw_irq_type+0x63/0xe9
 [<c1269c7c>] lnw_irq_type+0x63/0xe9
 [<c108f454>] __irq_set_trigger+0x98/0x123
 [<c1090225>] irq_set_irq_type+0x2f/0x51
 [<c1090225>] ? irq_set_irq_type+0x2f/0x51
 [<c1269d02>] ? lnw_irq_type+0xe9/0xe9
 [<c1269d34>] lnw_gpio_irq_map+0x32/0x3b
 [<c10914f2>] irq_domain_add_legacy+0xe2/0x107
 [<c1091b53>] irq_domain_add_simple+0x47/0x60
 [<c1269f6e>] lnw_gpio_probe+0x119/0x217
 [<c1271018>] pci_device_probe+0x5a/0x92
...

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: David Cohen <david.a.cohen@intel.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-langwell.c

index b8a5729..a0190de 100644 (file)
@@ -380,6 +380,8 @@ static int lnw_gpio_probe(struct pci_dev *pdev,
        lnw->chip.can_sleep = 0;
        lnw->pdev = pdev;
 
        lnw->chip.can_sleep = 0;
        lnw->pdev = pdev;
 
+       spin_lock_init(&lnw->lock);
+
        lnw->domain = irq_domain_add_simple(pdev->dev.of_node, ngpio, irq_base,
                                            &lnw_gpio_irq_ops, lnw);
        if (!lnw->domain) {
        lnw->domain = irq_domain_add_simple(pdev->dev.of_node, ngpio, irq_base,
                                            &lnw_gpio_irq_ops, lnw);
        if (!lnw->domain) {
@@ -399,8 +401,6 @@ static int lnw_gpio_probe(struct pci_dev *pdev,
        irq_set_handler_data(pdev->irq, lnw);
        irq_set_chained_handler(pdev->irq, lnw_irq_handler);
 
        irq_set_handler_data(pdev->irq, lnw);
        irq_set_chained_handler(pdev->irq, lnw_irq_handler);
 
-       spin_lock_init(&lnw->lock);
-
        pm_runtime_put_noidle(&pdev->dev);
        pm_runtime_allow(&pdev->dev);
 
        pm_runtime_put_noidle(&pdev->dev);
        pm_runtime_allow(&pdev->dev);