Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 259c6481 authored by Sujeev Dias's avatar Sujeev Dias Committed by Gerrit - the friendly Code Review server
Browse files

pci: framework: disable auto suspend link



Some endpoint devices do not go into D3hot during suspend.
By pass auto suspend if device do not allow D3hot. In order
prevent ABI breakage warp this QTI specific change under
CONFIG_PCI_QTI.

CRs-Fixed: 2418347
Change-Id: Ida6e4a2b60b7d08932bfff79144afd67787ca0f2
Signed-off-by: default avatarSujeev Dias <sdias@codeaurora.org>
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
Signed-off-by: default avatarTony Truong <truong@codeaurora.org>
parent 08a70590
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -303,5 +303,16 @@ config PCI_MSM

	  If unsure, say N.

config PCI_QTI
	tristate "Enable QTI specific code in PCI upstream driver"
	depends on QGKI
	default n
	help
	  This configuration flag allows adding QTI specific code
	  in PCI upstream driver. This macro guards the code against
	  ABI breakage in PCI upstream driver. When this flag is
	  enabled, it is safe to assume that the build is a Non GKI
	  build.

source "drivers/pci/controller/dwc/Kconfig"
endmenu
+26 −1
Original line number Diff line number Diff line
@@ -848,6 +848,12 @@ static int pci_pm_suspend_noirq(struct device *dev)
		}
	}

#ifdef CONFIG_PCI_QTI
	/* if d3hot is not supported bail out */
	if (pci_dev->no_d3hot)
		return 0;
#endif

	if (pci_dev->skip_bus_pm) {
		/*
		 * Either the device is a bridge with a child in D0 below it, or
@@ -937,7 +943,11 @@ static int pci_pm_resume_noirq(struct device *dev)
	 * configuration here and attempting to put them into D0 again is
	 * pointless, so avoid doing that.
	 */
	if (!(pci_dev->skip_bus_pm && pm_suspend_no_platform()))
	if (!(pci_dev->skip_bus_pm && pm_suspend_no_platform())
#ifdef CONFIG_PCI_QTI
		&& !pci_dev->no_d3hot
#endif
	)
		pci_pm_default_resume_early(pci_dev);

	pci_fixup_device(pci_fixup_resume_early, pci_dev);
@@ -1320,6 +1330,12 @@ static int pci_pm_runtime_suspend(struct device *dev)
		return 0;
	}

#ifdef CONFIG_PCI_QTI
	/* if d3hot is not supported bail out */
	if (pci_dev->no_d3hot)
		return 0;
#endif

	if (!pci_dev->state_saved) {
		pci_save_state(pci_dev);
		pci_finish_runtime_suspend(pci_dev);
@@ -1334,6 +1350,12 @@ static int pci_pm_runtime_resume(struct device *dev)
	struct pci_dev *pci_dev = to_pci_dev(dev);
	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;

#ifdef CONFIG_PCI_QTI
	/* we skipped d3hot processing so skip re-init */
	if (pci_dev->no_d3hot)
		goto skip_restore;
#endif

	/*
	 * Restoring config space is necessary even if the device is not bound
	 * to a driver because although we left it in D0, it may have gone to
@@ -1348,6 +1370,9 @@ static int pci_pm_runtime_resume(struct device *dev)
	pci_enable_wake(pci_dev, PCI_D0, false);
	pci_fixup_device(pci_fixup_resume, pci_dev);

#ifdef CONFIG_PCI_QTI
skip_restore:
#endif
	if (pm && pm->runtime_resume)
		rc = pm->runtime_resume(dev);

+3 −0
Original line number Diff line number Diff line
@@ -339,6 +339,9 @@ struct pci_dev {
	unsigned int	d2_support:1;	/* Low power state D2 is supported */
	unsigned int	no_d1d2:1;	/* D1 and D2 are forbidden */
	unsigned int	no_d3cold:1;	/* D3cold is forbidden */
#ifdef CONFIG_PCI_QTI
	unsigned int	no_d3hot:1;	/* D3hot is forbidden */
#endif
	unsigned int	bridge_d3:1;	/* Allow D3 for bridge */
	unsigned int	d3cold_allowed:1;	/* D3cold is allowed by user */
	unsigned int	mmio_always_on:1;	/* Disallow turning off io/mem