diff mbox series

thunderbolt: handle runtime pm for tunnelled pci root port

Message ID 1646658319-59532-1-git-send-email-Sanju.Mehta@amd.com
State New
Headers show
Series thunderbolt: handle runtime pm for tunnelled pci root port | expand

Commit Message

Sanjay R Mehta March 7, 2022, 1:05 p.m. UTC
From: Sanjay R Mehta <sanju.mehta@amd.com>

Carry out runtime-resume of PCI tunnelled root port to handle
hotplug interrupts synchronously.

Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
---
 drivers/thunderbolt/acpi.c |  3 +++
 drivers/thunderbolt/tb.c   | 11 +++++++++++
 2 files changed, 14 insertions(+)
diff mbox series

Patch

diff --git a/drivers/thunderbolt/acpi.c b/drivers/thunderbolt/acpi.c
index 79b5abf..10dd61b 100644
--- a/drivers/thunderbolt/acpi.c
+++ b/drivers/thunderbolt/acpi.c
@@ -96,6 +96,9 @@  static acpi_status tb_acpi_add_link(acpi_handle handle, u32 level, void *data,
 				 dev_name(&pdev->dev));
 		}
 
+		pm_runtime_set_autosuspend_delay(&pdev->dev, TB_AUTOSUSPEND_DELAY);
+		pm_runtime_use_autosuspend(&pdev->dev);
+		pm_runtime_mark_last_busy(&pdev->dev);
 		pm_runtime_put(&pdev->dev);
 	}
 
diff --git a/drivers/thunderbolt/tb.c b/drivers/thunderbolt/tb.c
index cbd0ad8..2a53fa6 100644
--- a/drivers/thunderbolt/tb.c
+++ b/drivers/thunderbolt/tb.c
@@ -1066,6 +1066,7 @@  static int tb_tunnel_pci(struct tb *tb, struct tb_switch *sw)
 	struct tb_cm *tcm = tb_priv(tb);
 	struct tb_switch *parent_sw;
 	struct tb_tunnel *tunnel;
+	struct device_link *link;
 
 	up = tb_switch_find_port(sw, TB_TYPE_PCIE_UP);
 	if (!up)
@@ -1099,6 +1100,16 @@  static int tb_tunnel_pci(struct tb *tb, struct tb_switch *sw)
 	if (tb_switch_pcie_l1_enable(sw))
 		tb_sw_warn(sw, "failed to enable PCIe L1 for Titan Ridge\n");
 
+	list_for_each_entry(link, &tb->nhi->pdev->dev.links.consumers, s_node) {
+		if (pci_pcie_type(to_pci_dev(link->consumer)) == PCI_EXP_TYPE_ROOT_PORT) {
+			if (pm_runtime_status_suspended(link->consumer)) {
+				pm_runtime_get_sync(link->consumer);
+				pm_runtime_mark_last_busy(link->consumer);
+				pm_runtime_put_sync_autosuspend(link->consumer);
+			}
+		}
+	}
+
 	list_add_tail(&tunnel->list, &tcm->tunnel_list);
 	return 0;
 }