diff options
| author | Takashi Iwai <tiwai@suse.de> | 2013-12-19 06:22:11 -0500 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2013-12-19 06:22:11 -0500 |
| commit | 356f402da0f989b16e4b6849e88dba5df0e25944 (patch) | |
| tree | d1d41d07abf30bdd7fe1498f6eb239eaced6d9b3 /drivers/pci | |
| parent | 3a6c5d8ad0a9253aafb76df3577edcb68c09b939 (diff) | |
| parent | 96b7fe0119b932ad25451d2b6357e727bbe6a309 (diff) | |
Merge tag 'asoc-v3.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
ASoC: Fixes for v3.13
The fixes here are all driver specific ones, none of which particularly
stand out but all of which are useful to users of those drivers.
Diffstat (limited to 'drivers/pci')
| -rw-r--r-- | drivers/pci/host/pci-mvebu.c | 5 | ||||
| -rw-r--r-- | drivers/pci/pci-driver.c | 38 | ||||
| -rw-r--r-- | drivers/pci/pci.c | 8 | ||||
| -rw-r--r-- | drivers/pci/remove.c | 4 |
4 files changed, 46 insertions, 9 deletions
diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c index c269e430c760..2aa7b77c7c88 100644 --- a/drivers/pci/host/pci-mvebu.c +++ b/drivers/pci/host/pci-mvebu.c | |||
| @@ -447,6 +447,11 @@ static int mvebu_sw_pci_bridge_read(struct mvebu_pcie_port *port, | |||
| 447 | *value = 0; | 447 | *value = 0; |
| 448 | break; | 448 | break; |
| 449 | 449 | ||
| 450 | case PCI_INTERRUPT_LINE: | ||
| 451 | /* LINE PIN MIN_GNT MAX_LAT */ | ||
| 452 | *value = 0; | ||
| 453 | break; | ||
| 454 | |||
| 450 | default: | 455 | default: |
| 451 | *value = 0xffffffff; | 456 | *value = 0xffffffff; |
| 452 | return PCIBIOS_BAD_REGISTER_NUMBER; | 457 | return PCIBIOS_BAD_REGISTER_NUMBER; |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 9042fdbd7244..25f0bc659164 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/cpu.h> | 19 | #include <linux/cpu.h> |
| 20 | #include <linux/pm_runtime.h> | 20 | #include <linux/pm_runtime.h> |
| 21 | #include <linux/suspend.h> | 21 | #include <linux/suspend.h> |
| 22 | #include <linux/kexec.h> | ||
| 22 | #include "pci.h" | 23 | #include "pci.h" |
| 23 | 24 | ||
| 24 | struct pci_dynid { | 25 | struct pci_dynid { |
| @@ -288,12 +289,27 @@ static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev, | |||
| 288 | int error, node; | 289 | int error, node; |
| 289 | struct drv_dev_and_id ddi = { drv, dev, id }; | 290 | struct drv_dev_and_id ddi = { drv, dev, id }; |
| 290 | 291 | ||
| 291 | /* Execute driver initialization on node where the device's | 292 | /* |
| 292 | bus is attached to. This way the driver likely allocates | 293 | * Execute driver initialization on node where the device is |
| 293 | its local memory on the right node without any need to | 294 | * attached. This way the driver likely allocates its local memory |
| 294 | change it. */ | 295 | * on the right node. |
| 296 | */ | ||
| 295 | node = dev_to_node(&dev->dev); | 297 | node = dev_to_node(&dev->dev); |
| 296 | if (node >= 0) { | 298 | |
| 299 | /* | ||
| 300 | * On NUMA systems, we are likely to call a PF probe function using | ||
| 301 | * work_on_cpu(). If that probe calls pci_enable_sriov() (which | ||
| 302 | * adds the VF devices via pci_bus_add_device()), we may re-enter | ||
| 303 | * this function to call the VF probe function. Calling | ||
| 304 | * work_on_cpu() again will cause a lockdep warning. Since VFs are | ||
| 305 | * always on the same node as the PF, we can work around this by | ||
| 306 | * avoiding work_on_cpu() when we're already on the correct node. | ||
| 307 | * | ||
| 308 | * Preemption is enabled, so it's theoretically unsafe to use | ||
| 309 | * numa_node_id(), but even if we run the probe function on the | ||
| 310 | * wrong node, it should be functionally correct. | ||
| 311 | */ | ||
| 312 | if (node >= 0 && node != numa_node_id()) { | ||
| 297 | int cpu; | 313 | int cpu; |
| 298 | 314 | ||
| 299 | get_online_cpus(); | 315 | get_online_cpus(); |
| @@ -305,6 +321,7 @@ static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev, | |||
| 305 | put_online_cpus(); | 321 | put_online_cpus(); |
| 306 | } else | 322 | } else |
| 307 | error = local_pci_probe(&ddi); | 323 | error = local_pci_probe(&ddi); |
| 324 | |||
| 308 | return error; | 325 | return error; |
| 309 | } | 326 | } |
| 310 | 327 | ||
| @@ -399,12 +416,17 @@ static void pci_device_shutdown(struct device *dev) | |||
| 399 | pci_msi_shutdown(pci_dev); | 416 | pci_msi_shutdown(pci_dev); |
| 400 | pci_msix_shutdown(pci_dev); | 417 | pci_msix_shutdown(pci_dev); |
| 401 | 418 | ||
| 419 | #ifdef CONFIG_KEXEC | ||
| 402 | /* | 420 | /* |
| 403 | * Turn off Bus Master bit on the device to tell it to not | 421 | * If this is a kexec reboot, turn off Bus Master bit on the |
| 404 | * continue to do DMA. Don't touch devices in D3cold or unknown states. | 422 | * device to tell it to not continue to do DMA. Don't touch |
| 423 | * devices in D3cold or unknown states. | ||
| 424 | * If it is not a kexec reboot, firmware will hit the PCI | ||
| 425 | * devices with big hammer and stop their DMA any way. | ||
| 405 | */ | 426 | */ |
| 406 | if (pci_dev->current_state <= PCI_D3hot) | 427 | if (kexec_in_progress && (pci_dev->current_state <= PCI_D3hot)) |
| 407 | pci_clear_master(pci_dev); | 428 | pci_clear_master(pci_dev); |
| 429 | #endif | ||
| 408 | } | 430 | } |
| 409 | 431 | ||
| 410 | #ifdef CONFIG_PM | 432 | #ifdef CONFIG_PM |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 33120d156668..07369f32e8bb 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -4165,6 +4165,14 @@ int pci_set_vga_state(struct pci_dev *dev, bool decode, | |||
| 4165 | return 0; | 4165 | return 0; |
| 4166 | } | 4166 | } |
| 4167 | 4167 | ||
| 4168 | bool pci_device_is_present(struct pci_dev *pdev) | ||
| 4169 | { | ||
| 4170 | u32 v; | ||
| 4171 | |||
| 4172 | return pci_bus_read_dev_vendor_id(pdev->bus, pdev->devfn, &v, 0); | ||
| 4173 | } | ||
| 4174 | EXPORT_SYMBOL_GPL(pci_device_is_present); | ||
| 4175 | |||
| 4168 | #define RESOURCE_ALIGNMENT_PARAM_SIZE COMMAND_LINE_SIZE | 4176 | #define RESOURCE_ALIGNMENT_PARAM_SIZE COMMAND_LINE_SIZE |
| 4169 | static char resource_alignment_param[RESOURCE_ALIGNMENT_PARAM_SIZE] = {0}; | 4177 | static char resource_alignment_param[RESOURCE_ALIGNMENT_PARAM_SIZE] = {0}; |
| 4170 | static DEFINE_SPINLOCK(resource_alignment_lock); | 4178 | static DEFINE_SPINLOCK(resource_alignment_lock); |
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index 1576851028db..cc9337a71529 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c | |||
| @@ -24,7 +24,7 @@ static void pci_stop_dev(struct pci_dev *dev) | |||
| 24 | if (dev->is_added) { | 24 | if (dev->is_added) { |
| 25 | pci_proc_detach_device(dev); | 25 | pci_proc_detach_device(dev); |
| 26 | pci_remove_sysfs_dev_files(dev); | 26 | pci_remove_sysfs_dev_files(dev); |
| 27 | device_del(&dev->dev); | 27 | device_release_driver(&dev->dev); |
| 28 | dev->is_added = 0; | 28 | dev->is_added = 0; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| @@ -34,6 +34,8 @@ static void pci_stop_dev(struct pci_dev *dev) | |||
| 34 | 34 | ||
| 35 | static void pci_destroy_dev(struct pci_dev *dev) | 35 | static void pci_destroy_dev(struct pci_dev *dev) |
| 36 | { | 36 | { |
| 37 | device_del(&dev->dev); | ||
| 38 | |||
| 37 | down_write(&pci_bus_sem); | 39 | down_write(&pci_bus_sem); |
| 38 | list_del(&dev->bus_list); | 40 | list_del(&dev->bus_list); |
| 39 | up_write(&pci_bus_sem); | 41 | up_write(&pci_bus_sem); |
