Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6: PPC: Fix powerpc vio_find_name to not use devices_subsys Driver core: add bus_find_device_by_name function Module: check to see if we have a built in module with the same name x86: fix runtime error in arch/x86/kernel/cpu/mcheck/mce_amd_64.c Driver core: Fix up build when CONFIG_BLOCK=N
This commit is contained in:
		
						commit
						3b470ac43f
					
				| @ -37,8 +37,6 @@ | ||||
| #include <asm/iseries/hv_call_xm.h> | ||||
| #include <asm/iseries/iommu.h> | ||||
| 
 | ||||
| extern struct kset devices_subsys; /* needed for vio_find_name() */ | ||||
| 
 | ||||
| static struct bus_type vio_bus_type; | ||||
| 
 | ||||
| static struct vio_dev vio_bus_device  = { /* fake "parent" device */ | ||||
| @ -361,19 +359,16 @@ EXPORT_SYMBOL(vio_get_attribute); | ||||
| #ifdef CONFIG_PPC_PSERIES | ||||
| /* vio_find_name() - internal because only vio.c knows how we formatted the
 | ||||
|  * kobject name | ||||
|  * XXX once vio_bus_type.devices is actually used as a kset in | ||||
|  * drivers/base/bus.c, this function should be removed in favor of | ||||
|  * "device_find(kobj_name, &vio_bus_type)" | ||||
|  */ | ||||
| static struct vio_dev *vio_find_name(const char *kobj_name) | ||||
| static struct vio_dev *vio_find_name(const char *name) | ||||
| { | ||||
| 	struct kobject *found; | ||||
| 	struct device *found; | ||||
| 
 | ||||
| 	found = kset_find_obj(&devices_subsys, kobj_name); | ||||
| 	found = bus_find_device_by_name(&vio_bus_type, NULL, name); | ||||
| 	if (!found) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	return to_vio_dev(container_of(found, struct device, kobj)); | ||||
| 	return to_vio_dev(found); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | ||||
| @ -163,15 +163,6 @@ static struct kset *bus_kset; | ||||
| 
 | ||||
| #ifdef CONFIG_HOTPLUG | ||||
| /* Manually detach a device from its associated driver. */ | ||||
| static int driver_helper(struct device *dev, void *data) | ||||
| { | ||||
| 	const char *name = data; | ||||
| 
 | ||||
| 	if (strcmp(name, dev->bus_id) == 0) | ||||
| 		return 1; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static ssize_t driver_unbind(struct device_driver *drv, | ||||
| 			     const char *buf, size_t count) | ||||
| { | ||||
| @ -179,7 +170,7 @@ static ssize_t driver_unbind(struct device_driver *drv, | ||||
| 	struct device *dev; | ||||
| 	int err = -ENODEV; | ||||
| 
 | ||||
| 	dev = bus_find_device(bus, NULL, (void *)buf, driver_helper); | ||||
| 	dev = bus_find_device_by_name(bus, NULL, buf); | ||||
| 	if (dev && dev->driver == drv) { | ||||
| 		if (dev->parent)	/* Needed for USB */ | ||||
| 			down(&dev->parent->sem); | ||||
| @ -206,7 +197,7 @@ static ssize_t driver_bind(struct device_driver *drv, | ||||
| 	struct device *dev; | ||||
| 	int err = -ENODEV; | ||||
| 
 | ||||
| 	dev = bus_find_device(bus, NULL, (void *)buf, driver_helper); | ||||
| 	dev = bus_find_device_by_name(bus, NULL, buf); | ||||
| 	if (dev && dev->driver == NULL) { | ||||
| 		if (dev->parent)	/* Needed for USB */ | ||||
| 			down(&dev->parent->sem); | ||||
| @ -250,7 +241,7 @@ static ssize_t store_drivers_probe(struct bus_type *bus, | ||||
| { | ||||
| 	struct device *dev; | ||||
| 
 | ||||
| 	dev = bus_find_device(bus, NULL, (void *)buf, driver_helper); | ||||
| 	dev = bus_find_device_by_name(bus, NULL, buf); | ||||
| 	if (!dev) | ||||
| 		return -ENODEV; | ||||
| 	if (bus_rescan_devices_helper(dev, NULL) != 0) | ||||
| @ -338,6 +329,32 @@ struct device *bus_find_device(struct bus_type *bus, | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(bus_find_device); | ||||
| 
 | ||||
| static int match_name(struct device *dev, void *data) | ||||
| { | ||||
| 	const char *name = data; | ||||
| 
 | ||||
| 	if (strcmp(name, dev->bus_id) == 0) | ||||
| 		return 1; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * 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); | ||||
| 
 | ||||
| static struct device_driver *next_driver(struct klist_iter *i) | ||||
| { | ||||
| 	struct klist_node *n = klist_next(i); | ||||
|  | ||||
| @ -149,7 +149,7 @@ int class_register(struct class *cls) | ||||
| 	if (error) | ||||
| 		return error; | ||||
| 
 | ||||
| #ifdef CONFIG_SYSFS_DEPRECATED | ||||
| #if defined(CONFIG_SYSFS_DEPRECATED) && defined(CONFIG_BLOCK) | ||||
| 	/* let the block class directory show up in the root of sysfs */ | ||||
| 	if (cls != &block_class) | ||||
| 		cls->subsys.kobj.kset = class_kset; | ||||
|  | ||||
| @ -27,9 +27,17 @@ | ||||
| int (*platform_notify)(struct device *dev) = NULL; | ||||
| int (*platform_notify_remove)(struct device *dev) = NULL; | ||||
| 
 | ||||
| /*
 | ||||
|  * sysfs bindings for devices. | ||||
|  */ | ||||
| #ifdef CONFIG_BLOCK | ||||
| static inline int device_is_not_partition(struct device *dev) | ||||
| { | ||||
| 	return !(dev->type == &part_type); | ||||
| } | ||||
| #else | ||||
| static inline int device_is_not_partition(struct device *dev) | ||||
| { | ||||
| 	return 1; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * dev_driver_string - Return a device's driver name, if at all possible | ||||
| @ -652,14 +660,14 @@ static int device_add_class_symlinks(struct device *dev) | ||||
| #ifdef CONFIG_SYSFS_DEPRECATED | ||||
| 	/* stacked class devices need a symlink in the class directory */ | ||||
| 	if (dev->kobj.parent != &dev->class->subsys.kobj && | ||||
| 	    dev->type != &part_type) { | ||||
| 	    device_is_not_partition(dev)) { | ||||
| 		error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj, | ||||
| 					  dev->bus_id); | ||||
| 		if (error) | ||||
| 			goto out_subsys; | ||||
| 	} | ||||
| 
 | ||||
| 	if (dev->parent && dev->type != &part_type) { | ||||
| 	if (dev->parent && device_is_not_partition(dev)) { | ||||
| 		struct device *parent = dev->parent; | ||||
| 		char *class_name; | ||||
| 
 | ||||
| @ -688,11 +696,11 @@ static int device_add_class_symlinks(struct device *dev) | ||||
| 	return 0; | ||||
| 
 | ||||
| out_device: | ||||
| 	if (dev->parent && dev->type != &part_type) | ||||
| 	if (dev->parent && device_is_not_partition(dev)) | ||||
| 		sysfs_remove_link(&dev->kobj, "device"); | ||||
| out_busid: | ||||
| 	if (dev->kobj.parent != &dev->class->subsys.kobj && | ||||
| 	    dev->type != &part_type) | ||||
| 	    device_is_not_partition(dev)) | ||||
| 		sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); | ||||
| #else | ||||
| 	/* link in the class directory pointing to the device */ | ||||
| @ -701,7 +709,7 @@ out_busid: | ||||
| 	if (error) | ||||
| 		goto out_subsys; | ||||
| 
 | ||||
| 	if (dev->parent && dev->type != &part_type) { | ||||
| 	if (dev->parent && device_is_not_partition(dev)) { | ||||
| 		error = sysfs_create_link(&dev->kobj, &dev->parent->kobj, | ||||
| 					  "device"); | ||||
| 		if (error) | ||||
| @ -725,7 +733,7 @@ static void device_remove_class_symlinks(struct device *dev) | ||||
| 		return; | ||||
| 
 | ||||
| #ifdef CONFIG_SYSFS_DEPRECATED | ||||
| 	if (dev->parent && dev->type != &part_type) { | ||||
| 	if (dev->parent && device_is_not_partition(dev)) { | ||||
| 		char *class_name; | ||||
| 
 | ||||
| 		class_name = make_class_name(dev->class->name, &dev->kobj); | ||||
| @ -737,10 +745,10 @@ static void device_remove_class_symlinks(struct device *dev) | ||||
| 	} | ||||
| 
 | ||||
| 	if (dev->kobj.parent != &dev->class->subsys.kobj && | ||||
| 	    dev->type != &part_type) | ||||
| 	    device_is_not_partition(dev)) | ||||
| 		sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); | ||||
| #else | ||||
| 	if (dev->parent && dev->type != &part_type) | ||||
| 	if (dev->parent && device_is_not_partition(dev)) | ||||
| 		sysfs_remove_link(&dev->kobj, "device"); | ||||
| 
 | ||||
| 	sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); | ||||
|  | ||||
| @ -84,6 +84,9 @@ int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, | ||||
| struct device *bus_find_device(struct bus_type *bus, struct device *start, | ||||
| 			       void *data, | ||||
| 			       int (*match)(struct device *dev, void *data)); | ||||
| struct device *bus_find_device_by_name(struct bus_type *bus, | ||||
| 				       struct device *start, | ||||
| 				       const char *name); | ||||
| 
 | ||||
| int __must_check bus_for_each_drv(struct bus_type *bus, | ||||
| 				  struct device_driver *start, void *data, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user