OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [pci/] [pci-driver.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * drivers/pci/pci-driver.c
3
 *
4
 */
5
 
6
#include <linux/pci.h>
7
#include <linux/module.h>
8
#include <linux/init.h>
9
#include <linux/device.h>
10
#include <linux/mempolicy.h>
11
#include <linux/string.h>
12
#include <linux/slab.h>
13
#include <linux/sched.h>
14
#include "pci.h"
15
 
16
/*
17
 * Dynamic device IDs are disabled for !CONFIG_HOTPLUG
18
 */
19
 
20
struct pci_dynid {
21
        struct list_head node;
22
        struct pci_device_id id;
23
};
24
 
25
#ifdef CONFIG_HOTPLUG
26
 
27
/**
28
 * store_new_id - add a new PCI device ID to this driver and re-probe devices
29
 * @driver: target device driver
30
 * @buf: buffer for scanning device ID data
31
 * @count: input size
32
 *
33
 * Adds a new dynamic pci device ID to this driver,
34
 * and causes the driver to probe for all devices again.
35
 */
36
static ssize_t
37
store_new_id(struct device_driver *driver, const char *buf, size_t count)
38
{
39
        struct pci_dynid *dynid;
40
        struct pci_driver *pdrv = to_pci_driver(driver);
41
        __u32 vendor, device, subvendor=PCI_ANY_ID,
42
                subdevice=PCI_ANY_ID, class=0, class_mask=0;
43
        unsigned long driver_data=0;
44
        int fields=0;
45
        int retval = 0;
46
 
47
        fields = sscanf(buf, "%x %x %x %x %x %x %lux",
48
                        &vendor, &device, &subvendor, &subdevice,
49
                        &class, &class_mask, &driver_data);
50
        if (fields < 2)
51
                return -EINVAL;
52
 
53
        dynid = kzalloc(sizeof(*dynid), GFP_KERNEL);
54
        if (!dynid)
55
                return -ENOMEM;
56
 
57
        dynid->id.vendor = vendor;
58
        dynid->id.device = device;
59
        dynid->id.subvendor = subvendor;
60
        dynid->id.subdevice = subdevice;
61
        dynid->id.class = class;
62
        dynid->id.class_mask = class_mask;
63
        dynid->id.driver_data = pdrv->dynids.use_driver_data ?
64
                driver_data : 0UL;
65
 
66
        spin_lock(&pdrv->dynids.lock);
67
        list_add_tail(&dynid->node, &pdrv->dynids.list);
68
        spin_unlock(&pdrv->dynids.lock);
69
 
70
        if (get_driver(&pdrv->driver)) {
71
                retval = driver_attach(&pdrv->driver);
72
                put_driver(&pdrv->driver);
73
        }
74
 
75
        if (retval)
76
                return retval;
77
        return count;
78
}
79
static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
80
 
81
static void
82
pci_free_dynids(struct pci_driver *drv)
83
{
84
        struct pci_dynid *dynid, *n;
85
 
86
        spin_lock(&drv->dynids.lock);
87
        list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
88
                list_del(&dynid->node);
89
                kfree(dynid);
90
        }
91
        spin_unlock(&drv->dynids.lock);
92
}
93
 
94
static int
95
pci_create_newid_file(struct pci_driver *drv)
96
{
97
        int error = 0;
98
        if (drv->probe != NULL)
99
                error = sysfs_create_file(&drv->driver.kobj,
100
                                          &driver_attr_new_id.attr);
101
        return error;
102
}
103
 
104
#else /* !CONFIG_HOTPLUG */
105
static inline void pci_free_dynids(struct pci_driver *drv) {}
106
static inline int pci_create_newid_file(struct pci_driver *drv)
107
{
108
        return 0;
109
}
110
#endif
111
 
112
/**
113
 * pci_match_id - See if a pci device matches a given pci_id table
114
 * @ids: array of PCI device id structures to search in
115
 * @dev: the PCI device structure to match against.
116
 *
117
 * Used by a driver to check whether a PCI device present in the
118
 * system is in its list of supported devices.  Returns the matching
119
 * pci_device_id structure or %NULL if there is no match.
120
 *
121
 * Deprecated, don't use this as it will not catch any dynamic ids
122
 * that a driver might want to check for.
123
 */
124
const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
125
                                         struct pci_dev *dev)
126
{
127
        if (ids) {
128
                while (ids->vendor || ids->subvendor || ids->class_mask) {
129
                        if (pci_match_one_device(ids, dev))
130
                                return ids;
131
                        ids++;
132
                }
133
        }
134
        return NULL;
135
}
136
 
137
/**
138
 * pci_match_device - Tell if a PCI device structure has a matching PCI device id structure
139
 * @drv: the PCI driver to match against
140
 * @dev: the PCI device structure to match against
141
 *
142
 * Used by a driver to check whether a PCI device present in the
143
 * system is in its list of supported devices.  Returns the matching
144
 * pci_device_id structure or %NULL if there is no match.
145
 */
146
static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
147
                                                    struct pci_dev *dev)
148
{
149
        struct pci_dynid *dynid;
150
 
151
        /* Look at the dynamic ids first, before the static ones */
152
        spin_lock(&drv->dynids.lock);
153
        list_for_each_entry(dynid, &drv->dynids.list, node) {
154
                if (pci_match_one_device(&dynid->id, dev)) {
155
                        spin_unlock(&drv->dynids.lock);
156
                        return &dynid->id;
157
                }
158
        }
159
        spin_unlock(&drv->dynids.lock);
160
 
161
        return pci_match_id(drv->id_table, dev);
162
}
163
 
164
static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
165
                          const struct pci_device_id *id)
166
{
167
        int error;
168
#ifdef CONFIG_NUMA
169
        /* Execute driver initialization on node where the
170
           device's bus is attached to.  This way the driver likely
171
           allocates its local memory on the right node without
172
           any need to change it. */
173
        struct mempolicy *oldpol;
174
        cpumask_t oldmask = current->cpus_allowed;
175
        int node = pcibus_to_node(dev->bus);
176
        if (node >= 0 && node_online(node))
177
            set_cpus_allowed(current, node_to_cpumask(node));
178
        /* And set default memory allocation policy */
179
        oldpol = current->mempolicy;
180
        current->mempolicy = &default_policy;
181
        mpol_get(current->mempolicy);
182
#endif
183
        error = drv->probe(dev, id);
184
#ifdef CONFIG_NUMA
185
        set_cpus_allowed(current, oldmask);
186
        mpol_free(current->mempolicy);
187
        current->mempolicy = oldpol;
188
#endif
189
        return error;
190
}
191
 
192
/**
193
 * __pci_device_probe()
194
 * @drv: driver to call to check if it wants the PCI device
195
 * @pci_dev: PCI device being probed
196
 *
197
 * returns 0 on success, else error.
198
 * side-effect: pci_dev->driver is set to drv when drv claims pci_dev.
199
 */
200
static int
201
__pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
202
{
203
        const struct pci_device_id *id;
204
        int error = 0;
205
 
206
        if (!pci_dev->driver && drv->probe) {
207
                error = -ENODEV;
208
 
209
                id = pci_match_device(drv, pci_dev);
210
                if (id)
211
                        error = pci_call_probe(drv, pci_dev, id);
212
                if (error >= 0) {
213
                        pci_dev->driver = drv;
214
                        error = 0;
215
                }
216
        }
217
        return error;
218
}
219
 
220
static int pci_device_probe(struct device * dev)
221
{
222
        int error = 0;
223
        struct pci_driver *drv;
224
        struct pci_dev *pci_dev;
225
 
226
        drv = to_pci_driver(dev->driver);
227
        pci_dev = to_pci_dev(dev);
228
        pci_dev_get(pci_dev);
229
        error = __pci_device_probe(drv, pci_dev);
230
        if (error)
231
                pci_dev_put(pci_dev);
232
 
233
        return error;
234
}
235
 
236
static int pci_device_remove(struct device * dev)
237
{
238
        struct pci_dev * pci_dev = to_pci_dev(dev);
239
        struct pci_driver * drv = pci_dev->driver;
240
 
241
        if (drv) {
242
                if (drv->remove)
243
                        drv->remove(pci_dev);
244
                pci_dev->driver = NULL;
245
        }
246
 
247
        /*
248
         * If the device is still on, set the power state as "unknown",
249
         * since it might change by the next time we load the driver.
250
         */
251
        if (pci_dev->current_state == PCI_D0)
252
                pci_dev->current_state = PCI_UNKNOWN;
253
 
254
        /*
255
         * We would love to complain here if pci_dev->is_enabled is set, that
256
         * the driver should have called pci_disable_device(), but the
257
         * unfortunate fact is there are too many odd BIOS and bridge setups
258
         * that don't like drivers doing that all of the time.
259
         * Oh well, we can dream of sane hardware when we sleep, no matter how
260
         * horrible the crap we have to deal with is when we are awake...
261
         */
262
 
263
        pci_dev_put(pci_dev);
264
        return 0;
265
}
266
 
267
static int pci_device_suspend(struct device * dev, pm_message_t state)
268
{
269
        struct pci_dev * pci_dev = to_pci_dev(dev);
270
        struct pci_driver * drv = pci_dev->driver;
271
        int i = 0;
272
 
273
        if (drv && drv->suspend) {
274
                i = drv->suspend(pci_dev, state);
275
                suspend_report_result(drv->suspend, i);
276
        } else {
277
                pci_save_state(pci_dev);
278
                /*
279
                 * mark its power state as "unknown", since we don't know if
280
                 * e.g. the BIOS will change its device state when we suspend.
281
                 */
282
                if (pci_dev->current_state == PCI_D0)
283
                        pci_dev->current_state = PCI_UNKNOWN;
284
        }
285
        return i;
286
}
287
 
288
static int pci_device_suspend_late(struct device * dev, pm_message_t state)
289
{
290
        struct pci_dev * pci_dev = to_pci_dev(dev);
291
        struct pci_driver * drv = pci_dev->driver;
292
        int i = 0;
293
 
294
        if (drv && drv->suspend_late) {
295
                i = drv->suspend_late(pci_dev, state);
296
                suspend_report_result(drv->suspend_late, i);
297
        }
298
        return i;
299
}
300
 
301
/*
302
 * Default resume method for devices that have no driver provided resume,
303
 * or not even a driver at all.
304
 */
305
static int pci_default_resume(struct pci_dev *pci_dev)
306
{
307
        int retval = 0;
308
 
309
        /* restore the PCI config space */
310
        pci_restore_state(pci_dev);
311
        /* if the device was enabled before suspend, reenable */
312
        retval = pci_reenable_device(pci_dev);
313
        /* if the device was busmaster before the suspend, make it busmaster again */
314
        if (pci_dev->is_busmaster)
315
                pci_set_master(pci_dev);
316
 
317
        return retval;
318
}
319
 
320
static int pci_device_resume(struct device * dev)
321
{
322
        int error;
323
        struct pci_dev * pci_dev = to_pci_dev(dev);
324
        struct pci_driver * drv = pci_dev->driver;
325
 
326
        if (drv && drv->resume)
327
                error = drv->resume(pci_dev);
328
        else
329
                error = pci_default_resume(pci_dev);
330
        return error;
331
}
332
 
333
static int pci_device_resume_early(struct device * dev)
334
{
335
        int error = 0;
336
        struct pci_dev * pci_dev = to_pci_dev(dev);
337
        struct pci_driver * drv = pci_dev->driver;
338
 
339
        pci_fixup_device(pci_fixup_resume, pci_dev);
340
 
341
        if (drv && drv->resume_early)
342
                error = drv->resume_early(pci_dev);
343
        return error;
344
}
345
 
346
static void pci_device_shutdown(struct device *dev)
347
{
348
        struct pci_dev *pci_dev = to_pci_dev(dev);
349
        struct pci_driver *drv = pci_dev->driver;
350
 
351
        if (drv && drv->shutdown)
352
                drv->shutdown(pci_dev);
353
}
354
 
355
#define kobj_to_pci_driver(obj) container_of(obj, struct device_driver, kobj)
356
#define attr_to_driver_attribute(obj) container_of(obj, struct driver_attribute, attr)
357
 
358
static ssize_t
359
pci_driver_attr_show(struct kobject * kobj, struct attribute *attr, char *buf)
360
{
361
        struct device_driver *driver = kobj_to_pci_driver(kobj);
362
        struct driver_attribute *dattr = attr_to_driver_attribute(attr);
363
        ssize_t ret;
364
 
365
        if (!get_driver(driver))
366
                return -ENODEV;
367
 
368
        ret = dattr->show ? dattr->show(driver, buf) : -EIO;
369
 
370
        put_driver(driver);
371
        return ret;
372
}
373
 
374
static ssize_t
375
pci_driver_attr_store(struct kobject * kobj, struct attribute *attr,
376
                      const char *buf, size_t count)
377
{
378
        struct device_driver *driver = kobj_to_pci_driver(kobj);
379
        struct driver_attribute *dattr = attr_to_driver_attribute(attr);
380
        ssize_t ret;
381
 
382
        if (!get_driver(driver))
383
                return -ENODEV;
384
 
385
        ret = dattr->store ? dattr->store(driver, buf, count) : -EIO;
386
 
387
        put_driver(driver);
388
        return ret;
389
}
390
 
391
static struct sysfs_ops pci_driver_sysfs_ops = {
392
        .show = pci_driver_attr_show,
393
        .store = pci_driver_attr_store,
394
};
395
static struct kobj_type pci_driver_kobj_type = {
396
        .sysfs_ops = &pci_driver_sysfs_ops,
397
};
398
 
399
/**
400
 * __pci_register_driver - register a new pci driver
401
 * @drv: the driver structure to register
402
 * @owner: owner module of drv
403
 * @mod_name: module name string
404
 *
405
 * Adds the driver structure to the list of registered drivers.
406
 * Returns a negative value on error, otherwise 0.
407
 * If no error occurred, the driver remains registered even if
408
 * no device was claimed during registration.
409
 */
410
int __pci_register_driver(struct pci_driver *drv, struct module *owner,
411
                          const char *mod_name)
412
{
413
        int error;
414
 
415
        /* initialize common driver fields */
416
        drv->driver.name = drv->name;
417
        drv->driver.bus = &pci_bus_type;
418
        drv->driver.owner = owner;
419
        drv->driver.mod_name = mod_name;
420
        drv->driver.kobj.ktype = &pci_driver_kobj_type;
421
 
422
        spin_lock_init(&drv->dynids.lock);
423
        INIT_LIST_HEAD(&drv->dynids.list);
424
 
425
        /* register with core */
426
        error = driver_register(&drv->driver);
427
        if (error)
428
                return error;
429
 
430
        error = pci_create_newid_file(drv);
431
        if (error)
432
                driver_unregister(&drv->driver);
433
 
434
        return error;
435
}
436
 
437
/**
438
 * pci_unregister_driver - unregister a pci driver
439
 * @drv: the driver structure to unregister
440
 *
441
 * Deletes the driver structure from the list of registered PCI drivers,
442
 * gives it a chance to clean up by calling its remove() function for
443
 * each device it was responsible for, and marks those devices as
444
 * driverless.
445
 */
446
 
447
void
448
pci_unregister_driver(struct pci_driver *drv)
449
{
450
        driver_unregister(&drv->driver);
451
        pci_free_dynids(drv);
452
}
453
 
454
static struct pci_driver pci_compat_driver = {
455
        .name = "compat"
456
};
457
 
458
/**
459
 * pci_dev_driver - get the pci_driver of a device
460
 * @dev: the device to query
461
 *
462
 * Returns the appropriate pci_driver structure or %NULL if there is no
463
 * registered driver for the device.
464
 */
465
struct pci_driver *
466
pci_dev_driver(const struct pci_dev *dev)
467
{
468
        if (dev->driver)
469
                return dev->driver;
470
        else {
471
                int i;
472
                for(i=0; i<=PCI_ROM_RESOURCE; i++)
473
                        if (dev->resource[i].flags & IORESOURCE_BUSY)
474
                                return &pci_compat_driver;
475
        }
476
        return NULL;
477
}
478
 
479
/**
480
 * pci_bus_match - Tell if a PCI device structure has a matching PCI device id structure
481
 * @dev: the PCI device structure to match against
482
 * @drv: the device driver to search for matching PCI device id structures
483
 *
484
 * Used by a driver to check whether a PCI device present in the
485
 * system is in its list of supported devices. Returns the matching
486
 * pci_device_id structure or %NULL if there is no match.
487
 */
488
static int pci_bus_match(struct device *dev, struct device_driver *drv)
489
{
490
        struct pci_dev *pci_dev = to_pci_dev(dev);
491
        struct pci_driver *pci_drv = to_pci_driver(drv);
492
        const struct pci_device_id *found_id;
493
 
494
        found_id = pci_match_device(pci_drv, pci_dev);
495
        if (found_id)
496
                return 1;
497
 
498
        return 0;
499
}
500
 
501
/**
502
 * pci_dev_get - increments the reference count of the pci device structure
503
 * @dev: the device being referenced
504
 *
505
 * Each live reference to a device should be refcounted.
506
 *
507
 * Drivers for PCI devices should normally record such references in
508
 * their probe() methods, when they bind to a device, and release
509
 * them by calling pci_dev_put(), in their disconnect() methods.
510
 *
511
 * A pointer to the device with the incremented reference counter is returned.
512
 */
513
struct pci_dev *pci_dev_get(struct pci_dev *dev)
514
{
515
        if (dev)
516
                get_device(&dev->dev);
517
        return dev;
518
}
519
 
520
/**
521
 * pci_dev_put - release a use of the pci device structure
522
 * @dev: device that's been disconnected
523
 *
524
 * Must be called when a user of a device is finished with it.  When the last
525
 * user of the device calls this function, the memory of the device is freed.
526
 */
527
void pci_dev_put(struct pci_dev *dev)
528
{
529
        if (dev)
530
                put_device(&dev->dev);
531
}
532
 
533
#ifndef CONFIG_HOTPLUG
534
int pci_uevent(struct device *dev, struct kobj_uevent_env *env)
535
{
536
        return -ENODEV;
537
}
538
#endif
539
 
540
struct bus_type pci_bus_type = {
541
        .name           = "pci",
542
        .match          = pci_bus_match,
543
        .uevent         = pci_uevent,
544
        .probe          = pci_device_probe,
545
        .remove         = pci_device_remove,
546
        .suspend        = pci_device_suspend,
547
        .suspend_late   = pci_device_suspend_late,
548
        .resume_early   = pci_device_resume_early,
549
        .resume         = pci_device_resume,
550
        .shutdown       = pci_device_shutdown,
551
        .dev_attrs      = pci_dev_attrs,
552
};
553
 
554
static int __init pci_driver_init(void)
555
{
556
        return bus_register(&pci_bus_type);
557
}
558
 
559
postcore_initcall(pci_driver_init);
560
 
561
EXPORT_SYMBOL(pci_match_id);
562
EXPORT_SYMBOL(__pci_register_driver);
563
EXPORT_SYMBOL(pci_unregister_driver);
564
EXPORT_SYMBOL(pci_dev_driver);
565
EXPORT_SYMBOL(pci_bus_type);
566
EXPORT_SYMBOL(pci_dev_get);
567
EXPORT_SYMBOL(pci_dev_put);

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.