diff options
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 | } |