diff options
Diffstat (limited to 'drivers/pci')
| -rw-r--r-- | drivers/pci/pci-acpi.c | 15 | ||||
| -rw-r--r-- | drivers/pci/pci-driver.c | 5 | ||||
| -rw-r--r-- | drivers/pci/pcie/portdrv_pci.c | 13 | ||||
| -rw-r--r-- | drivers/pci/rom.c | 28 | 
4 files changed, 30 insertions, 31 deletions
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index dee5dddaa29..5147c210df5 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c @@ -53,14 +53,15 @@ static void pci_acpi_wake_dev(acpi_handle handle, u32 event, void *context)  		return;  	} -	if (!pci_dev->pm_cap || !pci_dev->pme_support -	     || pci_check_pme_status(pci_dev)) { -		if (pci_dev->pme_poll) -			pci_dev->pme_poll = false; +	/* Clear PME Status if set. */ +	if (pci_dev->pme_support) +		pci_check_pme_status(pci_dev); -		pci_wakeup_event(pci_dev); -		pm_runtime_resume(&pci_dev->dev); -	} +	if (pci_dev->pme_poll) +		pci_dev->pme_poll = false; + +	pci_wakeup_event(pci_dev); +	pm_runtime_resume(&pci_dev->dev);  	if (pci_dev->subordinate)  		pci_pme_wakeup_bus(pci_dev->subordinate); diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 1fa1e482a99..79277fb36c6 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -390,9 +390,10 @@ static void pci_device_shutdown(struct device *dev)  	/*  	 * Turn off Bus Master bit on the device to tell it to not -	 * continue to do DMA +	 * continue to do DMA. Don't touch devices in D3cold or unknown states.  	 */ -	pci_clear_master(pci_dev); +	if (pci_dev->current_state <= PCI_D3hot) +		pci_clear_master(pci_dev);  }  #ifdef CONFIG_PM diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index 08c243ab034..ed4d0949833 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c @@ -185,14 +185,6 @@ static const struct dev_pm_ops pcie_portdrv_pm_ops = {  #endif /* !PM */  /* - * PCIe port runtime suspend is broken for some chipsets, so use a - * black list to disable runtime PM for these chipsets. - */ -static const struct pci_device_id port_runtime_pm_black_list[] = { -	{ /* end: all zeroes */ } -}; - -/*   * pcie_portdrv_probe - Probe PCI-Express port devices   * @dev: PCI-Express port device being probed   * @@ -225,16 +217,11 @@ static int pcie_portdrv_probe(struct pci_dev *dev,  	 * it by default.  	 */  	dev->d3cold_allowed = false; -	if (!pci_match_id(port_runtime_pm_black_list, dev)) -		pm_runtime_put_noidle(&dev->dev); -  	return 0;  }  static void pcie_portdrv_remove(struct pci_dev *dev)  { -	if (!pci_match_id(port_runtime_pm_black_list, dev)) -		pm_runtime_get_noresume(&dev->dev);  	pcie_port_device_remove(dev);  	pci_disable_device(dev);  } diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index ab886b7ee32..c5d0a08a874 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c @@ -118,17 +118,11 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size)  	void __iomem *rom;  	/* -	 * Some devices may provide ROMs via a source other than the BAR -	 */ -	if (pdev->rom && pdev->romlen) { -		*size = pdev->romlen; -		return phys_to_virt(pdev->rom); -	/*  	 * IORESOURCE_ROM_SHADOW set on x86, x86_64 and IA64 supports legacy  	 * memory map if the VGA enable bit of the Bridge Control register is  	 * set for embedded VGA.  	 */ -	} else if (res->flags & IORESOURCE_ROM_SHADOW) { +	if (res->flags & IORESOURCE_ROM_SHADOW) {  		/* primary video rom always starts here */  		start = (loff_t)0xC0000;  		*size = 0x20000; /* cover C000:0 through E000:0 */ @@ -187,8 +181,7 @@ void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom)  	if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY))  		return; -	if (!pdev->rom || !pdev->romlen) -		iounmap(rom); +	iounmap(rom);  	/* Disable again before continuing, leave enabled if pci=rom */  	if (!(res->flags & (IORESOURCE_ROM_ENABLE | IORESOURCE_ROM_SHADOW))) @@ -212,7 +205,24 @@ void pci_cleanup_rom(struct pci_dev *pdev)  	}  } +/** + * pci_platform_rom - provides a pointer to any ROM image provided by the + * platform + * @pdev: pointer to pci device struct + * @size: pointer to receive size of pci window over ROM + */ +void __iomem *pci_platform_rom(struct pci_dev *pdev, size_t *size) +{ +	if (pdev->rom && pdev->romlen) { +		*size = pdev->romlen; +		return phys_to_virt((phys_addr_t)pdev->rom); +	} + +	return NULL; +} +  EXPORT_SYMBOL(pci_map_rom);  EXPORT_SYMBOL(pci_unmap_rom);  EXPORT_SYMBOL_GPL(pci_enable_rom);  EXPORT_SYMBOL_GPL(pci_disable_rom); +EXPORT_SYMBOL(pci_platform_rom);  |