The slot status is polled from a timer, i.e. in softirq context, and pm_runtime_get_sync() may sleep. Hence it's not an option to runtime resume the port whenever its slot status is polled. It would also be silly to continuously switch back and forth between D0 and D3hot, so keep it runtime active if poll mode is enabled. Cc: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> Cc: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx> Cc: Erik Veijola <erik.veijola@xxxxxxxxxxxxxxx> Cc: Ashok Raj <ashok.raj@xxxxxxxxx> Cc: Keith Busch <keith.busch@xxxxxxxxx> Cc: Yinghai Lu <yinghai@xxxxxxxxxx> Cc: Krishna Dhulipala <krishnad@xxxxxx> Cc: Wei Zhang <wzhang@xxxxxx> Signed-off-by: Lukas Wunner <lukas@xxxxxxxxx> --- drivers/pci/hotplug/pciehp_hpc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 70dd9ae4c097..20170bcf9862 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c @@ -86,6 +86,7 @@ static inline int pciehp_request_irq(struct controller *ctrl) if (pciehp_poll_mode) { init_timer(&ctrl->poll_timer); start_int_poll_timer(ctrl, 10); + pm_runtime_get(&ctrl->pcie->port->dev); return 0; } @@ -99,9 +100,10 @@ static inline int pciehp_request_irq(struct controller *ctrl) static inline void pciehp_free_irq(struct controller *ctrl) { - if (pciehp_poll_mode) + if (pciehp_poll_mode) { del_timer_sync(&ctrl->poll_timer); - else + pm_runtime_put(&ctrl->pcie->port->dev); + } else free_irq(ctrl->pcie->irq, ctrl); } -- 2.11.0