diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2013-05-06 17:38:00 -0400 |
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2013-05-06 17:38:00 -0400 |
| commit | 4183bef2e093a2f0aab45f2d5fed82b0e02aeacf (patch) | |
| tree | e84c484db3746a0f3ead0fb7a2bb9e5a42b89e85 /drivers/pci | |
| parent | 662478d060a39b8faf2b1fe2fbbb212556c2e052 (diff) | |
| parent | 775c4f66fd855e68a98fc5049003810fe98e2e20 (diff) | |
Merge branch 'late/dt' into next/dt2
This is support for the ARM Chromebook, originally scheduled
as a "late" pull request. Since it's already late now, we
can combine this into the existing next/dt2 branch.
* late/dt:
ARM: exynos: dts: cros5250: add EC device
ARM: dts: Add sbs-battery for exynos5250-snow
ARM: dts: Add i2c-arbitrator bus for exynos5250-snow
ARM: dts: Add chip-id controller node on Exynos4/5 SoC
ARM: EXYNOS: Create virtual I/O mapping for Chip-ID controller using device tree
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 | 67 |
4 files changed, 42 insertions, 58 deletions
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index dee5dddaa292..5147c210df52 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) | |||
| 53 | return; | 53 | return; |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | if (!pci_dev->pm_cap || !pci_dev->pme_support | 56 | /* Clear PME Status if set. */ |
| 57 | || pci_check_pme_status(pci_dev)) { | 57 | if (pci_dev->pme_support) |
| 58 | if (pci_dev->pme_poll) | 58 | pci_check_pme_status(pci_dev); |
| 59 | pci_dev->pme_poll = false; | ||
| 60 | 59 | ||
| 61 | pci_wakeup_event(pci_dev); | 60 | if (pci_dev->pme_poll) |
| 62 | pm_runtime_resume(&pci_dev->dev); | 61 | pci_dev->pme_poll = false; |
| 63 | } | 62 | |
| 63 | pci_wakeup_event(pci_dev); | ||
| 64 | pm_runtime_resume(&pci_dev->dev); | ||
| 64 | 65 | ||
| 65 | if (pci_dev->subordinate) | 66 | if (pci_dev->subordinate) |
| 66 | pci_pme_wakeup_bus(pci_dev->subordinate); | 67 | pci_pme_wakeup_bus(pci_dev->subordinate); |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 1fa1e482a999..79277fb36c6b 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) | |||
| 390 | 390 | ||
| 391 | /* | 391 | /* |
| 392 | * Turn off Bus Master bit on the device to tell it to not | 392 | * Turn off Bus Master bit on the device to tell it to not |
| 393 | * continue to do DMA | 393 | * continue to do DMA. Don't touch devices in D3cold or unknown states. |
| 394 | */ | 394 | */ |
| 395 | pci_clear_master(pci_dev); | 395 | if (pci_dev->current_state <= PCI_D3hot) |
| 396 | pci_clear_master(pci_dev); | ||
| 396 | } | 397 | } |
| 397 | 398 | ||
| 398 | #ifdef CONFIG_PM | 399 | #ifdef CONFIG_PM |
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index 08c243ab034e..ed4d09498337 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 = { | |||
| 185 | #endif /* !PM */ | 185 | #endif /* !PM */ |
| 186 | 186 | ||
| 187 | /* | 187 | /* |
| 188 | * PCIe port runtime suspend is broken for some chipsets, so use a | ||
| 189 | * black list to disable runtime PM for these chipsets. | ||
| 190 | */ | ||
| 191 | static const struct pci_device_id port_runtime_pm_black_list[] = { | ||
| 192 | { /* end: all zeroes */ } | ||
| 193 | }; | ||
| 194 | |||
| 195 | /* | ||
| 196 | * pcie_portdrv_probe - Probe PCI-Express port devices | 188 | * pcie_portdrv_probe - Probe PCI-Express port devices |
| 197 | * @dev: PCI-Express port device being probed | 189 | * @dev: PCI-Express port device being probed |
| 198 | * | 190 | * |
| @@ -225,16 +217,11 @@ static int pcie_portdrv_probe(struct pci_dev *dev, | |||
| 225 | * it by default. | 217 | * it by default. |
| 226 | */ | 218 | */ |
| 227 | dev->d3cold_allowed = false; | 219 | dev->d3cold_allowed = false; |
| 228 | if (!pci_match_id(port_runtime_pm_black_list, dev)) | ||
| 229 | pm_runtime_put_noidle(&dev->dev); | ||
| 230 | |||
| 231 | return 0; | 220 | return 0; |
| 232 | } | 221 | } |
| 233 | 222 | ||
| 234 | static void pcie_portdrv_remove(struct pci_dev *dev) | 223 | static void pcie_portdrv_remove(struct pci_dev *dev) |
| 235 | { | 224 | { |
| 236 | if (!pci_match_id(port_runtime_pm_black_list, dev)) | ||
| 237 | pm_runtime_get_noresume(&dev->dev); | ||
| 238 | pcie_port_device_remove(dev); | 225 | pcie_port_device_remove(dev); |
| 239 | pci_disable_device(dev); | 226 | pci_disable_device(dev); |
| 240 | } | 227 | } |
diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index b41ac7756a4b..c5d0a08a8747 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c | |||
| @@ -100,27 +100,6 @@ size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size) | |||
| 100 | return min((size_t)(image - rom), size); | 100 | return min((size_t)(image - rom), size); |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | static loff_t pci_find_rom(struct pci_dev *pdev, size_t *size) | ||
| 104 | { | ||
| 105 | struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; | ||
| 106 | loff_t start; | ||
| 107 | |||
| 108 | /* assign the ROM an address if it doesn't have one */ | ||
| 109 | if (res->parent == NULL && pci_assign_resource(pdev, PCI_ROM_RESOURCE)) | ||
| 110 | return 0; | ||
| 111 | start = pci_resource_start(pdev, PCI_ROM_RESOURCE); | ||
| 112 | *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); | ||
| 113 | |||
| 114 | if (*size == 0) | ||
| 115 | return 0; | ||
| 116 | |||
| 117 | /* Enable ROM space decodes */ | ||
| 118 | if (pci_enable_rom(pdev)) | ||
| 119 | return 0; | ||
| 120 | |||
| 121 | return start; | ||
| 122 | } | ||
| 123 | |||
| 124 | /** | 103 | /** |
| 125 | * pci_map_rom - map a PCI ROM to kernel space | 104 | * pci_map_rom - map a PCI ROM to kernel space |
| 126 | * @pdev: pointer to pci device struct | 105 | * @pdev: pointer to pci device struct |
| @@ -135,7 +114,7 @@ static loff_t pci_find_rom(struct pci_dev *pdev, size_t *size) | |||
| 135 | void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) | 114 | void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) |
| 136 | { | 115 | { |
| 137 | struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; | 116 | struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; |
| 138 | loff_t start = 0; | 117 | loff_t start; |
| 139 | void __iomem *rom; | 118 | void __iomem *rom; |
| 140 | 119 | ||
| 141 | /* | 120 | /* |
| @@ -154,21 +133,21 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) | |||
| 154 | return (void __iomem *)(unsigned long) | 133 | return (void __iomem *)(unsigned long) |
| 155 | pci_resource_start(pdev, PCI_ROM_RESOURCE); | 134 | pci_resource_start(pdev, PCI_ROM_RESOURCE); |
| 156 | } else { | 135 | } else { |
| 157 | start = pci_find_rom(pdev, size); | 136 | /* assign the ROM an address if it doesn't have one */ |
| 158 | } | 137 | if (res->parent == NULL && |
| 159 | } | 138 | pci_assign_resource(pdev,PCI_ROM_RESOURCE)) |
| 139 | return NULL; | ||
| 140 | start = pci_resource_start(pdev, PCI_ROM_RESOURCE); | ||
| 141 | *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); | ||
| 142 | if (*size == 0) | ||
| 143 | return NULL; | ||
| 160 | 144 | ||
| 161 | /* | 145 | /* Enable ROM space decodes */ |
| 162 | * Some devices may provide ROMs via a source other than the BAR | 146 | if (pci_enable_rom(pdev)) |
| 163 | */ | 147 | return NULL; |
| 164 | if (!start && pdev->rom && pdev->romlen) { | 148 | } |
| 165 | *size = pdev->romlen; | ||
| 166 | return phys_to_virt(pdev->rom); | ||
| 167 | } | 149 | } |
| 168 | 150 | ||
| 169 | if (!start) | ||
| 170 | return NULL; | ||
| 171 | |||
| 172 | rom = ioremap(start, *size); | 151 | rom = ioremap(start, *size); |
| 173 | if (!rom) { | 152 | if (!rom) { |
| 174 | /* restore enable if ioremap fails */ | 153 | /* restore enable if ioremap fails */ |
| @@ -202,8 +181,7 @@ void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom) | |||
| 202 | if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY)) | 181 | if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY)) |
| 203 | return; | 182 | return; |
| 204 | 183 | ||
| 205 | if (!pdev->rom || !pdev->romlen) | 184 | iounmap(rom); |
| 206 | iounmap(rom); | ||
| 207 | 185 | ||
| 208 | /* Disable again before continuing, leave enabled if pci=rom */ | 186 | /* Disable again before continuing, leave enabled if pci=rom */ |
| 209 | if (!(res->flags & (IORESOURCE_ROM_ENABLE | IORESOURCE_ROM_SHADOW))) | 187 | if (!(res->flags & (IORESOURCE_ROM_ENABLE | IORESOURCE_ROM_SHADOW))) |
| @@ -227,7 +205,24 @@ void pci_cleanup_rom(struct pci_dev *pdev) | |||
| 227 | } | 205 | } |
| 228 | } | 206 | } |
| 229 | 207 | ||
| 208 | /** | ||
| 209 | * pci_platform_rom - provides a pointer to any ROM image provided by the | ||
| 210 | * platform | ||
| 211 | * @pdev: pointer to pci device struct | ||
| 212 | * @size: pointer to receive size of pci window over ROM | ||
| 213 | */ | ||
| 214 | void __iomem *pci_platform_rom(struct pci_dev *pdev, size_t *size) | ||
| 215 | { | ||
| 216 | if (pdev->rom && pdev->romlen) { | ||
| 217 | *size = pdev->romlen; | ||
| 218 | return phys_to_virt((phys_addr_t)pdev->rom); | ||
| 219 | } | ||
| 220 | |||
| 221 | return NULL; | ||
| 222 | } | ||
| 223 | |||
| 230 | EXPORT_SYMBOL(pci_map_rom); | 224 | EXPORT_SYMBOL(pci_map_rom); |
| 231 | EXPORT_SYMBOL(pci_unmap_rom); | 225 | EXPORT_SYMBOL(pci_unmap_rom); |
| 232 | EXPORT_SYMBOL_GPL(pci_enable_rom); | 226 | EXPORT_SYMBOL_GPL(pci_enable_rom); |
| 233 | EXPORT_SYMBOL_GPL(pci_disable_rom); | 227 | EXPORT_SYMBOL_GPL(pci_disable_rom); |
| 228 | EXPORT_SYMBOL(pci_platform_rom); | ||
