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