diff options
author | Alex Williamson <alex.williamson@redhat.com> | 2013-08-08 16:09:24 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2013-08-09 18:47:48 -0400 |
commit | 64e8674fbe6bc848333a9b7e19f8cc019dde9eab (patch) | |
tree | 43321f9f0693954f38cf4b82fc0e1da3ea267d10 /drivers/pci/pci.c | |
parent | 3b2f64d00c46e1e4e9bd0bb9bb12619adac27a4b (diff) |
PCI: Add pci_reset_bridge_secondary_bus()
Move the secondary bus reset code from pci_parent_bus_reset() into its own
function. Export it as we'll later be calling it from hotplug controllers
and elsewhere.
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r-- | drivers/pci/pci.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e37fea6e178d..d46860898e1f 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -3215,9 +3215,30 @@ static int pci_pm_reset(struct pci_dev *dev, int probe) | |||
3215 | return 0; | 3215 | return 0; |
3216 | } | 3216 | } |
3217 | 3217 | ||
3218 | static int pci_parent_bus_reset(struct pci_dev *dev, int probe) | 3218 | /** |
3219 | * pci_reset_bridge_secondary_bus - Reset the secondary bus on a PCI bridge. | ||
3220 | * @dev: Bridge device | ||
3221 | * | ||
3222 | * Use the bridge control register to assert reset on the secondary bus. | ||
3223 | * Devices on the secondary bus are left in power-on state. | ||
3224 | */ | ||
3225 | void pci_reset_bridge_secondary_bus(struct pci_dev *dev) | ||
3219 | { | 3226 | { |
3220 | u16 ctrl; | 3227 | u16 ctrl; |
3228 | |||
3229 | pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &ctrl); | ||
3230 | ctrl |= PCI_BRIDGE_CTL_BUS_RESET; | ||
3231 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl); | ||
3232 | msleep(100); | ||
3233 | |||
3234 | ctrl &= ~PCI_BRIDGE_CTL_BUS_RESET; | ||
3235 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl); | ||
3236 | msleep(100); | ||
3237 | } | ||
3238 | EXPORT_SYMBOL_GPL(pci_reset_bridge_secondary_bus); | ||
3239 | |||
3240 | static int pci_parent_bus_reset(struct pci_dev *dev, int probe) | ||
3241 | { | ||
3221 | struct pci_dev *pdev; | 3242 | struct pci_dev *pdev; |
3222 | 3243 | ||
3223 | if (pci_is_root_bus(dev->bus) || dev->subordinate || !dev->bus->self) | 3244 | if (pci_is_root_bus(dev->bus) || dev->subordinate || !dev->bus->self) |
@@ -3230,14 +3251,7 @@ static int pci_parent_bus_reset(struct pci_dev *dev, int probe) | |||
3230 | if (probe) | 3251 | if (probe) |
3231 | return 0; | 3252 | return 0; |
3232 | 3253 | ||
3233 | pci_read_config_word(dev->bus->self, PCI_BRIDGE_CONTROL, &ctrl); | 3254 | pci_reset_bridge_secondary_bus(dev->bus->self); |
3234 | ctrl |= PCI_BRIDGE_CTL_BUS_RESET; | ||
3235 | pci_write_config_word(dev->bus->self, PCI_BRIDGE_CONTROL, ctrl); | ||
3236 | msleep(100); | ||
3237 | |||
3238 | ctrl &= ~PCI_BRIDGE_CTL_BUS_RESET; | ||
3239 | pci_write_config_word(dev->bus->self, PCI_BRIDGE_CONTROL, ctrl); | ||
3240 | msleep(100); | ||
3241 | 3255 | ||
3242 | return 0; | 3256 | return 0; |
3243 | } | 3257 | } |