PCI: connect struct pci_dev to struct pci_slot
[deliverable/linux.git] / drivers / pci / pci-driver.c
CommitLineData
1da177e4
LT
1/*
2 * drivers/pci/pci-driver.c
3 *
2b937303
GKH
4 * (C) Copyright 2002-2004, 2007 Greg Kroah-Hartman <greg@kroah.com>
5 * (C) Copyright 2007 Novell Inc.
6 *
7 * Released under the GPL v2 only.
8 *
1da177e4
LT
9 */
10
11#include <linux/pci.h>
12#include <linux/module.h>
13#include <linux/init.h>
14#include <linux/device.h>
d42c6997 15#include <linux/mempolicy.h>
4e57b681
TS
16#include <linux/string.h>
17#include <linux/slab.h>
8c65b4a6 18#include <linux/sched.h>
1da177e4
LT
19#include "pci.h"
20
1da177e4
LT
21/*
22 * Dynamic device IDs are disabled for !CONFIG_HOTPLUG
23 */
24
75865858
GKH
25struct pci_dynid {
26 struct list_head node;
27 struct pci_device_id id;
28};
1da177e4 29
3d3c2ae1
GK
30#ifdef CONFIG_HOTPLUG
31
1da177e4 32/**
8f7020d3
RD
33 * store_new_id - add a new PCI device ID to this driver and re-probe devices
34 * @driver: target device driver
35 * @buf: buffer for scanning device ID data
36 * @count: input size
1da177e4
LT
37 *
38 * Adds a new dynamic pci device ID to this driver,
39 * and causes the driver to probe for all devices again.
40 */
f8eb1005 41static ssize_t
1da177e4
LT
42store_new_id(struct device_driver *driver, const char *buf, size_t count)
43{
75865858 44 struct pci_dynid *dynid;
1da177e4 45 struct pci_driver *pdrv = to_pci_driver(driver);
b41d6cf3 46 const struct pci_device_id *ids = pdrv->id_table;
6ba18636 47 __u32 vendor, device, subvendor=PCI_ANY_ID,
1da177e4
LT
48 subdevice=PCI_ANY_ID, class=0, class_mask=0;
49 unsigned long driver_data=0;
50 int fields=0;
b41d6cf3 51 int retval;
1da177e4 52
b41d6cf3 53 fields = sscanf(buf, "%x %x %x %x %x %x %lx",
1da177e4
LT
54 &vendor, &device, &subvendor, &subdevice,
55 &class, &class_mask, &driver_data);
6ba18636 56 if (fields < 2)
1da177e4
LT
57 return -EINVAL;
58
b41d6cf3
JD
59 /* Only accept driver_data values that match an existing id_table
60 entry */
61 retval = -EINVAL;
62 while (ids->vendor || ids->subvendor || ids->class_mask) {
63 if (driver_data == ids->driver_data) {
64 retval = 0;
65 break;
66 }
67 ids++;
68 }
69 if (retval) /* No match */
70 return retval;
71
f5afe806 72 dynid = kzalloc(sizeof(*dynid), GFP_KERNEL);
1da177e4
LT
73 if (!dynid)
74 return -ENOMEM;
75
1da177e4
LT
76 dynid->id.vendor = vendor;
77 dynid->id.device = device;
78 dynid->id.subvendor = subvendor;
79 dynid->id.subdevice = subdevice;
80 dynid->id.class = class;
81 dynid->id.class_mask = class_mask;
edbc25ca 82 dynid->id.driver_data = driver_data;
1da177e4
LT
83
84 spin_lock(&pdrv->dynids.lock);
a56bc69a 85 list_add_tail(&dynid->node, &pdrv->dynids.list);
1da177e4
LT
86 spin_unlock(&pdrv->dynids.lock);
87
75865858 88 if (get_driver(&pdrv->driver)) {
b19441af 89 retval = driver_attach(&pdrv->driver);
75865858 90 put_driver(&pdrv->driver);
1da177e4
LT
91 }
92
b19441af
GKH
93 if (retval)
94 return retval;
1da177e4
LT
95 return count;
96}
1da177e4 97static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
1da177e4
LT
98
99static void
100pci_free_dynids(struct pci_driver *drv)
101{
75865858 102 struct pci_dynid *dynid, *n;
1da177e4
LT
103
104 spin_lock(&drv->dynids.lock);
75865858 105 list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
1da177e4
LT
106 list_del(&dynid->node);
107 kfree(dynid);
108 }
109 spin_unlock(&drv->dynids.lock);
110}
111
112static int
113pci_create_newid_file(struct pci_driver *drv)
114{
115 int error = 0;
116 if (drv->probe != NULL)
03d43b19 117 error = driver_create_file(&drv->driver, &driver_attr_new_id);
1da177e4
LT
118 return error;
119}
120
03d43b19
GKH
121static void pci_remove_newid_file(struct pci_driver *drv)
122{
123 driver_remove_file(&drv->driver, &driver_attr_new_id);
124}
1da177e4 125#else /* !CONFIG_HOTPLUG */
1da177e4
LT
126static inline void pci_free_dynids(struct pci_driver *drv) {}
127static inline int pci_create_newid_file(struct pci_driver *drv)
128{
129 return 0;
130}
03d43b19 131static inline void pci_remove_newid_file(struct pci_driver *drv) {}
1da177e4
LT
132#endif
133
134/**
75865858 135 * pci_match_id - See if a pci device matches a given pci_id table
1da177e4 136 * @ids: array of PCI device id structures to search in
75865858
GKH
137 * @dev: the PCI device structure to match against.
138 *
1da177e4 139 * Used by a driver to check whether a PCI device present in the
75865858 140 * system is in its list of supported devices. Returns the matching
1da177e4 141 * pci_device_id structure or %NULL if there is no match.
75865858 142 *
8b60756a 143 * Deprecated, don't use this as it will not catch any dynamic ids
75865858 144 * that a driver might want to check for.
1da177e4 145 */
75865858
GKH
146const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
147 struct pci_dev *dev)
1da177e4 148{
75865858
GKH
149 if (ids) {
150 while (ids->vendor || ids->subvendor || ids->class_mask) {
151 if (pci_match_one_device(ids, dev))
152 return ids;
153 ids++;
154 }
1da177e4
LT
155 }
156 return NULL;
157}
158
159/**
ae9608af 160 * pci_match_device - Tell if a PCI device structure has a matching PCI device id structure
75865858 161 * @drv: the PCI driver to match against
39ba487f 162 * @dev: the PCI device structure to match against
75865858
GKH
163 *
164 * Used by a driver to check whether a PCI device present in the
165 * system is in its list of supported devices. Returns the matching
166 * pci_device_id structure or %NULL if there is no match.
1da177e4 167 */
d73460d7
AB
168static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
169 struct pci_dev *dev)
75865858 170{
75865858 171 struct pci_dynid *dynid;
1da177e4 172
7461b60a 173 /* Look at the dynamic ids first, before the static ones */
75865858
GKH
174 spin_lock(&drv->dynids.lock);
175 list_for_each_entry(dynid, &drv->dynids.list, node) {
176 if (pci_match_one_device(&dynid->id, dev)) {
177 spin_unlock(&drv->dynids.lock);
178 return &dynid->id;
179 }
1da177e4 180 }
75865858 181 spin_unlock(&drv->dynids.lock);
7461b60a
RK
182
183 return pci_match_id(drv->id_table, dev);
1da177e4
LT
184}
185
d42c6997
AK
186static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
187 const struct pci_device_id *id)
188{
189 int error;
190#ifdef CONFIG_NUMA
191 /* Execute driver initialization on node where the
192 device's bus is attached to. This way the driver likely
193 allocates its local memory on the right node without
194 any need to change it. */
195 struct mempolicy *oldpol;
196 cpumask_t oldmask = current->cpus_allowed;
4efeb4dd 197 int node = dev_to_node(&dev->dev);
f70316da
MT
198
199 if (node >= 0) {
200 node_to_cpumask_ptr(nodecpumask, node);
201 set_cpus_allowed_ptr(current, nodecpumask);
202 }
d42c6997
AK
203 /* And set default memory allocation policy */
204 oldpol = current->mempolicy;
74e27e44 205 current->mempolicy = NULL; /* fall back to system default policy */
d42c6997
AK
206#endif
207 error = drv->probe(dev, id);
208#ifdef CONFIG_NUMA
f70316da 209 set_cpus_allowed_ptr(current, &oldmask);
d42c6997
AK
210 current->mempolicy = oldpol;
211#endif
212 return error;
213}
214
1da177e4
LT
215/**
216 * __pci_device_probe()
8f7020d3
RD
217 * @drv: driver to call to check if it wants the PCI device
218 * @pci_dev: PCI device being probed
1da177e4 219 *
8f7020d3 220 * returns 0 on success, else error.
1da177e4
LT
221 * side-effect: pci_dev->driver is set to drv when drv claims pci_dev.
222 */
223static int
224__pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
75865858
GKH
225{
226 const struct pci_device_id *id;
1da177e4
LT
227 int error = 0;
228
229 if (!pci_dev->driver && drv->probe) {
75865858
GKH
230 error = -ENODEV;
231
232 id = pci_match_device(drv, pci_dev);
233 if (id)
d42c6997 234 error = pci_call_probe(drv, pci_dev, id);
75865858
GKH
235 if (error >= 0) {
236 pci_dev->driver = drv;
237 error = 0;
238 }
1da177e4
LT
239 }
240 return error;
241}
242
243static int pci_device_probe(struct device * dev)
244{
245 int error = 0;
246 struct pci_driver *drv;
247 struct pci_dev *pci_dev;
248
249 drv = to_pci_driver(dev->driver);
250 pci_dev = to_pci_dev(dev);
251 pci_dev_get(pci_dev);
252 error = __pci_device_probe(drv, pci_dev);
253 if (error)
254 pci_dev_put(pci_dev);
255
256 return error;
257}
258
259static int pci_device_remove(struct device * dev)
260{
261 struct pci_dev * pci_dev = to_pci_dev(dev);
262 struct pci_driver * drv = pci_dev->driver;
263
264 if (drv) {
265 if (drv->remove)
266 drv->remove(pci_dev);
267 pci_dev->driver = NULL;
268 }
269
2449e06a
SL
270 /*
271 * If the device is still on, set the power state as "unknown",
272 * since it might change by the next time we load the driver.
273 */
274 if (pci_dev->current_state == PCI_D0)
275 pci_dev->current_state = PCI_UNKNOWN;
276
1da177e4
LT
277 /*
278 * We would love to complain here if pci_dev->is_enabled is set, that
279 * the driver should have called pci_disable_device(), but the
280 * unfortunate fact is there are too many odd BIOS and bridge setups
281 * that don't like drivers doing that all of the time.
282 * Oh well, we can dream of sane hardware when we sleep, no matter how
283 * horrible the crap we have to deal with is when we are awake...
284 */
285
286 pci_dev_put(pci_dev);
287 return 0;
288}
289
bbb44d9f
RW
290static void pci_device_shutdown(struct device *dev)
291{
292 struct pci_dev *pci_dev = to_pci_dev(dev);
293 struct pci_driver *drv = pci_dev->driver;
294
295 if (drv && drv->shutdown)
296 drv->shutdown(pci_dev);
297 pci_msi_shutdown(pci_dev);
298 pci_msix_shutdown(pci_dev);
299}
300
301#ifdef CONFIG_PM_SLEEP
302
303/*
304 * Default "suspend" method for devices that have no driver provided suspend,
305 * or not even a driver at all.
306 */
307static void pci_default_pm_suspend(struct pci_dev *pci_dev)
308{
309 pci_save_state(pci_dev);
310 /*
311 * mark its power state as "unknown", since we don't know if
312 * e.g. the BIOS will change its device state when we suspend.
313 */
314 if (pci_dev->current_state == PCI_D0)
315 pci_dev->current_state = PCI_UNKNOWN;
316}
317
318/*
319 * Default "resume" method for devices that have no driver provided resume,
320 * or not even a driver at all.
321 */
322static int pci_default_pm_resume(struct pci_dev *pci_dev)
323{
324 int retval = 0;
325
326 /* restore the PCI config space */
327 pci_restore_state(pci_dev);
328 /* if the device was enabled before suspend, reenable */
329 retval = pci_reenable_device(pci_dev);
330 /*
331 * if the device was busmaster before the suspend, make it busmaster
332 * again
333 */
334 if (pci_dev->is_busmaster)
335 pci_set_master(pci_dev);
336
337 return retval;
338}
339
340static int pci_legacy_suspend(struct device *dev, pm_message_t state)
1da177e4
LT
341{
342 struct pci_dev * pci_dev = to_pci_dev(dev);
343 struct pci_driver * drv = pci_dev->driver;
344 int i = 0;
345
02669492 346 if (drv && drv->suspend) {
1da177e4 347 i = drv->suspend(pci_dev, state);
02669492
AM
348 suspend_report_result(drv->suspend, i);
349 } else {
bbb44d9f 350 pci_default_pm_suspend(pci_dev);
02669492 351 }
1da177e4
LT
352 return i;
353}
354
bbb44d9f 355static int pci_legacy_suspend_late(struct device *dev, pm_message_t state)
cbd69dbb
LT
356{
357 struct pci_dev * pci_dev = to_pci_dev(dev);
358 struct pci_driver * drv = pci_dev->driver;
359 int i = 0;
360
361 if (drv && drv->suspend_late) {
362 i = drv->suspend_late(pci_dev, state);
363 suspend_report_result(drv->suspend_late, i);
364 }
365 return i;
366}
1da177e4 367
bbb44d9f 368static int pci_legacy_resume(struct device *dev)
1da177e4 369{
8d92bc22 370 int error;
1da177e4
LT
371 struct pci_dev * pci_dev = to_pci_dev(dev);
372 struct pci_driver * drv = pci_dev->driver;
373
374 if (drv && drv->resume)
8d92bc22 375 error = drv->resume(pci_dev);
1da177e4 376 else
bbb44d9f 377 error = pci_default_pm_resume(pci_dev);
8d92bc22 378 return error;
1da177e4
LT
379}
380
bbb44d9f 381static int pci_legacy_resume_early(struct device *dev)
cbd69dbb
LT
382{
383 int error = 0;
384 struct pci_dev * pci_dev = to_pci_dev(dev);
385 struct pci_driver * drv = pci_dev->driver;
386
387 if (drv && drv->resume_early)
388 error = drv->resume_early(pci_dev);
389 return error;
390}
391
bbb44d9f
RW
392static int pci_pm_prepare(struct device *dev)
393{
394 struct device_driver *drv = dev->driver;
395 int error = 0;
396
397 if (drv && drv->pm && drv->pm->prepare)
398 error = drv->pm->prepare(dev);
399
400 return error;
401}
402
403static void pci_pm_complete(struct device *dev)
404{
405 struct device_driver *drv = dev->driver;
406
407 if (drv && drv->pm && drv->pm->complete)
408 drv->pm->complete(dev);
409}
410
411#ifdef CONFIG_SUSPEND
412
413static int pci_pm_suspend(struct device *dev)
414{
415 struct pci_dev *pci_dev = to_pci_dev(dev);
416 struct device_driver *drv = dev->driver;
417 int error = 0;
418
419 if (drv && drv->pm) {
420 if (drv->pm->suspend) {
421 error = drv->pm->suspend(dev);
422 suspend_report_result(drv->pm->suspend, error);
423 } else {
424 pci_default_pm_suspend(pci_dev);
425 }
426 } else {
427 error = pci_legacy_suspend(dev, PMSG_SUSPEND);
428 }
429 pci_fixup_device(pci_fixup_suspend, pci_dev);
430
431 return error;
432}
433
434static int pci_pm_suspend_noirq(struct device *dev)
c8958177
GK
435{
436 struct pci_dev *pci_dev = to_pci_dev(dev);
437 struct pci_driver *drv = pci_dev->driver;
bbb44d9f 438 int error = 0;
c8958177 439
bbb44d9f
RW
440 if (drv && drv->pm) {
441 if (drv->pm->suspend_noirq) {
442 error = drv->pm->suspend_noirq(dev);
443 suspend_report_result(drv->pm->suspend_noirq, error);
444 }
445 } else {
446 error = pci_legacy_suspend_late(dev, PMSG_SUSPEND);
447 }
448
449 return error;
c8958177 450}
1da177e4 451
bbb44d9f
RW
452static int pci_pm_resume(struct device *dev)
453{
454 struct pci_dev *pci_dev = to_pci_dev(dev);
455 struct device_driver *drv = dev->driver;
456 int error;
457
458 pci_fixup_device(pci_fixup_resume, pci_dev);
459
460 if (drv && drv->pm) {
461 error = drv->pm->resume ? drv->pm->resume(dev) :
462 pci_default_pm_resume(pci_dev);
463 } else {
464 error = pci_legacy_resume(dev);
465 }
466
467 return error;
468}
469
470static int pci_pm_resume_noirq(struct device *dev)
471{
472 struct pci_dev *pci_dev = to_pci_dev(dev);
473 struct pci_driver *drv = pci_dev->driver;
474 int error = 0;
475
476 pci_fixup_device(pci_fixup_resume_early, pci_dev);
477
478 if (drv && drv->pm) {
479 if (drv->pm->resume_noirq)
480 error = drv->pm->resume_noirq(dev);
481 } else {
482 error = pci_legacy_resume_early(dev);
483 }
484
485 return error;
486}
487
488#else /* !CONFIG_SUSPEND */
489
490#define pci_pm_suspend NULL
491#define pci_pm_suspend_noirq NULL
492#define pci_pm_resume NULL
493#define pci_pm_resume_noirq NULL
494
495#endif /* !CONFIG_SUSPEND */
496
497#ifdef CONFIG_HIBERNATION
498
499static int pci_pm_freeze(struct device *dev)
500{
501 struct pci_dev *pci_dev = to_pci_dev(dev);
502 struct device_driver *drv = dev->driver;
503 int error = 0;
504
505 if (drv && drv->pm) {
506 if (drv->pm->freeze) {
507 error = drv->pm->freeze(dev);
508 suspend_report_result(drv->pm->freeze, error);
509 } else {
510 pci_default_pm_suspend(pci_dev);
511 }
512 } else {
513 error = pci_legacy_suspend(dev, PMSG_FREEZE);
514 pci_fixup_device(pci_fixup_suspend, pci_dev);
515 }
516
517 return error;
518}
519
520static int pci_pm_freeze_noirq(struct device *dev)
521{
522 struct pci_dev *pci_dev = to_pci_dev(dev);
523 struct pci_driver *drv = pci_dev->driver;
524 int error = 0;
525
526 if (drv && drv->pm) {
527 if (drv->pm->freeze_noirq) {
528 error = drv->pm->freeze_noirq(dev);
529 suspend_report_result(drv->pm->freeze_noirq, error);
530 }
531 } else {
532 error = pci_legacy_suspend_late(dev, PMSG_FREEZE);
533 }
534
535 return error;
536}
537
538static int pci_pm_thaw(struct device *dev)
539{
540 struct device_driver *drv = dev->driver;
541 int error = 0;
542
543 if (drv && drv->pm) {
544 if (drv->pm->thaw)
545 error = drv->pm->thaw(dev);
546 } else {
547 pci_fixup_device(pci_fixup_resume, to_pci_dev(dev));
548 error = pci_legacy_resume(dev);
549 }
550
551 return error;
552}
553
554static int pci_pm_thaw_noirq(struct device *dev)
555{
556 struct pci_dev *pci_dev = to_pci_dev(dev);
557 struct pci_driver *drv = pci_dev->driver;
558 int error = 0;
559
560 if (drv && drv->pm) {
561 if (drv->pm->thaw_noirq)
562 error = drv->pm->thaw_noirq(dev);
563 } else {
564 pci_fixup_device(pci_fixup_resume_early, pci_dev);
565 error = pci_legacy_resume_early(dev);
566 }
567
568 return error;
569}
570
571static int pci_pm_poweroff(struct device *dev)
572{
573 struct device_driver *drv = dev->driver;
574 int error = 0;
575
576 pci_fixup_device(pci_fixup_suspend, to_pci_dev(dev));
577
578 if (drv && drv->pm) {
579 if (drv->pm->poweroff) {
580 error = drv->pm->poweroff(dev);
581 suspend_report_result(drv->pm->poweroff, error);
582 }
583 } else {
584 error = pci_legacy_suspend(dev, PMSG_HIBERNATE);
585 }
586
587 return error;
588}
589
590static int pci_pm_poweroff_noirq(struct device *dev)
591{
592 struct pci_dev *pci_dev = to_pci_dev(dev);
593 struct pci_driver *drv = pci_dev->driver;
594 int error = 0;
595
596 if (drv && drv->pm) {
597 if (drv->pm->poweroff_noirq) {
598 error = drv->pm->poweroff_noirq(dev);
599 suspend_report_result(drv->pm->poweroff_noirq, error);
600 }
601 } else {
602 error = pci_legacy_suspend_late(dev, PMSG_HIBERNATE);
603 }
604
605 return error;
606}
607
608static int pci_pm_restore(struct device *dev)
609{
610 struct pci_dev *pci_dev = to_pci_dev(dev);
611 struct device_driver *drv = dev->driver;
612 int error;
613
614 if (drv && drv->pm) {
615 error = drv->pm->restore ? drv->pm->restore(dev) :
616 pci_default_pm_resume(pci_dev);
617 } else {
618 error = pci_legacy_resume(dev);
619 }
620 pci_fixup_device(pci_fixup_resume, pci_dev);
621
622 return error;
623}
624
625static int pci_pm_restore_noirq(struct device *dev)
626{
627 struct pci_dev *pci_dev = to_pci_dev(dev);
628 struct pci_driver *drv = pci_dev->driver;
629 int error = 0;
630
631 pci_fixup_device(pci_fixup_resume, pci_dev);
632
633 if (drv && drv->pm) {
634 if (drv->pm->restore_noirq)
635 error = drv->pm->restore_noirq(dev);
636 } else {
637 error = pci_legacy_resume_early(dev);
638 }
639 pci_fixup_device(pci_fixup_resume_early, pci_dev);
640
641 return error;
c8958177 642}
1da177e4 643
bbb44d9f
RW
644#else /* !CONFIG_HIBERNATION */
645
646#define pci_pm_freeze NULL
647#define pci_pm_freeze_noirq NULL
648#define pci_pm_thaw NULL
649#define pci_pm_thaw_noirq NULL
650#define pci_pm_poweroff NULL
651#define pci_pm_poweroff_noirq NULL
652#define pci_pm_restore NULL
653#define pci_pm_restore_noirq NULL
654
655#endif /* !CONFIG_HIBERNATION */
656
657struct pm_ext_ops pci_pm_ops = {
658 .base = {
659 .prepare = pci_pm_prepare,
660 .complete = pci_pm_complete,
661 .suspend = pci_pm_suspend,
662 .resume = pci_pm_resume,
663 .freeze = pci_pm_freeze,
664 .thaw = pci_pm_thaw,
665 .poweroff = pci_pm_poweroff,
666 .restore = pci_pm_restore,
667 },
668 .suspend_noirq = pci_pm_suspend_noirq,
669 .resume_noirq = pci_pm_resume_noirq,
670 .freeze_noirq = pci_pm_freeze_noirq,
671 .thaw_noirq = pci_pm_thaw_noirq,
672 .poweroff_noirq = pci_pm_poweroff_noirq,
673 .restore_noirq = pci_pm_restore_noirq,
674};
675
676#define PCI_PM_OPS_PTR &pci_pm_ops
677
678#else /* !CONFIG_PM_SLEEP */
679
680#define PCI_PM_OPS_PTR NULL
681
682#endif /* !CONFIG_PM_SLEEP */
683
1da177e4 684/**
863b18f4 685 * __pci_register_driver - register a new pci driver
1da177e4 686 * @drv: the driver structure to register
863b18f4 687 * @owner: owner module of drv
f95d882d 688 * @mod_name: module name string
1da177e4
LT
689 *
690 * Adds the driver structure to the list of registered drivers.
691 * Returns a negative value on error, otherwise 0.
eaae4b3a 692 * If no error occurred, the driver remains registered even if
1da177e4
LT
693 * no device was claimed during registration.
694 */
725522b5
GKH
695int __pci_register_driver(struct pci_driver *drv, struct module *owner,
696 const char *mod_name)
1da177e4
LT
697{
698 int error;
699
700 /* initialize common driver fields */
701 drv->driver.name = drv->name;
702 drv->driver.bus = &pci_bus_type;
863b18f4 703 drv->driver.owner = owner;
725522b5 704 drv->driver.mod_name = mod_name;
50b00755 705
bbb44d9f
RW
706 if (drv->pm)
707 drv->driver.pm = &drv->pm->base;
708
75865858
GKH
709 spin_lock_init(&drv->dynids.lock);
710 INIT_LIST_HEAD(&drv->dynids.list);
1da177e4
LT
711
712 /* register with core */
713 error = driver_register(&drv->driver);
50bf14b3
AM
714 if (error)
715 return error;
1da177e4 716
50bf14b3
AM
717 error = pci_create_newid_file(drv);
718 if (error)
719 driver_unregister(&drv->driver);
1da177e4
LT
720
721 return error;
722}
723
724/**
725 * pci_unregister_driver - unregister a pci driver
726 * @drv: the driver structure to unregister
727 *
728 * Deletes the driver structure from the list of registered PCI drivers,
729 * gives it a chance to clean up by calling its remove() function for
730 * each device it was responsible for, and marks those devices as
731 * driverless.
732 */
733
734void
735pci_unregister_driver(struct pci_driver *drv)
736{
03d43b19 737 pci_remove_newid_file(drv);
1da177e4
LT
738 driver_unregister(&drv->driver);
739 pci_free_dynids(drv);
740}
741
742static struct pci_driver pci_compat_driver = {
743 .name = "compat"
744};
745
746/**
747 * pci_dev_driver - get the pci_driver of a device
748 * @dev: the device to query
749 *
750 * Returns the appropriate pci_driver structure or %NULL if there is no
751 * registered driver for the device.
752 */
753struct pci_driver *
754pci_dev_driver(const struct pci_dev *dev)
755{
756 if (dev->driver)
757 return dev->driver;
758 else {
759 int i;
760 for(i=0; i<=PCI_ROM_RESOURCE; i++)
761 if (dev->resource[i].flags & IORESOURCE_BUSY)
762 return &pci_compat_driver;
763 }
764 return NULL;
765}
766
767/**
768 * pci_bus_match - Tell if a PCI device structure has a matching PCI device id structure
1da177e4 769 * @dev: the PCI device structure to match against
8f7020d3 770 * @drv: the device driver to search for matching PCI device id structures
1da177e4
LT
771 *
772 * Used by a driver to check whether a PCI device present in the
8f7020d3 773 * system is in its list of supported devices. Returns the matching
1da177e4
LT
774 * pci_device_id structure or %NULL if there is no match.
775 */
75865858 776static int pci_bus_match(struct device *dev, struct device_driver *drv)
1da177e4 777{
75865858
GKH
778 struct pci_dev *pci_dev = to_pci_dev(dev);
779 struct pci_driver *pci_drv = to_pci_driver(drv);
1da177e4
LT
780 const struct pci_device_id *found_id;
781
75865858 782 found_id = pci_match_device(pci_drv, pci_dev);
1da177e4
LT
783 if (found_id)
784 return 1;
785
75865858 786 return 0;
1da177e4
LT
787}
788
789/**
790 * pci_dev_get - increments the reference count of the pci device structure
791 * @dev: the device being referenced
792 *
793 * Each live reference to a device should be refcounted.
794 *
795 * Drivers for PCI devices should normally record such references in
796 * their probe() methods, when they bind to a device, and release
797 * them by calling pci_dev_put(), in their disconnect() methods.
798 *
799 * A pointer to the device with the incremented reference counter is returned.
800 */
801struct pci_dev *pci_dev_get(struct pci_dev *dev)
802{
803 if (dev)
804 get_device(&dev->dev);
805 return dev;
806}
807
808/**
809 * pci_dev_put - release a use of the pci device structure
810 * @dev: device that's been disconnected
811 *
812 * Must be called when a user of a device is finished with it. When the last
813 * user of the device calls this function, the memory of the device is freed.
814 */
815void pci_dev_put(struct pci_dev *dev)
816{
817 if (dev)
818 put_device(&dev->dev);
819}
820
821#ifndef CONFIG_HOTPLUG
7eff2e7a 822int pci_uevent(struct device *dev, struct kobj_uevent_env *env)
1da177e4
LT
823{
824 return -ENODEV;
825}
826#endif
827
828struct bus_type pci_bus_type = {
829 .name = "pci",
830 .match = pci_bus_match,
312c004d 831 .uevent = pci_uevent,
b15d686a
RK
832 .probe = pci_device_probe,
833 .remove = pci_device_remove,
cbd69dbb 834 .shutdown = pci_device_shutdown,
1da177e4 835 .dev_attrs = pci_dev_attrs,
bbb44d9f 836 .pm = PCI_PM_OPS_PTR,
1da177e4
LT
837};
838
839static int __init pci_driver_init(void)
840{
841 return bus_register(&pci_bus_type);
842}
843
844postcore_initcall(pci_driver_init);
845
75865858 846EXPORT_SYMBOL(pci_match_id);
863b18f4 847EXPORT_SYMBOL(__pci_register_driver);
1da177e4
LT
848EXPORT_SYMBOL(pci_unregister_driver);
849EXPORT_SYMBOL(pci_dev_driver);
850EXPORT_SYMBOL(pci_bus_type);
851EXPORT_SYMBOL(pci_dev_get);
852EXPORT_SYMBOL(pci_dev_put);
This page took 0.487458 seconds and 5 git commands to generate.