That is suggested by Brian, because in that way, the wakeup pin would not "tied to what exact device is installed (or no device, if it's a slot).">+Why is this a property of the bridge and not of the device itself?
>+ dn = pci_device_to_OF_node(ppdev);
>+ if (!dn)
>+ return 0;
>+
>+ irq = of_irq_get_byname(dn, "wakeup");
ok, will fix in the next version.
>+ if (irq == -EPROBE_DEFER)Braces here, please.
hmmm, i thought so too, but it turns out the dedicated wake irq framework requires device_init_wakeup(dev, true) before attach the wake irq:
>+ return irq;Why do you call this before dev_pm_set_dedicated_wake_irq()?
>+ /* Ignore other errors, since a missing wakeup is non-fatal. */
>+ else if (irq < 0) {
>+ dev_info(&pdev->dev, "cannot get wakeup interrupt: %d\n", irq);
>+ return 0;
>+ }
>+
>+ device_init_wakeup(&pdev->dev, true);
>+It would be more straightforward to call device_init_wakeup() here.
>+ ret = dev_pm_set_dedicated_wake_irq(&pdev->dev, irq);
>+ if (ret < 0) {
>+ dev_err(&pdev->dev, "failed to set wake IRQ: %d\n", ret);
>+ device_init_wakeup(&pdev->dev, false);
>+ return ret;
>+ }
>+
>+ return 0;Thanks,
>+}
>+EXPORT_SYMBOL_GPL(of_pci_setup_wake_irq);
>+
>+void of_pci_teardown_wake_irq(struct pci_dev *pdev)
>+{
>+ if (!pdev->dev.power.wakeirq)
>+ return;
>+
>+ dev_pm_clear_wake_irq(&pdev->dev);
>+ device_init_wakeup(&pdev->dev, false);
>+}
>+EXPORT_SYMBOL_GPL(of_pci_teardown_wake_irq);
>+
> /**
> * of_irq_parse_pci - Resolve the interrupt for a PCI device
> * @pdev: the device whose interrupt is to be resolved
Rafael