bus.c 25.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5
/*
 * bus.c - bus driver management
 *
 * Copyright (c) 2002-3 Patrick Mochel
 * Copyright (c) 2002-3 Open Source Development Labs
6 7
 * Copyright (c) 2007 Greg Kroah-Hartman <gregkh@suse.de>
 * Copyright (c) 2007 Novell Inc.
L
Linus Torvalds 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * This file is released under the GPLv2
 *
 */

#include <linux/device.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/string.h>
#include "base.h"
#include "power/power.h"

#define to_bus_attr(_attr) container_of(_attr, struct bus_attribute, attr)
22
#define to_bus(obj) container_of(obj, struct bus_type_private, subsys.kobj)
L
Linus Torvalds 已提交
23 24 25 26 27 28 29 30

/*
 * sysfs bindings for drivers
 */

#define to_drv_attr(_attr) container_of(_attr, struct driver_attribute, attr)


31 32 33
static int __must_check bus_rescan_devices_helper(struct device *dev,
						void *data);

G
Greg Kroah-Hartman 已提交
34 35
static struct bus_type *bus_get(struct bus_type *bus)
{
36 37 38 39 40
	if (bus) {
		kset_get(&bus->p->subsys);
		return bus;
	}
	return NULL;
G
Greg Kroah-Hartman 已提交
41 42
}

G
Greg Kroah-Hartman 已提交
43 44
static void bus_put(struct bus_type *bus)
{
45 46
	if (bus)
		kset_put(&bus->p->subsys);
G
Greg Kroah-Hartman 已提交
47 48
}

49 50
static ssize_t drv_attr_show(struct kobject *kobj, struct attribute *attr,
			     char *buf)
L
Linus Torvalds 已提交
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;
L
Linus Torvalds 已提交
55 56

	if (drv_attr->show)
57
		ret = drv_attr->show(drv_priv->driver, buf);
L
Linus Torvalds 已提交
58 59 60
	return ret;
}

61 62
static ssize_t drv_attr_store(struct kobject *kobj, struct attribute *attr,
			      const char *buf, size_t count)
L
Linus Torvalds 已提交
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;
L
Linus Torvalds 已提交
67 68

	if (drv_attr->store)
69
		ret = drv_attr->store(drv_priv->driver, buf, count);
L
Linus Torvalds 已提交
70 71 72 73 74 75 76 77
	return ret;
}

static struct sysfs_ops driver_sysfs_ops = {
	.show	= drv_attr_show,
	.store	= drv_attr_store,
};

78
static void driver_release(struct kobject *kobj)
L
Linus Torvalds 已提交
79
{
80 81
	struct driver_private *drv_priv = to_driver(kobj);

82
	pr_debug("driver: '%s': %s\n", kobject_name(kobj), __func__);
83
	kfree(drv_priv);
L
Linus Torvalds 已提交
84 85
}

86
static struct kobj_type driver_ktype = {
L
Linus Torvalds 已提交
87 88 89 90 91 92 93
	.sysfs_ops	= &driver_sysfs_ops,
	.release	= driver_release,
};

/*
 * sysfs bindings for buses
 */
94 95
static ssize_t bus_attr_show(struct kobject *kobj, struct attribute *attr,
			     char *buf)
L
Linus Torvalds 已提交
96
{
97
	struct bus_attribute *bus_attr = to_bus_attr(attr);
98
	struct bus_type_private *bus_priv = to_bus(kobj);
L
Linus Torvalds 已提交
99 100 101
	ssize_t ret = 0;

	if (bus_attr->show)
102
		ret = bus_attr->show(bus_priv->bus, buf);
L
Linus Torvalds 已提交
103 104 105
	return ret;
}

106 107
static ssize_t bus_attr_store(struct kobject *kobj, struct attribute *attr,
			      const char *buf, size_t count)
L
Linus Torvalds 已提交
108
{
109
	struct bus_attribute *bus_attr = to_bus_attr(attr);
110
	struct bus_type_private *bus_priv = to_bus(kobj);
L
Linus Torvalds 已提交
111 112 113
	ssize_t ret = 0;

	if (bus_attr->store)
114
		ret = bus_attr->store(bus_priv->bus, buf, count);
L
Linus Torvalds 已提交
115 116 117 118 119 120 121 122
	return ret;
}

static struct sysfs_ops bus_sysfs_ops = {
	.show	= bus_attr_show,
	.store	= bus_attr_store,
};

123
int bus_create_file(struct bus_type *bus, struct bus_attribute *attr)
L
Linus Torvalds 已提交
124 125
{
	int error;
G
Greg Kroah-Hartman 已提交
126
	if (bus_get(bus)) {
127
		error = sysfs_create_file(&bus->p->subsys.kobj, &attr->attr);
G
Greg Kroah-Hartman 已提交
128
		bus_put(bus);
L
Linus Torvalds 已提交
129 130 131 132
	} else
		error = -EINVAL;
	return error;
}
133
EXPORT_SYMBOL_GPL(bus_create_file);
L
Linus Torvalds 已提交
134

135
void bus_remove_file(struct bus_type *bus, struct bus_attribute *attr)
L
Linus Torvalds 已提交
136
{
G
Greg Kroah-Hartman 已提交
137
	if (bus_get(bus)) {
138
		sysfs_remove_file(&bus->p->subsys.kobj, &attr->attr);
G
Greg Kroah-Hartman 已提交
139
		bus_put(bus);
L
Linus Torvalds 已提交
140 141
	}
}
142
EXPORT_SYMBOL_GPL(bus_remove_file);
L
Linus Torvalds 已提交
143

144
static struct kobj_type bus_ktype = {
L
Linus Torvalds 已提交
145
	.sysfs_ops	= &bus_sysfs_ops,
146 147 148 149 150 151 152 153 154 155
};

static int bus_uevent_filter(struct kset *kset, struct kobject *kobj)
{
	struct kobj_type *ktype = get_ktype(kobj);

	if (ktype == &bus_ktype)
		return 1;
	return 0;
}
L
Linus Torvalds 已提交
156

157 158
static struct kset_uevent_ops bus_uevent_ops = {
	.filter = bus_uevent_filter,
L
Linus Torvalds 已提交
159 160
};

161
static struct kset *bus_kset;
L
Linus Torvalds 已提交
162 163


164
#ifdef CONFIG_HOTPLUG
A
Alan Stern 已提交
165
/* Manually detach a device from its associated driver. */
166 167 168
static ssize_t driver_unbind(struct device_driver *drv,
			     const char *buf, size_t count)
{
G
Greg Kroah-Hartman 已提交
169
	struct bus_type *bus = bus_get(drv->bus);
170 171 172
	struct device *dev;
	int err = -ENODEV;

173
	dev = bus_find_device_by_name(bus, NULL, buf);
A
Alan Stern 已提交
174
	if (dev && dev->driver == drv) {
175 176
		if (dev->parent)	/* Needed for USB */
			down(&dev->parent->sem);
177
		device_release_driver(dev);
178 179
		if (dev->parent)
			up(&dev->parent->sem);
180 181
		err = count;
	}
A
Alan Stern 已提交
182
	put_device(dev);
G
Greg Kroah-Hartman 已提交
183
	bus_put(bus);
A
Alan Stern 已提交
184
	return err;
185 186 187
}
static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind);

188 189 190 191 192 193 194 195
/*
 * Manually attach a device to a driver.
 * Note: the driver must want to bind to the device,
 * it is not possible to override the driver's id table.
 */
static ssize_t driver_bind(struct device_driver *drv,
			   const char *buf, size_t count)
{
G
Greg Kroah-Hartman 已提交
196
	struct bus_type *bus = bus_get(drv->bus);
197 198 199
	struct device *dev;
	int err = -ENODEV;

200
	dev = bus_find_device_by_name(bus, NULL, buf);
A
Alan Stern 已提交
201
	if (dev && dev->driver == NULL) {
202 203
		if (dev->parent)	/* Needed for USB */
			down(&dev->parent->sem);
204 205 206
		down(&dev->sem);
		err = driver_probe_device(drv, dev);
		up(&dev->sem);
207 208
		if (dev->parent)
			up(&dev->parent->sem);
209

210 211
		if (err > 0) {
			/* success */
212
			err = count;
213 214
		} else if (err == 0) {
			/* driver didn't accept device */
215
			err = -ENODEV;
216
		}
217
	}
A
Alan Stern 已提交
218
	put_device(dev);
G
Greg Kroah-Hartman 已提交
219
	bus_put(bus);
A
Alan Stern 已提交
220
	return err;
221 222 223
}
static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind);

224 225
static ssize_t show_drivers_autoprobe(struct bus_type *bus, char *buf)
{
226
	return sprintf(buf, "%d\n", bus->p->drivers_autoprobe);
227 228 229 230 231 232
}

static ssize_t store_drivers_autoprobe(struct bus_type *bus,
				       const char *buf, size_t count)
{
	if (buf[0] == '0')
233
		bus->p->drivers_autoprobe = 0;
234
	else
235
		bus->p->drivers_autoprobe = 1;
236 237 238 239 240 241 242 243
	return count;
}

static ssize_t store_drivers_probe(struct bus_type *bus,
				   const char *buf, size_t count)
{
	struct device *dev;

244
	dev = bus_find_device_by_name(bus, NULL, buf);
245 246 247 248 249 250
	if (!dev)
		return -ENODEV;
	if (bus_rescan_devices_helper(dev, NULL) != 0)
		return -EINVAL;
	return count;
}
251
#endif
252

253
static struct device *next_device(struct klist_iter *i)
254
{
255
	struct klist_node *n = klist_next(i);
256 257 258
	return n ? container_of(n, struct device, knode_bus) : NULL;
}

L
Linus Torvalds 已提交
259
/**
260 261 262 263 264
 * bus_for_each_dev - device iterator.
 * @bus: bus type.
 * @start: device to start iterating from.
 * @data: data for the callback.
 * @fn: function to be called for each device.
L
Linus Torvalds 已提交
265
 *
266 267 268
 * Iterate over @bus's list of devices, and call @fn for each,
 * passing it @data. If @start is not NULL, we use that device to
 * begin iterating from.
L
Linus Torvalds 已提交
269
 *
270 271
 * We check the return of @fn each time. If it returns anything
 * other than 0, we break out and return that value.
L
Linus Torvalds 已提交
272
 *
273 274 275 276
 * NOTE: The device that returns a non-zero value is not retained
 * in any way, nor is its refcount incremented. If the caller needs
 * to retain this data, it should do, and increment the reference
 * count in the supplied callback.
L
Linus Torvalds 已提交
277
 */
278 279
int bus_for_each_dev(struct bus_type *bus, struct device *start,
		     void *data, int (*fn)(struct device *, void *))
L
Linus Torvalds 已提交
280
{
281
	struct klist_iter i;
282
	struct device *dev;
283
	int error = 0;
L
Linus Torvalds 已提交
284

285 286 287
	if (!bus)
		return -EINVAL;

288
	klist_iter_init_node(&bus->p->klist_devices, &i,
289 290 291 292 293
			     (start ? &start->knode_bus : NULL));
	while ((dev = next_device(&i)) && !error)
		error = fn(dev, data);
	klist_iter_exit(&i);
	return error;
L
Linus Torvalds 已提交
294
}
295
EXPORT_SYMBOL_GPL(bus_for_each_dev);
L
Linus Torvalds 已提交
296

297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
/**
 * bus_find_device - device iterator for locating a particular device.
 * @bus: bus type
 * @start: Device to begin with
 * @data: Data to pass to match function
 * @match: Callback function to check device
 *
 * This is similar to the bus_for_each_dev() function above, but it
 * returns a reference to a device that is 'found' for later use, as
 * determined by the @match callback.
 *
 * The callback should return 0 if the device doesn't match and non-zero
 * if it does.  If the callback returns non-zero, this function will
 * return to the caller and not iterate over any more devices.
 */
312 313 314
struct device *bus_find_device(struct bus_type *bus,
			       struct device *start, void *data,
			       int (*match)(struct device *dev, void *data))
315 316 317 318 319 320 321
{
	struct klist_iter i;
	struct device *dev;

	if (!bus)
		return NULL;

322
	klist_iter_init_node(&bus->p->klist_devices, &i,
323 324 325 326 327 328 329
			     (start ? &start->knode_bus : NULL));
	while ((dev = next_device(&i)))
		if (match(dev, data) && get_device(dev))
			break;
	klist_iter_exit(&i);
	return dev;
}
330
EXPORT_SYMBOL_GPL(bus_find_device);
331

332 333 334 335
static int match_name(struct device *dev, void *data)
{
	const char *name = data;

336
	return sysfs_streq(name, dev_name(dev));
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
}

/**
 * bus_find_device_by_name - device iterator for locating a particular device of a specific name
 * @bus: bus type
 * @start: Device to begin with
 * @name: name of the device to match
 *
 * This is similar to the bus_find_device() function above, but it handles
 * searching by a name automatically, no need to write another strcmp matching
 * function.
 */
struct device *bus_find_device_by_name(struct bus_type *bus,
				       struct device *start, const char *name)
{
	return bus_find_device(bus, start, (void *)name, match_name);
}
EXPORT_SYMBOL_GPL(bus_find_device_by_name);

356
static struct device_driver *next_driver(struct klist_iter *i)
357
{
358
	struct klist_node *n = klist_next(i);
359 360 361 362 363 364 365
	struct driver_private *drv_priv;

	if (n) {
		drv_priv = container_of(n, struct driver_private, knode_bus);
		return drv_priv->driver;
	}
	return NULL;
366 367
}

L
Linus Torvalds 已提交
368
/**
369 370 371 372 373
 * bus_for_each_drv - driver iterator
 * @bus: bus we're dealing with.
 * @start: driver to start iterating on.
 * @data: data to pass to the callback.
 * @fn: function to call for each driver.
L
Linus Torvalds 已提交
374
 *
375 376 377 378 379
 * This is nearly identical to the device iterator above.
 * We iterate over each driver that belongs to @bus, and call
 * @fn for each. If @fn returns anything but 0, we break out
 * and return it. If @start is not NULL, we use it as the head
 * of the list.
L
Linus Torvalds 已提交
380
 *
381 382 383 384 385
 * NOTE: we don't return the driver that returns a non-zero
 * value, nor do we leave the reference count incremented for that
 * driver. If the caller needs to know that info, it must set it
 * in the callback. It must also be sure to increment the refcount
 * so it doesn't disappear before returning to the caller.
L
Linus Torvalds 已提交
386
 */
387 388
int bus_for_each_drv(struct bus_type *bus, struct device_driver *start,
		     void *data, int (*fn)(struct device_driver *, void *))
L
Linus Torvalds 已提交
389
{
390
	struct klist_iter i;
391
	struct device_driver *drv;
392
	int error = 0;
L
Linus Torvalds 已提交
393

394 395 396
	if (!bus)
		return -EINVAL;

397
	klist_iter_init_node(&bus->p->klist_drivers, &i,
398
			     start ? &start->p->knode_bus : NULL);
399 400 401 402
	while ((drv = next_driver(&i)) && !error)
		error = fn(drv, data);
	klist_iter_exit(&i);
	return error;
L
Linus Torvalds 已提交
403
}
404
EXPORT_SYMBOL_GPL(bus_for_each_drv);
L
Linus Torvalds 已提交
405

406
static int device_add_attrs(struct bus_type *bus, struct device *dev)
L
Linus Torvalds 已提交
407 408 409 410
{
	int error = 0;
	int i;

411 412 413 414
	if (!bus->dev_attrs)
		return 0;

	for (i = 0; attr_name(bus->dev_attrs[i]); i++) {
415
		error = device_create_file(dev, &bus->dev_attrs[i]);
416 417 418 419
		if (error) {
			while (--i >= 0)
				device_remove_file(dev, &bus->dev_attrs[i]);
			break;
L
Linus Torvalds 已提交
420 421 422 423 424
		}
	}
	return error;
}

425
static void device_remove_attrs(struct bus_type *bus, struct device *dev)
L
Linus Torvalds 已提交
426 427 428 429 430
{
	int i;

	if (bus->dev_attrs) {
		for (i = 0; attr_name(bus->dev_attrs[i]); i++)
431
			device_remove_file(dev, &bus->dev_attrs[i]);
L
Linus Torvalds 已提交
432 433 434
	}
}

435 436 437 438
#ifdef CONFIG_SYSFS_DEPRECATED
static int make_deprecated_bus_links(struct device *dev)
{
	return sysfs_create_link(&dev->kobj,
439
				 &dev->bus->p->subsys.kobj, "bus");
440 441 442 443 444 445 446 447 448 449
}

static void remove_deprecated_bus_links(struct device *dev)
{
	sysfs_remove_link(&dev->kobj, "bus");
}
#else
static inline int make_deprecated_bus_links(struct device *dev) { return 0; }
static inline void remove_deprecated_bus_links(struct device *dev) { }
#endif
L
Linus Torvalds 已提交
450 451

/**
452 453
 * bus_add_device - add device to bus
 * @dev: device being added
L
Linus Torvalds 已提交
454
 *
455 456
 * - Add the device to its bus's list of devices.
 * - Create link to device's bus.
L
Linus Torvalds 已提交
457
 */
458
int bus_add_device(struct device *dev)
L
Linus Torvalds 已提交
459
{
460
	struct bus_type *bus = bus_get(dev->bus);
L
Linus Torvalds 已提交
461 462 463
	int error = 0;

	if (bus) {
464
		pr_debug("bus: '%s': add device %s\n", bus->name, dev_name(dev));
465
		error = device_add_attrs(bus, dev);
A
Andrew Morton 已提交
466
		if (error)
467
			goto out_put;
468
		error = sysfs_create_link(&bus->p->devices_kset->kobj,
469
						&dev->kobj, dev_name(dev));
A
Andrew Morton 已提交
470
		if (error)
471
			goto out_id;
A
Andrew Morton 已提交
472
		error = sysfs_create_link(&dev->kobj,
473
				&dev->bus->p->subsys.kobj, "subsystem");
A
Andrew Morton 已提交
474
		if (error)
475
			goto out_subsys;
476
		error = make_deprecated_bus_links(dev);
477 478
		if (error)
			goto out_deprecated;
L
Linus Torvalds 已提交
479
	}
480 481 482 483 484
	return 0;

out_deprecated:
	sysfs_remove_link(&dev->kobj, "subsystem");
out_subsys:
485
	sysfs_remove_link(&bus->p->devices_kset->kobj, dev_name(dev));
486 487 488
out_id:
	device_remove_attrs(bus, dev);
out_put:
G
Greg Kroah-Hartman 已提交
489
	bus_put(dev->bus);
L
Linus Torvalds 已提交
490 491 492
	return error;
}

493
/**
494 495
 * bus_attach_device - add device to bus
 * @dev: device tried to attach to a driver
496
 *
497 498
 * - Add device to bus's list of devices.
 * - Try to attach to driver.
499
 */
500
void bus_attach_device(struct device *dev)
501
{
A
Andrew Morton 已提交
502 503
	struct bus_type *bus = dev->bus;
	int ret = 0;
504 505

	if (bus) {
506
		if (bus->p->drivers_autoprobe)
507
			ret = device_attach(dev);
508 509
		WARN_ON(ret < 0);
		if (ret >= 0)
510
			klist_add_tail(&dev->knode_bus, &bus->p->klist_devices);
511 512 513
	}
}

L
Linus Torvalds 已提交
514
/**
515 516
 * bus_remove_device - remove device from bus
 * @dev: device to be removed
L
Linus Torvalds 已提交
517
 *
518 519 520 521
 * - Remove symlink from bus's directory.
 * - Delete device from bus's list.
 * - Detach from its driver.
 * - Drop reference taken in bus_add_device().
L
Linus Torvalds 已提交
522
 */
523
void bus_remove_device(struct device *dev)
L
Linus Torvalds 已提交
524 525
{
	if (dev->bus) {
526
		sysfs_remove_link(&dev->kobj, "subsystem");
527
		remove_deprecated_bus_links(dev);
528
		sysfs_remove_link(&dev->bus->p->devices_kset->kobj,
529
				  dev_name(dev));
L
Linus Torvalds 已提交
530
		device_remove_attrs(dev->bus, dev);
531 532
		if (klist_node_attached(&dev->knode_bus))
			klist_del(&dev->knode_bus);
533

534
		pr_debug("bus: '%s': remove device %s\n",
535
			 dev->bus->name, dev_name(dev));
L
Linus Torvalds 已提交
536
		device_release_driver(dev);
G
Greg Kroah-Hartman 已提交
537
		bus_put(dev->bus);
L
Linus Torvalds 已提交
538 539 540
	}
}

541
static int driver_add_attrs(struct bus_type *bus, struct device_driver *drv)
L
Linus Torvalds 已提交
542 543 544 545 546 547 548 549
{
	int error = 0;
	int i;

	if (bus->drv_attrs) {
		for (i = 0; attr_name(bus->drv_attrs[i]); i++) {
			error = driver_create_file(drv, &bus->drv_attrs[i]);
			if (error)
550
				goto err;
L
Linus Torvalds 已提交
551 552
		}
	}
553
done:
L
Linus Torvalds 已提交
554
	return error;
555
err:
L
Linus Torvalds 已提交
556 557
	while (--i >= 0)
		driver_remove_file(drv, &bus->drv_attrs[i]);
558
	goto done;
L
Linus Torvalds 已提交
559 560
}

561 562
static void driver_remove_attrs(struct bus_type *bus,
				struct device_driver *drv)
L
Linus Torvalds 已提交
563 564 565 566 567 568 569 570 571
{
	int i;

	if (bus->drv_attrs) {
		for (i = 0; attr_name(bus->drv_attrs[i]); i++)
			driver_remove_file(drv, &bus->drv_attrs[i]);
	}
}

572 573 574 575 576
#ifdef CONFIG_HOTPLUG
/*
 * Thanks to drivers making their tables __devinit, we can't allow manual
 * bind and unbind from userspace unless CONFIG_HOTPLUG is enabled.
 */
A
Andrew Morton 已提交
577
static int __must_check add_bind_files(struct device_driver *drv)
578
{
A
Andrew Morton 已提交
579 580 581 582 583 584 585 586 587
	int ret;

	ret = driver_create_file(drv, &driver_attr_unbind);
	if (ret == 0) {
		ret = driver_create_file(drv, &driver_attr_bind);
		if (ret)
			driver_remove_file(drv, &driver_attr_unbind);
	}
	return ret;
588 589 590 591 592 593 594
}

static void remove_bind_files(struct device_driver *drv)
{
	driver_remove_file(drv, &driver_attr_bind);
	driver_remove_file(drv, &driver_attr_unbind);
}
595

596 597 598 599
static BUS_ATTR(drivers_probe, S_IWUSR, NULL, store_drivers_probe);
static BUS_ATTR(drivers_autoprobe, S_IWUSR | S_IRUGO,
		show_drivers_autoprobe, store_drivers_autoprobe);

600 601 602 603
static int add_probe_files(struct bus_type *bus)
{
	int retval;

604
	retval = bus_create_file(bus, &bus_attr_drivers_probe);
605 606 607
	if (retval)
		goto out;

608
	retval = bus_create_file(bus, &bus_attr_drivers_autoprobe);
609
	if (retval)
610
		bus_remove_file(bus, &bus_attr_drivers_probe);
611 612 613 614 615 616
out:
	return retval;
}

static void remove_probe_files(struct bus_type *bus)
{
617 618
	bus_remove_file(bus, &bus_attr_drivers_autoprobe);
	bus_remove_file(bus, &bus_attr_drivers_probe);
619
}
620
#else
621
static inline int add_bind_files(struct device_driver *drv) { return 0; }
622
static inline void remove_bind_files(struct device_driver *drv) {}
623 624
static inline int add_probe_files(struct bus_type *bus) { return 0; }
static inline void remove_probe_files(struct bus_type *bus) {}
625
#endif
L
Linus Torvalds 已提交
626

627 628 629 630 631 632
static ssize_t driver_uevent_store(struct device_driver *drv,
				   const char *buf, size_t count)
{
	enum kobject_action action;

	if (kobject_action_type(buf, count, &action) == 0)
633
		kobject_uevent(&drv->p->kobj, action);
634 635 636 637
	return count;
}
static DRIVER_ATTR(uevent, S_IWUSR, NULL, driver_uevent_store);

L
Linus Torvalds 已提交
638
/**
639 640
 * bus_add_driver - Add a driver to the bus.
 * @drv: driver.
L
Linus Torvalds 已提交
641
 */
A
Andrew Morton 已提交
642
int bus_add_driver(struct device_driver *drv)
L
Linus Torvalds 已提交
643
{
644 645
	struct bus_type *bus;
	struct driver_private *priv;
L
Linus Torvalds 已提交
646 647
	int error = 0;

648
	bus = bus_get(drv->bus);
649
	if (!bus)
650
		return -EINVAL;
651

652
	pr_debug("bus: '%s': add driver %s\n", bus->name, drv->name);
653 654

	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
655 656 657 658
	if (!priv) {
		error = -ENOMEM;
		goto out_put_bus;
	}
659 660 661
	klist_init(&priv->klist_devices, NULL, NULL);
	priv->driver = drv;
	drv->p = priv;
662 663 664
	priv->kobj.kset = bus->p->drivers_kset;
	error = kobject_init_and_add(&priv->kobj, &driver_ktype, NULL,
				     "%s", drv->name);
665
	if (error)
666
		goto out_unregister;
667

668
	if (drv->bus->p->drivers_autoprobe) {
669 670 671 672
		error = driver_attach(drv);
		if (error)
			goto out_unregister;
	}
673
	klist_add_tail(&priv->knode_bus, &bus->p->klist_drivers);
674 675
	module_add_driver(drv->owner, drv);

676 677 678
	error = driver_create_file(drv, &driver_attr_uevent);
	if (error) {
		printk(KERN_ERR "%s: uevent attr (%s) failed\n",
679
			__func__, drv->name);
680
	}
681 682 683 684
	error = driver_add_attrs(bus, drv);
	if (error) {
		/* How the hell do we get out of this pickle? Give up */
		printk(KERN_ERR "%s: driver_add_attrs(%s) failed\n",
685
			__func__, drv->name);
686 687 688 689 690
	}
	error = add_bind_files(drv);
	if (error) {
		/* Ditto */
		printk(KERN_ERR "%s: add_bind_files(%s) failed\n",
691
			__func__, drv->name);
L
Linus Torvalds 已提交
692
	}
693

694
	kobject_uevent(&priv->kobj, KOBJ_ADD);
L
Linus Torvalds 已提交
695
	return error;
A
Andrew Morton 已提交
696
out_unregister:
697
	kobject_put(&priv->kobj);
A
Andrew Morton 已提交
698
out_put_bus:
G
Greg Kroah-Hartman 已提交
699
	bus_put(bus);
A
Andrew Morton 已提交
700
	return error;
L
Linus Torvalds 已提交
701 702 703
}

/**
704 705
 * bus_remove_driver - delete driver from bus's knowledge.
 * @drv: driver.
L
Linus Torvalds 已提交
706
 *
707 708 709
 * Detach the driver from the devices it controls, and remove
 * it from its bus's list of drivers. Finally, we drop the reference
 * to the bus we took in bus_add_driver().
L
Linus Torvalds 已提交
710
 */
711
void bus_remove_driver(struct device_driver *drv)
L
Linus Torvalds 已提交
712
{
713 714 715 716 717
	if (!drv->bus)
		return;

	remove_bind_files(drv);
	driver_remove_attrs(drv->bus, drv);
718
	driver_remove_file(drv, &driver_attr_uevent);
719
	klist_remove(&drv->p->knode_bus);
720
	pr_debug("bus: '%s': remove driver %s\n", drv->bus->name, drv->name);
721 722
	driver_detach(drv);
	module_remove_driver(drv);
723
	kobject_put(&drv->p->kobj);
G
Greg Kroah-Hartman 已提交
724
	bus_put(drv->bus);
L
Linus Torvalds 已提交
725 726 727
}

/* Helper for bus_rescan_devices's iter */
A
Andrew Morton 已提交
728
static int __must_check bus_rescan_devices_helper(struct device *dev,
729
						  void *data)
L
Linus Torvalds 已提交
730
{
A
Andrew Morton 已提交
731 732
	int ret = 0;

733 734 735
	if (!dev->driver) {
		if (dev->parent)	/* Needed for USB */
			down(&dev->parent->sem);
A
Andrew Morton 已提交
736
		ret = device_attach(dev);
737 738 739
		if (dev->parent)
			up(&dev->parent->sem);
	}
A
Andrew Morton 已提交
740
	return ret < 0 ? ret : 0;
L
Linus Torvalds 已提交
741 742 743
}

/**
744 745
 * bus_rescan_devices - rescan devices on the bus for possible drivers
 * @bus: the bus to scan.
L
Linus Torvalds 已提交
746
 *
747 748 749
 * This function will look for devices on the bus with no driver
 * attached and rescan it against existing drivers to see if it matches
 * any by calling device_attach() for the unbound devices.
L
Linus Torvalds 已提交
750
 */
751
int bus_rescan_devices(struct bus_type *bus)
L
Linus Torvalds 已提交
752
{
A
Andrew Morton 已提交
753
	return bus_for_each_dev(bus, NULL, NULL, bus_rescan_devices_helper);
L
Linus Torvalds 已提交
754
}
755
EXPORT_SYMBOL_GPL(bus_rescan_devices);
L
Linus Torvalds 已提交
756

757 758 759 760 761 762 763 764 765
/**
 * device_reprobe - remove driver for a device and probe for a new driver
 * @dev: the device to reprobe
 *
 * This function detaches the attached driver (if any) for the given
 * device and restarts the driver probing process.  It is intended
 * to use if probing criteria changed during a devices lifetime and
 * driver attachment should change accordingly.
 */
A
Andrew Morton 已提交
766
int device_reprobe(struct device *dev)
767 768 769 770 771 772 773 774
{
	if (dev->driver) {
		if (dev->parent)        /* Needed for USB */
			down(&dev->parent->sem);
		device_release_driver(dev);
		if (dev->parent)
			up(&dev->parent->sem);
	}
A
Andrew Morton 已提交
775
	return bus_rescan_devices_helper(dev, NULL);
776 777
}
EXPORT_SYMBOL_GPL(device_reprobe);
L
Linus Torvalds 已提交
778 779

/**
780 781
 * find_bus - locate bus by name.
 * @name: name of bus.
L
Linus Torvalds 已提交
782
 *
783 784
 * Call kset_find_obj() to iterate over list of buses to
 * find a bus by name. Return bus if found.
L
Linus Torvalds 已提交
785
 *
786
 * Note that kset_find_obj increments bus' reference count.
L
Linus Torvalds 已提交
787
 */
788
#if 0
789
struct bus_type *find_bus(char *name)
L
Linus Torvalds 已提交
790
{
791
	struct kobject *k = kset_find_obj(bus_kset, name);
L
Linus Torvalds 已提交
792 793
	return k ? to_bus(k) : NULL;
}
794
#endif  /*  0  */
L
Linus Torvalds 已提交
795 796 797


/**
798 799
 * bus_add_attrs - Add default attributes for this bus.
 * @bus: Bus that has just been registered.
L
Linus Torvalds 已提交
800 801
 */

802
static int bus_add_attrs(struct bus_type *bus)
L
Linus Torvalds 已提交
803 804 805 806 807 808
{
	int error = 0;
	int i;

	if (bus->bus_attrs) {
		for (i = 0; attr_name(bus->bus_attrs[i]); i++) {
809
			error = bus_create_file(bus, &bus->bus_attrs[i]);
810
			if (error)
811
				goto err;
L
Linus Torvalds 已提交
812 813
		}
	}
814
done:
L
Linus Torvalds 已提交
815
	return error;
816
err:
L
Linus Torvalds 已提交
817
	while (--i >= 0)
818 819
		bus_remove_file(bus, &bus->bus_attrs[i]);
	goto done;
L
Linus Torvalds 已提交
820 821
}

822
static void bus_remove_attrs(struct bus_type *bus)
L
Linus Torvalds 已提交
823 824 825 826 827
{
	int i;

	if (bus->bus_attrs) {
		for (i = 0; attr_name(bus->bus_attrs[i]); i++)
828
			bus_remove_file(bus, &bus->bus_attrs[i]);
L
Linus Torvalds 已提交
829 830 831
	}
}

832 833 834 835 836 837 838 839 840 841 842 843 844 845
static void klist_devices_get(struct klist_node *n)
{
	struct device *dev = container_of(n, struct device, knode_bus);

	get_device(dev);
}

static void klist_devices_put(struct klist_node *n)
{
	struct device *dev = container_of(n, struct device, knode_bus);

	put_device(dev);
}

846 847 848 849 850 851
static ssize_t bus_uevent_store(struct bus_type *bus,
				const char *buf, size_t count)
{
	enum kobject_action action;

	if (kobject_action_type(buf, count, &action) == 0)
852
		kobject_uevent(&bus->p->subsys.kobj, action);
853 854 855 856
	return count;
}
static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store);

L
Linus Torvalds 已提交
857
/**
858 859
 * bus_register - register a bus with the system.
 * @bus: bus.
L
Linus Torvalds 已提交
860
 *
861 862 863
 * Once we have that, we registered the bus with the kobject
 * infrastructure, then register the children subsystems it has:
 * the devices and drivers that belong to the bus.
L
Linus Torvalds 已提交
864
 */
865
int bus_register(struct bus_type *bus)
L
Linus Torvalds 已提交
866 867
{
	int retval;
868 869 870 871 872 873 874 875
	struct bus_type_private *priv;

	priv = kzalloc(sizeof(struct bus_type_private), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	priv->bus = bus;
	bus->p = priv;
L
Linus Torvalds 已提交
876

877
	BLOCKING_INIT_NOTIFIER_HEAD(&priv->bus_notifier);
878

879
	retval = kobject_set_name(&priv->subsys.kobj, "%s", bus->name);
L
Linus Torvalds 已提交
880 881 882
	if (retval)
		goto out;

883 884 885
	priv->subsys.kobj.kset = bus_kset;
	priv->subsys.kobj.ktype = &bus_ktype;
	priv->drivers_autoprobe = 1;
886

887
	retval = kset_register(&priv->subsys);
L
Linus Torvalds 已提交
888 889 890
	if (retval)
		goto out;

891 892 893 894
	retval = bus_create_file(bus, &bus_attr_uevent);
	if (retval)
		goto bus_uevent_fail;

895 896 897
	priv->devices_kset = kset_create_and_add("devices", NULL,
						 &priv->subsys.kobj);
	if (!priv->devices_kset) {
898
		retval = -ENOMEM;
L
Linus Torvalds 已提交
899
		goto bus_devices_fail;
900
	}
L
Linus Torvalds 已提交
901

902 903 904
	priv->drivers_kset = kset_create_and_add("drivers", NULL,
						 &priv->subsys.kobj);
	if (!priv->drivers_kset) {
905
		retval = -ENOMEM;
L
Linus Torvalds 已提交
906
		goto bus_drivers_fail;
907
	}
908

909 910
	klist_init(&priv->klist_devices, klist_devices_get, klist_devices_put);
	klist_init(&priv->klist_drivers, NULL, NULL);
911 912 913 914 915

	retval = add_probe_files(bus);
	if (retval)
		goto bus_probe_files_fail;

916 917 918
	retval = bus_add_attrs(bus);
	if (retval)
		goto bus_attrs_fail;
L
Linus Torvalds 已提交
919

920
	pr_debug("bus: '%s': registered\n", bus->name);
L
Linus Torvalds 已提交
921 922
	return 0;

923
bus_attrs_fail:
924 925
	remove_probe_files(bus);
bus_probe_files_fail:
926
	kset_unregister(bus->p->drivers_kset);
L
Linus Torvalds 已提交
927
bus_drivers_fail:
928
	kset_unregister(bus->p->devices_kset);
L
Linus Torvalds 已提交
929
bus_devices_fail:
930 931
	bus_remove_file(bus, &bus_attr_uevent);
bus_uevent_fail:
932 933
	kset_unregister(&bus->p->subsys);
	kfree(bus->p);
L
Linus Torvalds 已提交
934 935 936
out:
	return retval;
}
937
EXPORT_SYMBOL_GPL(bus_register);
L
Linus Torvalds 已提交
938 939

/**
940 941
 * bus_unregister - remove a bus from the system
 * @bus: bus.
L
Linus Torvalds 已提交
942
 *
943 944
 * Unregister the child subsystems and the bus itself.
 * Finally, we call bus_put() to release the refcount
L
Linus Torvalds 已提交
945
 */
946
void bus_unregister(struct bus_type *bus)
L
Linus Torvalds 已提交
947
{
948
	pr_debug("bus: '%s': unregistering\n", bus->name);
L
Linus Torvalds 已提交
949
	bus_remove_attrs(bus);
950
	remove_probe_files(bus);
951 952
	kset_unregister(bus->p->drivers_kset);
	kset_unregister(bus->p->devices_kset);
953
	bus_remove_file(bus, &bus_attr_uevent);
954 955
	kset_unregister(&bus->p->subsys);
	kfree(bus->p);
L
Linus Torvalds 已提交
956
}
957
EXPORT_SYMBOL_GPL(bus_unregister);
L
Linus Torvalds 已提交
958

959 960
int bus_register_notifier(struct bus_type *bus, struct notifier_block *nb)
{
961
	return blocking_notifier_chain_register(&bus->p->bus_notifier, nb);
962 963 964 965 966
}
EXPORT_SYMBOL_GPL(bus_register_notifier);

int bus_unregister_notifier(struct bus_type *bus, struct notifier_block *nb)
{
967
	return blocking_notifier_chain_unregister(&bus->p->bus_notifier, nb);
968 969 970
}
EXPORT_SYMBOL_GPL(bus_unregister_notifier);

971 972
struct kset *bus_get_kset(struct bus_type *bus)
{
973
	return &bus->p->subsys;
974 975 976
}
EXPORT_SYMBOL_GPL(bus_get_kset);

977 978
struct klist *bus_get_device_klist(struct bus_type *bus)
{
979
	return &bus->p->klist_devices;
980 981 982
}
EXPORT_SYMBOL_GPL(bus_get_device_klist);

983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
/*
 * Yes, this forcably breaks the klist abstraction temporarily.  It
 * just wants to sort the klist, not change reference counts and
 * take/drop locks rapidly in the process.  It does all this while
 * holding the lock for the list, so objects can't otherwise be
 * added/removed while we're swizzling.
 */
static void device_insertion_sort_klist(struct device *a, struct list_head *list,
					int (*compare)(const struct device *a,
							const struct device *b))
{
	struct list_head *pos;
	struct klist_node *n;
	struct device *b;

	list_for_each(pos, list) {
		n = container_of(pos, struct klist_node, n_node);
		b = container_of(n, struct device, knode_bus);
		if (compare(a, b) <= 0) {
			list_move_tail(&a->knode_bus.n_node,
				       &b->knode_bus.n_node);
			return;
		}
	}
	list_move_tail(&a->knode_bus.n_node, list);
}

void bus_sort_breadthfirst(struct bus_type *bus,
			   int (*compare)(const struct device *a,
					  const struct device *b))
{
	LIST_HEAD(sorted_devices);
	struct list_head *pos, *tmp;
	struct klist_node *n;
	struct device *dev;
	struct klist *device_klist;

	device_klist = bus_get_device_klist(bus);

	spin_lock(&device_klist->k_lock);
	list_for_each_safe(pos, tmp, &device_klist->k_list) {
		n = container_of(pos, struct klist_node, n_node);
		dev = container_of(n, struct device, knode_bus);
		device_insertion_sort_klist(dev, &sorted_devices, compare);
	}
	list_splice(&sorted_devices, &device_klist->k_list);
	spin_unlock(&device_klist->k_lock);
}
EXPORT_SYMBOL_GPL(bus_sort_breadthfirst);

L
Linus Torvalds 已提交
1033 1034
int __init buses_init(void)
{
1035 1036 1037 1038
	bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
	if (!bus_kset)
		return -ENOMEM;
	return 0;
L
Linus Torvalds 已提交
1039
}