aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/pci-driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/pci-driver.c')
-rw-r--r--drivers/pci/pci-driver.c25
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
219static 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
246struct drv_dev_and_id { 265struct drv_dev_and_id {