diff options
Diffstat (limited to 'drivers/thunderbolt/acpi.c')
| -rw-r--r-- | drivers/thunderbolt/acpi.c | 15 | 
1 files changed, 14 insertions, 1 deletions
| diff --git a/drivers/thunderbolt/acpi.c b/drivers/thunderbolt/acpi.c index b67e72d5644b..79b5abf9d042 100644 --- a/drivers/thunderbolt/acpi.c +++ b/drivers/thunderbolt/acpi.c @@ -7,6 +7,7 @@   */  #include <linux/acpi.h> +#include <linux/pm_runtime.h>  #include "tb.h" @@ -31,7 +32,7 @@ static acpi_status tb_acpi_add_link(acpi_handle handle, u32 level, void *data,  		return AE_OK;  	/* It needs to reference this NHI */ -	if (nhi->pdev->dev.fwnode != args.fwnode) +	if (dev_fwnode(&nhi->pdev->dev) != args.fwnode)  		goto out_put;  	/* @@ -74,8 +75,18 @@ static acpi_status tb_acpi_add_link(acpi_handle handle, u32 level, void *data,  		 pci_pcie_type(pdev) == PCI_EXP_TYPE_DOWNSTREAM))) {  		const struct device_link *link; +		/* +		 * Make them both active first to make sure the NHI does +		 * not runtime suspend before the consumer. The +		 * pm_runtime_put() below then allows the consumer to +		 * runtime suspend again (which then allows NHI runtime +		 * suspend too now that the device link is established). +		 */ +		pm_runtime_get_sync(&pdev->dev); +  		link = device_link_add(&pdev->dev, &nhi->pdev->dev,  				       DL_FLAG_AUTOREMOVE_SUPPLIER | +				       DL_FLAG_RPM_ACTIVE |  				       DL_FLAG_PM_RUNTIME);  		if (link) {  			dev_dbg(&nhi->pdev->dev, "created link from %s\n", @@ -84,6 +95,8 @@ static acpi_status tb_acpi_add_link(acpi_handle handle, u32 level, void *data,  			dev_warn(&nhi->pdev->dev, "device link creation from %s failed\n",  				 dev_name(&pdev->dev));  		} + +		pm_runtime_put(&pdev->dev);  	}  out_put: |