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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [base/] [bus.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * bus.c - bus driver management
3
 *
4
 * Copyright (c) 2002-3 Patrick Mochel
5
 * Copyright (c) 2002-3 Open Source Development Labs
6
 *
7
 * This file is released under the GPLv2
8
 *
9
 */
10
 
11
#include <linux/device.h>
12
#include <linux/module.h>
13
#include <linux/errno.h>
14
#include <linux/init.h>
15
#include <linux/string.h>
16
#include "base.h"
17
#include "power/power.h"
18
 
19
#define to_bus_attr(_attr) container_of(_attr, struct bus_attribute, attr)
20
#define to_bus(obj) container_of(obj, struct bus_type, subsys.kobj)
21
 
22
/*
23
 * sysfs bindings for drivers
24
 */
25
 
26
#define to_drv_attr(_attr) container_of(_attr, struct driver_attribute, attr)
27
#define to_driver(obj) container_of(obj, struct device_driver, kobj)
28
 
29
 
30
static int __must_check bus_rescan_devices_helper(struct device *dev,
31
                                                void *data);
32
 
33
static struct bus_type *bus_get(struct bus_type *bus)
34
{
35
        return bus ? container_of(kset_get(&bus->subsys),
36
                                struct bus_type, subsys) : NULL;
37
}
38
 
39
static void bus_put(struct bus_type *bus)
40
{
41
        kset_put(&bus->subsys);
42
}
43
 
44
static ssize_t
45
drv_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)
46
{
47
        struct driver_attribute * drv_attr = to_drv_attr(attr);
48
        struct device_driver * drv = to_driver(kobj);
49
        ssize_t ret = -EIO;
50
 
51
        if (drv_attr->show)
52
                ret = drv_attr->show(drv, buf);
53
        return ret;
54
}
55
 
56
static ssize_t
57
drv_attr_store(struct kobject * kobj, struct attribute * attr,
58
               const char * buf, size_t count)
59
{
60
        struct driver_attribute * drv_attr = to_drv_attr(attr);
61
        struct device_driver * drv = to_driver(kobj);
62
        ssize_t ret = -EIO;
63
 
64
        if (drv_attr->store)
65
                ret = drv_attr->store(drv, buf, count);
66
        return ret;
67
}
68
 
69
static struct sysfs_ops driver_sysfs_ops = {
70
        .show   = drv_attr_show,
71
        .store  = drv_attr_store,
72
};
73
 
74
 
75
static void driver_release(struct kobject * kobj)
76
{
77
        /*
78
         * Yes this is an empty release function, it is this way because struct
79
         * device is always a static object, not a dynamic one.  Yes, this is
80
         * not nice and bad, but remember, drivers are code, reference counted
81
         * by the module count, not a device, which is really data.  And yes,
82
         * in the future I do want to have all drivers be created dynamically,
83
         * and am working toward that goal, but it will take a bit longer...
84
         *
85
         * But do not let this example give _anyone_ the idea that they can
86
         * create a release function without any code in it at all, to do that
87
         * is almost always wrong.  If you have any questions about this,
88
         * please send an email to <greg@kroah.com>
89
         */
90
}
91
 
92
static struct kobj_type driver_ktype = {
93
        .sysfs_ops      = &driver_sysfs_ops,
94
        .release        = driver_release,
95
};
96
 
97
 
98
/*
99
 * sysfs bindings for buses
100
 */
101
 
102
 
103
static ssize_t
104
bus_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)
105
{
106
        struct bus_attribute * bus_attr = to_bus_attr(attr);
107
        struct bus_type * bus = to_bus(kobj);
108
        ssize_t ret = 0;
109
 
110
        if (bus_attr->show)
111
                ret = bus_attr->show(bus, buf);
112
        return ret;
113
}
114
 
115
static ssize_t
116
bus_attr_store(struct kobject * kobj, struct attribute * attr,
117
               const char * buf, size_t count)
118
{
119
        struct bus_attribute * bus_attr = to_bus_attr(attr);
120
        struct bus_type * bus = to_bus(kobj);
121
        ssize_t ret = 0;
122
 
123
        if (bus_attr->store)
124
                ret = bus_attr->store(bus, buf, count);
125
        return ret;
126
}
127
 
128
static struct sysfs_ops bus_sysfs_ops = {
129
        .show   = bus_attr_show,
130
        .store  = bus_attr_store,
131
};
132
 
133
int bus_create_file(struct bus_type * bus, struct bus_attribute * attr)
134
{
135
        int error;
136
        if (bus_get(bus)) {
137
                error = sysfs_create_file(&bus->subsys.kobj, &attr->attr);
138
                bus_put(bus);
139
        } else
140
                error = -EINVAL;
141
        return error;
142
}
143
 
144
void bus_remove_file(struct bus_type * bus, struct bus_attribute * attr)
145
{
146
        if (bus_get(bus)) {
147
                sysfs_remove_file(&bus->subsys.kobj, &attr->attr);
148
                bus_put(bus);
149
        }
150
}
151
 
152
static struct kobj_type bus_ktype = {
153
        .sysfs_ops      = &bus_sysfs_ops,
154
};
155
 
156
static int bus_uevent_filter(struct kset *kset, struct kobject *kobj)
157
{
158
        struct kobj_type *ktype = get_ktype(kobj);
159
 
160
        if (ktype == &bus_ktype)
161
                return 1;
162
        return 0;
163
}
164
 
165
static struct kset_uevent_ops bus_uevent_ops = {
166
        .filter = bus_uevent_filter,
167
};
168
 
169
static decl_subsys(bus, &bus_ktype, &bus_uevent_ops);
170
 
171
 
172
#ifdef CONFIG_HOTPLUG
173
/* Manually detach a device from its associated driver. */
174
static int driver_helper(struct device *dev, void *data)
175
{
176
        const char *name = data;
177
 
178
        if (strcmp(name, dev->bus_id) == 0)
179
                return 1;
180
        return 0;
181
}
182
 
183
static ssize_t driver_unbind(struct device_driver *drv,
184
                             const char *buf, size_t count)
185
{
186
        struct bus_type *bus = bus_get(drv->bus);
187
        struct device *dev;
188
        int err = -ENODEV;
189
 
190
        dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
191
        if (dev && dev->driver == drv) {
192
                if (dev->parent)        /* Needed for USB */
193
                        down(&dev->parent->sem);
194
                device_release_driver(dev);
195
                if (dev->parent)
196
                        up(&dev->parent->sem);
197
                err = count;
198
        }
199
        put_device(dev);
200
        bus_put(bus);
201
        return err;
202
}
203
static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind);
204
 
205
/*
206
 * Manually attach a device to a driver.
207
 * Note: the driver must want to bind to the device,
208
 * it is not possible to override the driver's id table.
209
 */
210
static ssize_t driver_bind(struct device_driver *drv,
211
                           const char *buf, size_t count)
212
{
213
        struct bus_type *bus = bus_get(drv->bus);
214
        struct device *dev;
215
        int err = -ENODEV;
216
 
217
        dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
218
        if (dev && dev->driver == NULL) {
219
                if (dev->parent)        /* Needed for USB */
220
                        down(&dev->parent->sem);
221
                down(&dev->sem);
222
                err = driver_probe_device(drv, dev);
223
                up(&dev->sem);
224
                if (dev->parent)
225
                        up(&dev->parent->sem);
226
 
227
                if (err > 0)             /* success */
228
                        err = count;
229
                else if (err == 0)       /* driver didn't accept device */
230
                        err = -ENODEV;
231
        }
232
        put_device(dev);
233
        bus_put(bus);
234
        return err;
235
}
236
static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind);
237
 
238
static ssize_t show_drivers_autoprobe(struct bus_type *bus, char *buf)
239
{
240
        return sprintf(buf, "%d\n", bus->drivers_autoprobe);
241
}
242
 
243
static ssize_t store_drivers_autoprobe(struct bus_type *bus,
244
                                       const char *buf, size_t count)
245
{
246
        if (buf[0] == '0')
247
                bus->drivers_autoprobe = 0;
248
        else
249
                bus->drivers_autoprobe = 1;
250
        return count;
251
}
252
 
253
static ssize_t store_drivers_probe(struct bus_type *bus,
254
                                   const char *buf, size_t count)
255
{
256
        struct device *dev;
257
 
258
        dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
259
        if (!dev)
260
                return -ENODEV;
261
        if (bus_rescan_devices_helper(dev, NULL) != 0)
262
                return -EINVAL;
263
        return count;
264
}
265
#endif
266
 
267
static struct device * next_device(struct klist_iter * i)
268
{
269
        struct klist_node * n = klist_next(i);
270
        return n ? container_of(n, struct device, knode_bus) : NULL;
271
}
272
 
273
/**
274
 *      bus_for_each_dev - device iterator.
275
 *      @bus:   bus type.
276
 *      @start: device to start iterating from.
277
 *      @data:  data for the callback.
278
 *      @fn:    function to be called for each device.
279
 *
280
 *      Iterate over @bus's list of devices, and call @fn for each,
281
 *      passing it @data. If @start is not NULL, we use that device to
282
 *      begin iterating from.
283
 *
284
 *      We check the return of @fn each time. If it returns anything
285
 *      other than 0, we break out and return that value.
286
 *
287
 *      NOTE: The device that returns a non-zero value is not retained
288
 *      in any way, nor is its refcount incremented. If the caller needs
289
 *      to retain this data, it should do, and increment the reference
290
 *      count in the supplied callback.
291
 */
292
 
293
int bus_for_each_dev(struct bus_type * bus, struct device * start,
294
                     void * data, int (*fn)(struct device *, void *))
295
{
296
        struct klist_iter i;
297
        struct device * dev;
298
        int error = 0;
299
 
300
        if (!bus)
301
                return -EINVAL;
302
 
303
        klist_iter_init_node(&bus->klist_devices, &i,
304
                             (start ? &start->knode_bus : NULL));
305
        while ((dev = next_device(&i)) && !error)
306
                error = fn(dev, data);
307
        klist_iter_exit(&i);
308
        return error;
309
}
310
 
311
/**
312
 * bus_find_device - device iterator for locating a particular device.
313
 * @bus: bus type
314
 * @start: Device to begin with
315
 * @data: Data to pass to match function
316
 * @match: Callback function to check device
317
 *
318
 * This is similar to the bus_for_each_dev() function above, but it
319
 * returns a reference to a device that is 'found' for later use, as
320
 * determined by the @match callback.
321
 *
322
 * The callback should return 0 if the device doesn't match and non-zero
323
 * if it does.  If the callback returns non-zero, this function will
324
 * return to the caller and not iterate over any more devices.
325
 */
326
struct device * bus_find_device(struct bus_type *bus,
327
                                struct device *start, void *data,
328
                                int (*match)(struct device *, void *))
329
{
330
        struct klist_iter i;
331
        struct device *dev;
332
 
333
        if (!bus)
334
                return NULL;
335
 
336
        klist_iter_init_node(&bus->klist_devices, &i,
337
                             (start ? &start->knode_bus : NULL));
338
        while ((dev = next_device(&i)))
339
                if (match(dev, data) && get_device(dev))
340
                        break;
341
        klist_iter_exit(&i);
342
        return dev;
343
}
344
 
345
 
346
static struct device_driver * next_driver(struct klist_iter * i)
347
{
348
        struct klist_node * n = klist_next(i);
349
        return n ? container_of(n, struct device_driver, knode_bus) : NULL;
350
}
351
 
352
/**
353
 *      bus_for_each_drv - driver iterator
354
 *      @bus:   bus we're dealing with.
355
 *      @start: driver to start iterating on.
356
 *      @data:  data to pass to the callback.
357
 *      @fn:    function to call for each driver.
358
 *
359
 *      This is nearly identical to the device iterator above.
360
 *      We iterate over each driver that belongs to @bus, and call
361
 *      @fn for each. If @fn returns anything but 0, we break out
362
 *      and return it. If @start is not NULL, we use it as the head
363
 *      of the list.
364
 *
365
 *      NOTE: we don't return the driver that returns a non-zero
366
 *      value, nor do we leave the reference count incremented for that
367
 *      driver. If the caller needs to know that info, it must set it
368
 *      in the callback. It must also be sure to increment the refcount
369
 *      so it doesn't disappear before returning to the caller.
370
 */
371
 
372
int bus_for_each_drv(struct bus_type * bus, struct device_driver * start,
373
                     void * data, int (*fn)(struct device_driver *, void *))
374
{
375
        struct klist_iter i;
376
        struct device_driver * drv;
377
        int error = 0;
378
 
379
        if (!bus)
380
                return -EINVAL;
381
 
382
        klist_iter_init_node(&bus->klist_drivers, &i,
383
                             start ? &start->knode_bus : NULL);
384
        while ((drv = next_driver(&i)) && !error)
385
                error = fn(drv, data);
386
        klist_iter_exit(&i);
387
        return error;
388
}
389
 
390
static int device_add_attrs(struct bus_type *bus, struct device *dev)
391
{
392
        int error = 0;
393
        int i;
394
 
395
        if (!bus->dev_attrs)
396
                return 0;
397
 
398
        for (i = 0; attr_name(bus->dev_attrs[i]); i++) {
399
                error = device_create_file(dev,&bus->dev_attrs[i]);
400
                if (error) {
401
                        while (--i >= 0)
402
                                device_remove_file(dev, &bus->dev_attrs[i]);
403
                        break;
404
                }
405
        }
406
        return error;
407
}
408
 
409
static void device_remove_attrs(struct bus_type * bus, struct device * dev)
410
{
411
        int i;
412
 
413
        if (bus->dev_attrs) {
414
                for (i = 0; attr_name(bus->dev_attrs[i]); i++)
415
                        device_remove_file(dev,&bus->dev_attrs[i]);
416
        }
417
}
418
 
419
#ifdef CONFIG_SYSFS_DEPRECATED
420
static int make_deprecated_bus_links(struct device *dev)
421
{
422
        return sysfs_create_link(&dev->kobj,
423
                                 &dev->bus->subsys.kobj, "bus");
424
}
425
 
426
static void remove_deprecated_bus_links(struct device *dev)
427
{
428
        sysfs_remove_link(&dev->kobj, "bus");
429
}
430
#else
431
static inline int make_deprecated_bus_links(struct device *dev) { return 0; }
432
static inline void remove_deprecated_bus_links(struct device *dev) { }
433
#endif
434
 
435
/**
436
 *      bus_add_device - add device to bus
437
 *      @dev:   device being added
438
 *
439
 *      - Add the device to its bus's list of devices.
440
 *      - Create link to device's bus.
441
 */
442
int bus_add_device(struct device * dev)
443
{
444
        struct bus_type * bus = bus_get(dev->bus);
445
        int error = 0;
446
 
447
        if (bus) {
448
                pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
449
                error = device_add_attrs(bus, dev);
450
                if (error)
451
                        goto out_put;
452
                error = sysfs_create_link(&bus->devices.kobj,
453
                                                &dev->kobj, dev->bus_id);
454
                if (error)
455
                        goto out_id;
456
                error = sysfs_create_link(&dev->kobj,
457
                                &dev->bus->subsys.kobj, "subsystem");
458
                if (error)
459
                        goto out_subsys;
460
                error = make_deprecated_bus_links(dev);
461
                if (error)
462
                        goto out_deprecated;
463
        }
464
        return 0;
465
 
466
out_deprecated:
467
        sysfs_remove_link(&dev->kobj, "subsystem");
468
out_subsys:
469
        sysfs_remove_link(&bus->devices.kobj, dev->bus_id);
470
out_id:
471
        device_remove_attrs(bus, dev);
472
out_put:
473
        bus_put(dev->bus);
474
        return error;
475
}
476
 
477
/**
478
 *      bus_attach_device - add device to bus
479
 *      @dev:   device tried to attach to a driver
480
 *
481
 *      - Add device to bus's list of devices.
482
 *      - Try to attach to driver.
483
 */
484
void bus_attach_device(struct device * dev)
485
{
486
        struct bus_type *bus = dev->bus;
487
        int ret = 0;
488
 
489
        if (bus) {
490
                dev->is_registered = 1;
491
                if (bus->drivers_autoprobe)
492
                        ret = device_attach(dev);
493
                WARN_ON(ret < 0);
494
                if (ret >= 0)
495
                        klist_add_tail(&dev->knode_bus, &bus->klist_devices);
496
                else
497
                        dev->is_registered = 0;
498
        }
499
}
500
 
501
/**
502
 *      bus_remove_device - remove device from bus
503
 *      @dev:   device to be removed
504
 *
505
 *      - Remove symlink from bus's directory.
506
 *      - Delete device from bus's list.
507
 *      - Detach from its driver.
508
 *      - Drop reference taken in bus_add_device().
509
 */
510
void bus_remove_device(struct device * dev)
511
{
512
        if (dev->bus) {
513
                sysfs_remove_link(&dev->kobj, "subsystem");
514
                remove_deprecated_bus_links(dev);
515
                sysfs_remove_link(&dev->bus->devices.kobj, dev->bus_id);
516
                device_remove_attrs(dev->bus, dev);
517
                if (dev->is_registered) {
518
                        dev->is_registered = 0;
519
                        klist_del(&dev->knode_bus);
520
                }
521
                pr_debug("bus %s: remove device %s\n", dev->bus->name, dev->bus_id);
522
                device_release_driver(dev);
523
                bus_put(dev->bus);
524
        }
525
}
526
 
527
static int driver_add_attrs(struct bus_type * bus, struct device_driver * drv)
528
{
529
        int error = 0;
530
        int i;
531
 
532
        if (bus->drv_attrs) {
533
                for (i = 0; attr_name(bus->drv_attrs[i]); i++) {
534
                        error = driver_create_file(drv, &bus->drv_attrs[i]);
535
                        if (error)
536
                                goto Err;
537
                }
538
        }
539
 Done:
540
        return error;
541
 Err:
542
        while (--i >= 0)
543
                driver_remove_file(drv, &bus->drv_attrs[i]);
544
        goto Done;
545
}
546
 
547
 
548
static void driver_remove_attrs(struct bus_type * bus, struct device_driver * drv)
549
{
550
        int i;
551
 
552
        if (bus->drv_attrs) {
553
                for (i = 0; attr_name(bus->drv_attrs[i]); i++)
554
                        driver_remove_file(drv, &bus->drv_attrs[i]);
555
        }
556
}
557
 
558
#ifdef CONFIG_HOTPLUG
559
/*
560
 * Thanks to drivers making their tables __devinit, we can't allow manual
561
 * bind and unbind from userspace unless CONFIG_HOTPLUG is enabled.
562
 */
563
static int __must_check add_bind_files(struct device_driver *drv)
564
{
565
        int ret;
566
 
567
        ret = driver_create_file(drv, &driver_attr_unbind);
568
        if (ret == 0) {
569
                ret = driver_create_file(drv, &driver_attr_bind);
570
                if (ret)
571
                        driver_remove_file(drv, &driver_attr_unbind);
572
        }
573
        return ret;
574
}
575
 
576
static void remove_bind_files(struct device_driver *drv)
577
{
578
        driver_remove_file(drv, &driver_attr_bind);
579
        driver_remove_file(drv, &driver_attr_unbind);
580
}
581
 
582
static BUS_ATTR(drivers_probe, S_IWUSR, NULL, store_drivers_probe);
583
static BUS_ATTR(drivers_autoprobe, S_IWUSR | S_IRUGO,
584
                show_drivers_autoprobe, store_drivers_autoprobe);
585
 
586
static int add_probe_files(struct bus_type *bus)
587
{
588
        int retval;
589
 
590
        retval = bus_create_file(bus, &bus_attr_drivers_probe);
591
        if (retval)
592
                goto out;
593
 
594
        retval = bus_create_file(bus, &bus_attr_drivers_autoprobe);
595
        if (retval)
596
                bus_remove_file(bus, &bus_attr_drivers_probe);
597
out:
598
        return retval;
599
}
600
 
601
static void remove_probe_files(struct bus_type *bus)
602
{
603
        bus_remove_file(bus, &bus_attr_drivers_autoprobe);
604
        bus_remove_file(bus, &bus_attr_drivers_probe);
605
}
606
#else
607
static inline int add_bind_files(struct device_driver *drv) { return 0; }
608
static inline void remove_bind_files(struct device_driver *drv) {}
609
static inline int add_probe_files(struct bus_type *bus) { return 0; }
610
static inline void remove_probe_files(struct bus_type *bus) {}
611
#endif
612
 
613
static ssize_t driver_uevent_store(struct device_driver *drv,
614
                                   const char *buf, size_t count)
615
{
616
        enum kobject_action action;
617
 
618
        if (kobject_action_type(buf, count, &action) == 0)
619
                kobject_uevent(&drv->kobj, action);
620
        return count;
621
}
622
static DRIVER_ATTR(uevent, S_IWUSR, NULL, driver_uevent_store);
623
 
624
/**
625
 *      bus_add_driver - Add a driver to the bus.
626
 *      @drv:   driver.
627
 *
628
 */
629
int bus_add_driver(struct device_driver *drv)
630
{
631
        struct bus_type * bus = bus_get(drv->bus);
632
        int error = 0;
633
 
634
        if (!bus)
635
                return -EINVAL;
636
 
637
        pr_debug("bus %s: add driver %s\n", bus->name, drv->name);
638
        error = kobject_set_name(&drv->kobj, "%s", drv->name);
639
        if (error)
640
                goto out_put_bus;
641
        drv->kobj.kset = &bus->drivers;
642
        error = kobject_register(&drv->kobj);
643
        if (error)
644
                goto out_put_bus;
645
 
646
        if (drv->bus->drivers_autoprobe) {
647
                error = driver_attach(drv);
648
                if (error)
649
                        goto out_unregister;
650
        }
651
        klist_add_tail(&drv->knode_bus, &bus->klist_drivers);
652
        module_add_driver(drv->owner, drv);
653
 
654
        error = driver_create_file(drv, &driver_attr_uevent);
655
        if (error) {
656
                printk(KERN_ERR "%s: uevent attr (%s) failed\n",
657
                        __FUNCTION__, drv->name);
658
        }
659
        error = driver_add_attrs(bus, drv);
660
        if (error) {
661
                /* How the hell do we get out of this pickle? Give up */
662
                printk(KERN_ERR "%s: driver_add_attrs(%s) failed\n",
663
                        __FUNCTION__, drv->name);
664
        }
665
        error = add_bind_files(drv);
666
        if (error) {
667
                /* Ditto */
668
                printk(KERN_ERR "%s: add_bind_files(%s) failed\n",
669
                        __FUNCTION__, drv->name);
670
        }
671
 
672
        return error;
673
out_unregister:
674
        kobject_unregister(&drv->kobj);
675
out_put_bus:
676
        bus_put(bus);
677
        return error;
678
}
679
 
680
/**
681
 *      bus_remove_driver - delete driver from bus's knowledge.
682
 *      @drv:   driver.
683
 *
684
 *      Detach the driver from the devices it controls, and remove
685
 *      it from its bus's list of drivers. Finally, we drop the reference
686
 *      to the bus we took in bus_add_driver().
687
 */
688
 
689
void bus_remove_driver(struct device_driver * drv)
690
{
691
        if (!drv->bus)
692
                return;
693
 
694
        remove_bind_files(drv);
695
        driver_remove_attrs(drv->bus, drv);
696
        driver_remove_file(drv, &driver_attr_uevent);
697
        klist_remove(&drv->knode_bus);
698
        pr_debug("bus %s: remove driver %s\n", drv->bus->name, drv->name);
699
        driver_detach(drv);
700
        module_remove_driver(drv);
701
        kobject_unregister(&drv->kobj);
702
        bus_put(drv->bus);
703
}
704
 
705
 
706
/* Helper for bus_rescan_devices's iter */
707
static int __must_check bus_rescan_devices_helper(struct device *dev,
708
                                                void *data)
709
{
710
        int ret = 0;
711
 
712
        if (!dev->driver) {
713
                if (dev->parent)        /* Needed for USB */
714
                        down(&dev->parent->sem);
715
                ret = device_attach(dev);
716
                if (dev->parent)
717
                        up(&dev->parent->sem);
718
        }
719
        return ret < 0 ? ret : 0;
720
}
721
 
722
/**
723
 * bus_rescan_devices - rescan devices on the bus for possible drivers
724
 * @bus: the bus to scan.
725
 *
726
 * This function will look for devices on the bus with no driver
727
 * attached and rescan it against existing drivers to see if it matches
728
 * any by calling device_attach() for the unbound devices.
729
 */
730
int bus_rescan_devices(struct bus_type * bus)
731
{
732
        return bus_for_each_dev(bus, NULL, NULL, bus_rescan_devices_helper);
733
}
734
 
735
/**
736
 * device_reprobe - remove driver for a device and probe for a new driver
737
 * @dev: the device to reprobe
738
 *
739
 * This function detaches the attached driver (if any) for the given
740
 * device and restarts the driver probing process.  It is intended
741
 * to use if probing criteria changed during a devices lifetime and
742
 * driver attachment should change accordingly.
743
 */
744
int device_reprobe(struct device *dev)
745
{
746
        if (dev->driver) {
747
                if (dev->parent)        /* Needed for USB */
748
                        down(&dev->parent->sem);
749
                device_release_driver(dev);
750
                if (dev->parent)
751
                        up(&dev->parent->sem);
752
        }
753
        return bus_rescan_devices_helper(dev, NULL);
754
}
755
EXPORT_SYMBOL_GPL(device_reprobe);
756
 
757
/**
758
 *      find_bus - locate bus by name.
759
 *      @name:  name of bus.
760
 *
761
 *      Call kset_find_obj() to iterate over list of buses to
762
 *      find a bus by name. Return bus if found.
763
 *
764
 *      Note that kset_find_obj increments bus' reference count.
765
 */
766
#if 0
767
struct bus_type * find_bus(char * name)
768
{
769
        struct kobject * k = kset_find_obj(&bus_subsys.kset, name);
770
        return k ? to_bus(k) : NULL;
771
}
772
#endif  /*  0  */
773
 
774
 
775
/**
776
 *      bus_add_attrs - Add default attributes for this bus.
777
 *      @bus:   Bus that has just been registered.
778
 */
779
 
780
static int bus_add_attrs(struct bus_type * bus)
781
{
782
        int error = 0;
783
        int i;
784
 
785
        if (bus->bus_attrs) {
786
                for (i = 0; attr_name(bus->bus_attrs[i]); i++) {
787
                        error = bus_create_file(bus,&bus->bus_attrs[i]);
788
                        if (error)
789
                                goto Err;
790
                }
791
        }
792
 Done:
793
        return error;
794
 Err:
795
        while (--i >= 0)
796
                bus_remove_file(bus,&bus->bus_attrs[i]);
797
        goto Done;
798
}
799
 
800
static void bus_remove_attrs(struct bus_type * bus)
801
{
802
        int i;
803
 
804
        if (bus->bus_attrs) {
805
                for (i = 0; attr_name(bus->bus_attrs[i]); i++)
806
                        bus_remove_file(bus,&bus->bus_attrs[i]);
807
        }
808
}
809
 
810
static void klist_devices_get(struct klist_node *n)
811
{
812
        struct device *dev = container_of(n, struct device, knode_bus);
813
 
814
        get_device(dev);
815
}
816
 
817
static void klist_devices_put(struct klist_node *n)
818
{
819
        struct device *dev = container_of(n, struct device, knode_bus);
820
 
821
        put_device(dev);
822
}
823
 
824
static ssize_t bus_uevent_store(struct bus_type *bus,
825
                                const char *buf, size_t count)
826
{
827
        enum kobject_action action;
828
 
829
        if (kobject_action_type(buf, count, &action) == 0)
830
                kobject_uevent(&bus->subsys.kobj, action);
831
        return count;
832
}
833
static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store);
834
 
835
/**
836
 *      bus_register - register a bus with the system.
837
 *      @bus:   bus.
838
 *
839
 *      Once we have that, we registered the bus with the kobject
840
 *      infrastructure, then register the children subsystems it has:
841
 *      the devices and drivers that belong to the bus.
842
 */
843
int bus_register(struct bus_type * bus)
844
{
845
        int retval;
846
 
847
        BLOCKING_INIT_NOTIFIER_HEAD(&bus->bus_notifier);
848
 
849
        retval = kobject_set_name(&bus->subsys.kobj, "%s", bus->name);
850
        if (retval)
851
                goto out;
852
 
853
        bus->subsys.kobj.kset = &bus_subsys;
854
 
855
        retval = subsystem_register(&bus->subsys);
856
        if (retval)
857
                goto out;
858
 
859
        retval = bus_create_file(bus, &bus_attr_uevent);
860
        if (retval)
861
                goto bus_uevent_fail;
862
 
863
        kobject_set_name(&bus->devices.kobj, "devices");
864
        bus->devices.kobj.parent = &bus->subsys.kobj;
865
        retval = kset_register(&bus->devices);
866
        if (retval)
867
                goto bus_devices_fail;
868
 
869
        kobject_set_name(&bus->drivers.kobj, "drivers");
870
        bus->drivers.kobj.parent = &bus->subsys.kobj;
871
        bus->drivers.ktype = &driver_ktype;
872
        retval = kset_register(&bus->drivers);
873
        if (retval)
874
                goto bus_drivers_fail;
875
 
876
        klist_init(&bus->klist_devices, klist_devices_get, klist_devices_put);
877
        klist_init(&bus->klist_drivers, NULL, NULL);
878
 
879
        bus->drivers_autoprobe = 1;
880
        retval = add_probe_files(bus);
881
        if (retval)
882
                goto bus_probe_files_fail;
883
 
884
        retval = bus_add_attrs(bus);
885
        if (retval)
886
                goto bus_attrs_fail;
887
 
888
        pr_debug("bus type '%s' registered\n", bus->name);
889
        return 0;
890
 
891
bus_attrs_fail:
892
        remove_probe_files(bus);
893
bus_probe_files_fail:
894
        kset_unregister(&bus->drivers);
895
bus_drivers_fail:
896
        kset_unregister(&bus->devices);
897
bus_devices_fail:
898
        bus_remove_file(bus, &bus_attr_uevent);
899
bus_uevent_fail:
900
        subsystem_unregister(&bus->subsys);
901
out:
902
        return retval;
903
}
904
 
905
/**
906
 *      bus_unregister - remove a bus from the system
907
 *      @bus:   bus.
908
 *
909
 *      Unregister the child subsystems and the bus itself.
910
 *      Finally, we call bus_put() to release the refcount
911
 */
912
void bus_unregister(struct bus_type * bus)
913
{
914
        pr_debug("bus %s: unregistering\n", bus->name);
915
        bus_remove_attrs(bus);
916
        remove_probe_files(bus);
917
        kset_unregister(&bus->drivers);
918
        kset_unregister(&bus->devices);
919
        bus_remove_file(bus, &bus_attr_uevent);
920
        subsystem_unregister(&bus->subsys);
921
}
922
 
923
int bus_register_notifier(struct bus_type *bus, struct notifier_block *nb)
924
{
925
        return blocking_notifier_chain_register(&bus->bus_notifier, nb);
926
}
927
EXPORT_SYMBOL_GPL(bus_register_notifier);
928
 
929
int bus_unregister_notifier(struct bus_type *bus, struct notifier_block *nb)
930
{
931
        return blocking_notifier_chain_unregister(&bus->bus_notifier, nb);
932
}
933
EXPORT_SYMBOL_GPL(bus_unregister_notifier);
934
 
935
int __init buses_init(void)
936
{
937
        return subsystem_register(&bus_subsys);
938
}
939
 
940
 
941
EXPORT_SYMBOL_GPL(bus_for_each_dev);
942
EXPORT_SYMBOL_GPL(bus_find_device);
943
EXPORT_SYMBOL_GPL(bus_for_each_drv);
944
 
945
EXPORT_SYMBOL_GPL(bus_register);
946
EXPORT_SYMBOL_GPL(bus_unregister);
947
EXPORT_SYMBOL_GPL(bus_rescan_devices);
948
 
949
EXPORT_SYMBOL_GPL(bus_create_file);
950
EXPORT_SYMBOL_GPL(bus_remove_file);

powered by: WebSVN 2.1.0

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