]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - drivers/pci/pci-driver.c
PCI/ACPI: acpiphp: Identify more removable slots
[mirror_ubuntu-zesty-kernel.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
GKH
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
355a72d7
RW
303static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev)
304{
305 struct pci_driver *drv = pci_dev->driver;
306
307 return drv && (drv->suspend || drv->suspend_late || drv->resume
308 || drv->resume_early);
309}
310
bbb44d9f
RW
311/*
312 * Default "suspend" method for devices that have no driver provided suspend,
313 * or not even a driver at all.
314 */
315static void pci_default_pm_suspend(struct pci_dev *pci_dev)
316{
317 pci_save_state(pci_dev);
318 /*
319 * mark its power state as "unknown", since we don't know if
320 * e.g. the BIOS will change its device state when we suspend.
321 */
322 if (pci_dev->current_state == PCI_D0)
323 pci_dev->current_state = PCI_UNKNOWN;
324}
325
326/*
327 * Default "resume" method for devices that have no driver provided resume,
355a72d7 328 * or not even a driver at all (first part).
bbb44d9f 329 */
355a72d7 330static void pci_default_pm_resume_early(struct pci_dev *pci_dev)
bbb44d9f 331{
bbb44d9f
RW
332 /* restore the PCI config space */
333 pci_restore_state(pci_dev);
355a72d7
RW
334}
335
336/*
337 * Default "resume" method for devices that have no driver provided resume,
338 * or not even a driver at all (second part).
339 */
340static int pci_default_pm_resume_late(struct pci_dev *pci_dev)
341{
342 int retval;
343
bbb44d9f
RW
344 /* if the device was enabled before suspend, reenable */
345 retval = pci_reenable_device(pci_dev);
346 /*
347 * if the device was busmaster before the suspend, make it busmaster
348 * again
349 */
350 if (pci_dev->is_busmaster)
351 pci_set_master(pci_dev);
352
353 return retval;
354}
355
356static int pci_legacy_suspend(struct device *dev, pm_message_t state)
1da177e4
LT
357{
358 struct pci_dev * pci_dev = to_pci_dev(dev);
359 struct pci_driver * drv = pci_dev->driver;
360 int i = 0;
361
02669492 362 if (drv && drv->suspend) {
1da177e4 363 i = drv->suspend(pci_dev, state);
02669492
AM
364 suspend_report_result(drv->suspend, i);
365 } else {
bbb44d9f 366 pci_default_pm_suspend(pci_dev);
02669492 367 }
1da177e4
LT
368 return i;
369}
370
bbb44d9f 371static int pci_legacy_suspend_late(struct device *dev, pm_message_t state)
cbd69dbb
LT
372{
373 struct pci_dev * pci_dev = to_pci_dev(dev);
374 struct pci_driver * drv = pci_dev->driver;
375 int i = 0;
376
377 if (drv && drv->suspend_late) {
378 i = drv->suspend_late(pci_dev, state);
379 suspend_report_result(drv->suspend_late, i);
380 }
381 return i;
382}
1da177e4 383
bbb44d9f 384static int pci_legacy_resume(struct device *dev)
1da177e4 385{
8d92bc22 386 int error;
1da177e4
LT
387 struct pci_dev * pci_dev = to_pci_dev(dev);
388 struct pci_driver * drv = pci_dev->driver;
389
355a72d7 390 if (drv && drv->resume) {
8d92bc22 391 error = drv->resume(pci_dev);
355a72d7
RW
392 } else {
393 pci_default_pm_resume_early(pci_dev);
394 error = pci_default_pm_resume_late(pci_dev);
395 }
8d92bc22 396 return error;
1da177e4
LT
397}
398
bbb44d9f 399static int pci_legacy_resume_early(struct device *dev)
cbd69dbb
LT
400{
401 int error = 0;
402 struct pci_dev * pci_dev = to_pci_dev(dev);
403 struct pci_driver * drv = pci_dev->driver;
404
405 if (drv && drv->resume_early)
406 error = drv->resume_early(pci_dev);
407 return error;
408}
409
bbb44d9f
RW
410static int pci_pm_prepare(struct device *dev)
411{
412 struct device_driver *drv = dev->driver;
413 int error = 0;
414
415 if (drv && drv->pm && drv->pm->prepare)
416 error = drv->pm->prepare(dev);
417
418 return error;
419}
420
421static void pci_pm_complete(struct device *dev)
422{
423 struct device_driver *drv = dev->driver;
424
425 if (drv && drv->pm && drv->pm->complete)
426 drv->pm->complete(dev);
427}
428
429#ifdef CONFIG_SUSPEND
430
431static int pci_pm_suspend(struct device *dev)
432{
433 struct pci_dev *pci_dev = to_pci_dev(dev);
434 struct device_driver *drv = dev->driver;
435 int error = 0;
436
437 if (drv && drv->pm) {
438 if (drv->pm->suspend) {
439 error = drv->pm->suspend(dev);
440 suspend_report_result(drv->pm->suspend, error);
bbb44d9f 441 }
355a72d7 442 } else if (pci_has_legacy_pm_support(pci_dev)) {
bbb44d9f
RW
443 error = pci_legacy_suspend(dev, PMSG_SUSPEND);
444 }
445 pci_fixup_device(pci_fixup_suspend, pci_dev);
446
447 return error;
448}
449
450static int pci_pm_suspend_noirq(struct device *dev)
c8958177 451{
355a72d7 452 struct pci_dev *pci_dev = to_pci_dev(dev);
adf09493 453 struct device_driver *drv = dev->driver;
bbb44d9f 454 int error = 0;
c8958177 455
bbb44d9f
RW
456 if (drv && drv->pm) {
457 if (drv->pm->suspend_noirq) {
458 error = drv->pm->suspend_noirq(dev);
459 suspend_report_result(drv->pm->suspend_noirq, error);
460 }
355a72d7 461 } else if (pci_has_legacy_pm_support(pci_dev)) {
bbb44d9f 462 error = pci_legacy_suspend_late(dev, PMSG_SUSPEND);
355a72d7
RW
463 } else {
464 pci_default_pm_suspend(pci_dev);
bbb44d9f
RW
465 }
466
467 return error;
c8958177 468}
1da177e4 469
bbb44d9f
RW
470static int pci_pm_resume(struct device *dev)
471{
472 struct pci_dev *pci_dev = to_pci_dev(dev);
473 struct device_driver *drv = dev->driver;
355a72d7 474 int error = 0;
bbb44d9f
RW
475
476 pci_fixup_device(pci_fixup_resume, pci_dev);
477
478 if (drv && drv->pm) {
355a72d7
RW
479 if (drv->pm->resume)
480 error = drv->pm->resume(dev);
481 } else if (pci_has_legacy_pm_support(pci_dev)) {
bbb44d9f 482 error = pci_legacy_resume(dev);
355a72d7
RW
483 } else {
484 error = pci_default_pm_resume_late(pci_dev);
bbb44d9f
RW
485 }
486
487 return error;
488}
489
490static int pci_pm_resume_noirq(struct device *dev)
491{
355a72d7 492 struct pci_dev *pci_dev = to_pci_dev(dev);
adf09493 493 struct device_driver *drv = dev->driver;
bbb44d9f
RW
494 int error = 0;
495
adf09493 496 pci_fixup_device(pci_fixup_resume_early, to_pci_dev(dev));
bbb44d9f
RW
497
498 if (drv && drv->pm) {
499 if (drv->pm->resume_noirq)
500 error = drv->pm->resume_noirq(dev);
355a72d7 501 } else if (pci_has_legacy_pm_support(pci_dev)) {
bbb44d9f 502 error = pci_legacy_resume_early(dev);
355a72d7
RW
503 } else {
504 pci_default_pm_resume_early(pci_dev);
bbb44d9f
RW
505 }
506
507 return error;
508}
509
510#else /* !CONFIG_SUSPEND */
511
512#define pci_pm_suspend NULL
513#define pci_pm_suspend_noirq NULL
514#define pci_pm_resume NULL
515#define pci_pm_resume_noirq NULL
516
517#endif /* !CONFIG_SUSPEND */
518
519#ifdef CONFIG_HIBERNATION
520
521static int pci_pm_freeze(struct device *dev)
522{
523 struct pci_dev *pci_dev = to_pci_dev(dev);
524 struct device_driver *drv = dev->driver;
525 int error = 0;
526
527 if (drv && drv->pm) {
528 if (drv->pm->freeze) {
529 error = drv->pm->freeze(dev);
530 suspend_report_result(drv->pm->freeze, error);
bbb44d9f 531 }
355a72d7 532 } else if (pci_has_legacy_pm_support(pci_dev)) {
bbb44d9f
RW
533 error = pci_legacy_suspend(dev, PMSG_FREEZE);
534 pci_fixup_device(pci_fixup_suspend, pci_dev);
535 }
536
537 return error;
538}
539
540static int pci_pm_freeze_noirq(struct device *dev)
541{
355a72d7 542 struct pci_dev *pci_dev = to_pci_dev(dev);
adf09493 543 struct device_driver *drv = dev->driver;
bbb44d9f
RW
544 int error = 0;
545
546 if (drv && drv->pm) {
547 if (drv->pm->freeze_noirq) {
548 error = drv->pm->freeze_noirq(dev);
549 suspend_report_result(drv->pm->freeze_noirq, error);
550 }
355a72d7 551 } else if (pci_has_legacy_pm_support(pci_dev)) {
bbb44d9f 552 error = pci_legacy_suspend_late(dev, PMSG_FREEZE);
355a72d7
RW
553 } else {
554 pci_default_pm_suspend(pci_dev);
bbb44d9f
RW
555 }
556
557 return error;
558}
559
560static int pci_pm_thaw(struct device *dev)
561{
355a72d7 562 struct pci_dev *pci_dev = to_pci_dev(dev);
bbb44d9f
RW
563 struct device_driver *drv = dev->driver;
564 int error = 0;
565
566 if (drv && drv->pm) {
567 if (drv->pm->thaw)
568 error = drv->pm->thaw(dev);
355a72d7
RW
569 } else if (pci_has_legacy_pm_support(pci_dev)) {
570 pci_fixup_device(pci_fixup_resume, pci_dev);
bbb44d9f
RW
571 error = pci_legacy_resume(dev);
572 }
573
574 return error;
575}
576
577static int pci_pm_thaw_noirq(struct device *dev)
578{
355a72d7 579 struct pci_dev *pci_dev = to_pci_dev(dev);
adf09493 580 struct device_driver *drv = dev->driver;
bbb44d9f
RW
581 int error = 0;
582
583 if (drv && drv->pm) {
584 if (drv->pm->thaw_noirq)
585 error = drv->pm->thaw_noirq(dev);
355a72d7 586 } else if (pci_has_legacy_pm_support(pci_dev)) {
adf09493 587 pci_fixup_device(pci_fixup_resume_early, to_pci_dev(dev));
bbb44d9f
RW
588 error = pci_legacy_resume_early(dev);
589 }
590
591 return error;
592}
593
594static int pci_pm_poweroff(struct device *dev)
595{
355a72d7 596 struct pci_dev *pci_dev = to_pci_dev(dev);
bbb44d9f
RW
597 struct device_driver *drv = dev->driver;
598 int error = 0;
599
355a72d7 600 pci_fixup_device(pci_fixup_suspend, pci_dev);
bbb44d9f
RW
601
602 if (drv && drv->pm) {
603 if (drv->pm->poweroff) {
604 error = drv->pm->poweroff(dev);
605 suspend_report_result(drv->pm->poweroff, error);
606 }
355a72d7 607 } else if (pci_has_legacy_pm_support(pci_dev)) {
bbb44d9f
RW
608 error = pci_legacy_suspend(dev, PMSG_HIBERNATE);
609 }
610
611 return error;
612}
613
614static int pci_pm_poweroff_noirq(struct device *dev)
615{
adf09493 616 struct device_driver *drv = dev->driver;
bbb44d9f
RW
617 int error = 0;
618
619 if (drv && drv->pm) {
620 if (drv->pm->poweroff_noirq) {
621 error = drv->pm->poweroff_noirq(dev);
622 suspend_report_result(drv->pm->poweroff_noirq, error);
623 }
355a72d7 624 } else if (pci_has_legacy_pm_support(to_pci_dev(dev))) {
bbb44d9f
RW
625 error = pci_legacy_suspend_late(dev, PMSG_HIBERNATE);
626 }
627
628 return error;
629}
630
631static int pci_pm_restore(struct device *dev)
632{
633 struct pci_dev *pci_dev = to_pci_dev(dev);
634 struct device_driver *drv = dev->driver;
355a72d7 635 int error = 0;
bbb44d9f
RW
636
637 if (drv && drv->pm) {
355a72d7
RW
638 if (drv->pm->restore)
639 error = drv->pm->restore(dev);
640 } else if (pci_has_legacy_pm_support(pci_dev)) {
bbb44d9f 641 error = pci_legacy_resume(dev);
355a72d7
RW
642 } else {
643 error = pci_default_pm_resume_late(pci_dev);
bbb44d9f
RW
644 }
645 pci_fixup_device(pci_fixup_resume, pci_dev);
646
647 return error;
648}
649
650static int pci_pm_restore_noirq(struct device *dev)
651{
652 struct pci_dev *pci_dev = to_pci_dev(dev);
adf09493 653 struct device_driver *drv = dev->driver;
bbb44d9f
RW
654 int error = 0;
655
656 pci_fixup_device(pci_fixup_resume, pci_dev);
657
658 if (drv && drv->pm) {
659 if (drv->pm->restore_noirq)
660 error = drv->pm->restore_noirq(dev);
355a72d7 661 } else if (pci_has_legacy_pm_support(pci_dev)) {
bbb44d9f 662 error = pci_legacy_resume_early(dev);
355a72d7
RW
663 } else {
664 pci_default_pm_resume_early(pci_dev);
bbb44d9f
RW
665 }
666 pci_fixup_device(pci_fixup_resume_early, pci_dev);
667
668 return error;
c8958177 669}
1da177e4 670
bbb44d9f
RW
671#else /* !CONFIG_HIBERNATION */
672
673#define pci_pm_freeze NULL
674#define pci_pm_freeze_noirq NULL
675#define pci_pm_thaw NULL
676#define pci_pm_thaw_noirq NULL
677#define pci_pm_poweroff NULL
678#define pci_pm_poweroff_noirq NULL
679#define pci_pm_restore NULL
680#define pci_pm_restore_noirq NULL
681
682#endif /* !CONFIG_HIBERNATION */
683
adf09493
RW
684struct dev_pm_ops pci_dev_pm_ops = {
685 .prepare = pci_pm_prepare,
686 .complete = pci_pm_complete,
687 .suspend = pci_pm_suspend,
688 .resume = pci_pm_resume,
689 .freeze = pci_pm_freeze,
690 .thaw = pci_pm_thaw,
691 .poweroff = pci_pm_poweroff,
692 .restore = pci_pm_restore,
bbb44d9f
RW
693 .suspend_noirq = pci_pm_suspend_noirq,
694 .resume_noirq = pci_pm_resume_noirq,
695 .freeze_noirq = pci_pm_freeze_noirq,
696 .thaw_noirq = pci_pm_thaw_noirq,
697 .poweroff_noirq = pci_pm_poweroff_noirq,
698 .restore_noirq = pci_pm_restore_noirq,
699};
700
adf09493 701#define PCI_PM_OPS_PTR (&pci_dev_pm_ops)
bbb44d9f
RW
702
703#else /* !CONFIG_PM_SLEEP */
704
705#define PCI_PM_OPS_PTR NULL
706
707#endif /* !CONFIG_PM_SLEEP */
708
1da177e4 709/**
863b18f4 710 * __pci_register_driver - register a new pci driver
1da177e4 711 * @drv: the driver structure to register
863b18f4 712 * @owner: owner module of drv
f95d882d 713 * @mod_name: module name string
1da177e4
LT
714 *
715 * Adds the driver structure to the list of registered drivers.
716 * Returns a negative value on error, otherwise 0.
eaae4b3a 717 * If no error occurred, the driver remains registered even if
1da177e4
LT
718 * no device was claimed during registration.
719 */
725522b5
GKH
720int __pci_register_driver(struct pci_driver *drv, struct module *owner,
721 const char *mod_name)
1da177e4
LT
722{
723 int error;
724
725 /* initialize common driver fields */
726 drv->driver.name = drv->name;
727 drv->driver.bus = &pci_bus_type;
863b18f4 728 drv->driver.owner = owner;
725522b5 729 drv->driver.mod_name = mod_name;
50b00755 730
75865858
GKH
731 spin_lock_init(&drv->dynids.lock);
732 INIT_LIST_HEAD(&drv->dynids.list);
1da177e4
LT
733
734 /* register with core */
735 error = driver_register(&drv->driver);
50bf14b3
AM
736 if (error)
737 return error;
1da177e4 738
50bf14b3
AM
739 error = pci_create_newid_file(drv);
740 if (error)
741 driver_unregister(&drv->driver);
1da177e4
LT
742
743 return error;
744}
745
746/**
747 * pci_unregister_driver - unregister a pci driver
748 * @drv: the driver structure to unregister
749 *
750 * Deletes the driver structure from the list of registered PCI drivers,
751 * gives it a chance to clean up by calling its remove() function for
752 * each device it was responsible for, and marks those devices as
753 * driverless.
754 */
755
756void
757pci_unregister_driver(struct pci_driver *drv)
758{
03d43b19 759 pci_remove_newid_file(drv);
1da177e4
LT
760 driver_unregister(&drv->driver);
761 pci_free_dynids(drv);
762}
763
764static struct pci_driver pci_compat_driver = {
765 .name = "compat"
766};
767
768/**
769 * pci_dev_driver - get the pci_driver of a device
770 * @dev: the device to query
771 *
772 * Returns the appropriate pci_driver structure or %NULL if there is no
773 * registered driver for the device.
774 */
775struct pci_driver *
776pci_dev_driver(const struct pci_dev *dev)
777{
778 if (dev->driver)
779 return dev->driver;
780 else {
781 int i;
782 for(i=0; i<=PCI_ROM_RESOURCE; i++)
783 if (dev->resource[i].flags & IORESOURCE_BUSY)
784 return &pci_compat_driver;
785 }
786 return NULL;
787}
788
789/**
790 * pci_bus_match - Tell if a PCI device structure has a matching PCI device id structure
1da177e4 791 * @dev: the PCI device structure to match against
8f7020d3 792 * @drv: the device driver to search for matching PCI device id structures
1da177e4
LT
793 *
794 * Used by a driver to check whether a PCI device present in the
8f7020d3 795 * system is in its list of supported devices. Returns the matching
1da177e4
LT
796 * pci_device_id structure or %NULL if there is no match.
797 */
75865858 798static int pci_bus_match(struct device *dev, struct device_driver *drv)
1da177e4 799{
75865858
GKH
800 struct pci_dev *pci_dev = to_pci_dev(dev);
801 struct pci_driver *pci_drv = to_pci_driver(drv);
1da177e4
LT
802 const struct pci_device_id *found_id;
803
75865858 804 found_id = pci_match_device(pci_drv, pci_dev);
1da177e4
LT
805 if (found_id)
806 return 1;
807
75865858 808 return 0;
1da177e4
LT
809}
810
811/**
812 * pci_dev_get - increments the reference count of the pci device structure
813 * @dev: the device being referenced
814 *
815 * Each live reference to a device should be refcounted.
816 *
817 * Drivers for PCI devices should normally record such references in
818 * their probe() methods, when they bind to a device, and release
819 * them by calling pci_dev_put(), in their disconnect() methods.
820 *
821 * A pointer to the device with the incremented reference counter is returned.
822 */
823struct pci_dev *pci_dev_get(struct pci_dev *dev)
824{
825 if (dev)
826 get_device(&dev->dev);
827 return dev;
828}
829
830/**
831 * pci_dev_put - release a use of the pci device structure
832 * @dev: device that's been disconnected
833 *
834 * Must be called when a user of a device is finished with it. When the last
835 * user of the device calls this function, the memory of the device is freed.
836 */
837void pci_dev_put(struct pci_dev *dev)
838{
839 if (dev)
840 put_device(&dev->dev);
841}
842
843#ifndef CONFIG_HOTPLUG
7eff2e7a 844int pci_uevent(struct device *dev, struct kobj_uevent_env *env)
1da177e4
LT
845{
846 return -ENODEV;
847}
848#endif
849
850struct bus_type pci_bus_type = {
851 .name = "pci",
852 .match = pci_bus_match,
312c004d 853 .uevent = pci_uevent,
b15d686a
RK
854 .probe = pci_device_probe,
855 .remove = pci_device_remove,
cbd69dbb 856 .shutdown = pci_device_shutdown,
1da177e4 857 .dev_attrs = pci_dev_attrs,
bbb44d9f 858 .pm = PCI_PM_OPS_PTR,
1da177e4
LT
859};
860
861static int __init pci_driver_init(void)
862{
863 return bus_register(&pci_bus_type);
864}
865
866postcore_initcall(pci_driver_init);
867
75865858 868EXPORT_SYMBOL(pci_match_id);
863b18f4 869EXPORT_SYMBOL(__pci_register_driver);
1da177e4
LT
870EXPORT_SYMBOL(pci_unregister_driver);
871EXPORT_SYMBOL(pci_dev_driver);
872EXPORT_SYMBOL(pci_bus_type);
873EXPORT_SYMBOL(pci_dev_get);
874EXPORT_SYMBOL(pci_dev_put);