diff options
Diffstat (limited to 'drivers/pci/pci-driver.c')
-rw-r--r-- | drivers/pci/pci-driver.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index d911e0c1f359..4393c12e9135 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -216,6 +216,13 @@ const struct pci_device_id *pci_match_id(const struct pci_device_id *ids, | |||
216 | return NULL; | 216 | return NULL; |
217 | } | 217 | } |
218 | 218 | ||
219 | static const struct pci_device_id pci_device_id_any = { | ||
220 | .vendor = PCI_ANY_ID, | ||
221 | .device = PCI_ANY_ID, | ||
222 | .subvendor = PCI_ANY_ID, | ||
223 | .subdevice = PCI_ANY_ID, | ||
224 | }; | ||
225 | |||
219 | /** | 226 | /** |
220 | * pci_match_device - Tell if a PCI device structure has a matching PCI device id structure | 227 | * pci_match_device - Tell if a PCI device structure has a matching PCI device id structure |
221 | * @drv: the PCI driver to match against | 228 | * @drv: the PCI driver to match against |
@@ -229,18 +236,30 @@ static const struct pci_device_id *pci_match_device(struct pci_driver *drv, | |||
229 | struct pci_dev *dev) | 236 | struct pci_dev *dev) |
230 | { | 237 | { |
231 | struct pci_dynid *dynid; | 238 | struct pci_dynid *dynid; |
239 | const struct pci_device_id *found_id = NULL; | ||
240 | |||
241 | /* When driver_override is set, only bind to the matching driver */ | ||
242 | if (dev->driver_override && strcmp(dev->driver_override, drv->name)) | ||
243 | return NULL; | ||
232 | 244 | ||
233 | /* Look at the dynamic ids first, before the static ones */ | 245 | /* Look at the dynamic ids first, before the static ones */ |
234 | spin_lock(&drv->dynids.lock); | 246 | spin_lock(&drv->dynids.lock); |
235 | list_for_each_entry(dynid, &drv->dynids.list, node) { | 247 | list_for_each_entry(dynid, &drv->dynids.list, node) { |
236 | if (pci_match_one_device(&dynid->id, dev)) { | 248 | if (pci_match_one_device(&dynid->id, dev)) { |
237 | spin_unlock(&drv->dynids.lock); | 249 | found_id = &dynid->id; |
238 | return &dynid->id; | 250 | break; |
239 | } | 251 | } |
240 | } | 252 | } |
241 | spin_unlock(&drv->dynids.lock); | 253 | spin_unlock(&drv->dynids.lock); |
242 | 254 | ||
243 | return pci_match_id(drv->id_table, dev); | 255 | if (!found_id) |
256 | found_id = pci_match_id(drv->id_table, dev); | ||
257 | |||
258 | /* driver_override will always match, send a dummy id */ | ||
259 | if (!found_id && dev->driver_override) | ||
260 | found_id = &pci_device_id_any; | ||
261 | |||
262 | return found_id; | ||
244 | } | 263 | } |
245 | 264 | ||
246 | struct drv_dev_and_id { | 265 | struct drv_dev_and_id { |