Commit 92807f31 authored by Patrick Mochel's avatar Patrick Mochel

Merge osdl.org:/home/mochel/src/kernel/devel/linux-2.5-core

into osdl.org:/home/mochel/src/kernel/devel/linux-2.5-power
parents 86ccb795 65e5149b
...@@ -287,6 +287,7 @@ static int device_attach(struct device * dev) ...@@ -287,6 +287,7 @@ static int device_attach(struct device * dev)
{ {
struct bus_type * bus = dev->bus; struct bus_type * bus = dev->bus;
struct list_head * entry; struct list_head * entry;
int error;
if (dev->driver) { if (dev->driver) {
device_bind_driver(dev); device_bind_driver(dev);
...@@ -296,8 +297,15 @@ static int device_attach(struct device * dev) ...@@ -296,8 +297,15 @@ static int device_attach(struct device * dev)
if (bus->match) { if (bus->match) {
list_for_each(entry,&bus->drivers.list) { list_for_each(entry,&bus->drivers.list) {
struct device_driver * drv = to_drv(entry); struct device_driver * drv = to_drv(entry);
if (!bus_match(dev,drv)) error = bus_match(dev,drv);
return 1; if (!error )
/* success, driver matched */
return 1;
if (error != -ENODEV)
/* driver matched but the probe failed */
printk(KERN_WARNING
"%s: probe of %s failed with error %d\n",
drv->name, dev->bus_id, error);
} }
} }
...@@ -314,13 +322,14 @@ static int device_attach(struct device * dev) ...@@ -314,13 +322,14 @@ static int device_attach(struct device * dev)
* If bus_match() returns 0 and the @dev->driver is set, we've found * If bus_match() returns 0 and the @dev->driver is set, we've found
* a compatible pair. * a compatible pair.
* *
* Note that we ignore the error from bus_match(), since it's perfectly * Note that we ignore the -ENODEV error from bus_match(), since it's
* valid for a driver not to bind to any devices. * perfectly valid for a driver not to bind to any devices.
*/ */
void driver_attach(struct device_driver * drv) void driver_attach(struct device_driver * drv)
{ {
struct bus_type * bus = drv->bus; struct bus_type * bus = drv->bus;
struct list_head * entry; struct list_head * entry;
int error;
if (!bus->match) if (!bus->match)
return; return;
...@@ -328,7 +337,12 @@ void driver_attach(struct device_driver * drv) ...@@ -328,7 +337,12 @@ void driver_attach(struct device_driver * drv)
list_for_each(entry,&bus->devices.list) { list_for_each(entry,&bus->devices.list) {
struct device * dev = container_of(entry,struct device,bus_list); struct device * dev = container_of(entry,struct device,bus_list);
if (!dev->driver) { if (!dev->driver) {
bus_match(dev,drv); error = bus_match(dev,drv);
if (error && (error != -ENODEV))
/* driver matched but the probe failed */
printk(KERN_WARNING
"%s: probe of %s failed with error %d\n",
drv->name, dev->bus_id, error);
} }
} }
} }
......
...@@ -59,7 +59,7 @@ static struct kobj_type ktype_class = { ...@@ -59,7 +59,7 @@ static struct kobj_type ktype_class = {
static decl_subsys(class,&ktype_class,NULL); static decl_subsys(class,&ktype_class,NULL);
int class_create_file(struct class * cls, struct class_attribute * attr) int class_create_file(struct class * cls, const struct class_attribute * attr)
{ {
int error; int error;
if (cls) { if (cls) {
...@@ -69,7 +69,7 @@ int class_create_file(struct class * cls, struct class_attribute * attr) ...@@ -69,7 +69,7 @@ int class_create_file(struct class * cls, struct class_attribute * attr)
return error; return error;
} }
void class_remove_file(struct class * cls, struct class_attribute * attr) void class_remove_file(struct class * cls, const struct class_attribute * attr)
{ {
if (cls) if (cls)
sysfs_remove_file(&cls->subsys.kset.kobj,&attr->attr); sysfs_remove_file(&cls->subsys.kset.kobj,&attr->attr);
...@@ -110,7 +110,7 @@ void class_unregister(struct class * cls) ...@@ -110,7 +110,7 @@ void class_unregister(struct class * cls)
/* Class Device Stuff */ /* Class Device Stuff */
int class_device_create_file(struct class_device * class_dev, int class_device_create_file(struct class_device * class_dev,
struct class_device_attribute * attr) const struct class_device_attribute * attr)
{ {
int error = -EINVAL; int error = -EINVAL;
if (class_dev) if (class_dev)
...@@ -119,7 +119,7 @@ int class_device_create_file(struct class_device * class_dev, ...@@ -119,7 +119,7 @@ int class_device_create_file(struct class_device * class_dev,
} }
void class_device_remove_file(struct class_device * class_dev, void class_device_remove_file(struct class_device * class_dev,
struct class_device_attribute * attr) const struct class_device_attribute * attr)
{ {
if (class_dev) if (class_dev)
sysfs_remove_file(&class_dev->kobj, &attr->attr); sysfs_remove_file(&class_dev->kobj, &attr->attr);
......
...@@ -22,7 +22,7 @@ static int init_dir(struct inode * inode) ...@@ -22,7 +22,7 @@ static int init_dir(struct inode * inode)
static struct dentry * static struct dentry *
create_dir(struct kobject * k, struct dentry * p, char * n) create_dir(struct kobject * k, struct dentry * p, const char * n)
{ {
struct dentry * dentry; struct dentry * dentry;
...@@ -47,7 +47,7 @@ create_dir(struct kobject * k, struct dentry * p, char * n) ...@@ -47,7 +47,7 @@ create_dir(struct kobject * k, struct dentry * p, char * n)
} }
struct dentry * sysfs_create_subdir(struct kobject * k, char * n) struct dentry * sysfs_create_subdir(struct kobject * k, const char * n)
{ {
return create_dir(k,k->dentry,n); return create_dir(k,k->dentry,n);
} }
...@@ -155,7 +155,7 @@ void sysfs_remove_dir(struct kobject * kobj) ...@@ -155,7 +155,7 @@ void sysfs_remove_dir(struct kobject * kobj)
dput(dentry); dput(dentry);
} }
void sysfs_rename_dir(struct kobject * kobj, char *new_name) void sysfs_rename_dir(struct kobject * kobj, const char *new_name)
{ {
struct dentry * new_dentry, * parent; struct dentry * new_dentry, * parent;
......
...@@ -345,7 +345,7 @@ static struct file_operations sysfs_file_operations = { ...@@ -345,7 +345,7 @@ static struct file_operations sysfs_file_operations = {
}; };
int sysfs_add_file(struct dentry * dir, struct attribute * attr) int sysfs_add_file(struct dentry * dir, const struct attribute * attr)
{ {
struct dentry * dentry; struct dentry * dentry;
int error; int error;
...@@ -368,7 +368,7 @@ int sysfs_add_file(struct dentry * dir, struct attribute * attr) ...@@ -368,7 +368,7 @@ int sysfs_add_file(struct dentry * dir, struct attribute * attr)
* @attr: atrribute descriptor. * @attr: atrribute descriptor.
*/ */
int sysfs_create_file(struct kobject * kobj, struct attribute * attr) int sysfs_create_file(struct kobject * kobj, const struct attribute * attr)
{ {
if (kobj && attr) if (kobj && attr)
return sysfs_add_file(kobj->dentry,attr); return sysfs_add_file(kobj->dentry,attr);
...@@ -384,7 +384,7 @@ int sysfs_create_file(struct kobject * kobj, struct attribute * attr) ...@@ -384,7 +384,7 @@ int sysfs_create_file(struct kobject * kobj, struct attribute * attr)
* Also call dnotify for the dentry, which lots of userspace programs * Also call dnotify for the dentry, which lots of userspace programs
* use. * use.
*/ */
int sysfs_update_file(struct kobject * kobj, struct attribute * attr) int sysfs_update_file(struct kobject * kobj, const struct attribute * attr)
{ {
struct dentry * dir = kobj->dentry; struct dentry * dir = kobj->dentry;
struct dentry * victim; struct dentry * victim;
...@@ -425,7 +425,7 @@ int sysfs_update_file(struct kobject * kobj, struct attribute * attr) ...@@ -425,7 +425,7 @@ int sysfs_update_file(struct kobject * kobj, struct attribute * attr)
* Hash the attribute name and kill the victim. * Hash the attribute name and kill the victim.
*/ */
void sysfs_remove_file(struct kobject * kobj, struct attribute * attr) void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr)
{ {
sysfs_hash_and_remove(kobj->dentry,attr->name); sysfs_hash_and_remove(kobj->dentry,attr->name);
} }
......
...@@ -15,22 +15,23 @@ ...@@ -15,22 +15,23 @@
#include "sysfs.h" #include "sysfs.h"
static void remove_files(struct dentry * dir, struct attribute_group * grp) static void remove_files(struct dentry * dir,
const struct attribute_group * grp)
{ {
struct attribute * attr; struct attribute *const* attr;
for (attr = grp->attrs; attr->name; attr++) for (attr = grp->attrs; *attr; attr++)
sysfs_hash_and_remove(dir,attr->name); sysfs_hash_and_remove(dir,(*attr)->name);
} }
static int create_files(struct kobject * kobj, struct dentry * dir, static int create_files(struct dentry * dir,
struct attribute_group * grp) const struct attribute_group * grp)
{ {
struct attribute * attr; struct attribute *const* attr;
int error = 0; int error = 0;
for (attr = grp->attrs; attr->name && !error; attr++) { for (attr = grp->attrs; *attr && !error; attr++) {
error = sysfs_add_file(dir,attr); error = sysfs_add_file(dir,*attr);
} }
if (error) if (error)
remove_files(dir,grp); remove_files(dir,grp);
...@@ -38,7 +39,8 @@ static int create_files(struct kobject * kobj, struct dentry * dir, ...@@ -38,7 +39,8 @@ static int create_files(struct kobject * kobj, struct dentry * dir,
} }
int sysfs_create_group(struct kobject * kobj, struct attribute_group * grp) int sysfs_create_group(struct kobject * kobj,
const struct attribute_group * grp)
{ {
struct dentry * dir; struct dentry * dir;
int error; int error;
...@@ -50,7 +52,7 @@ int sysfs_create_group(struct kobject * kobj, struct attribute_group * grp) ...@@ -50,7 +52,7 @@ int sysfs_create_group(struct kobject * kobj, struct attribute_group * grp)
} else } else
dir = kobj->dentry; dir = kobj->dentry;
dir = dget(dir); dir = dget(dir);
if ((error = create_files(kobj,dir,grp))) { if ((error = create_files(dir,grp))) {
if (grp->name) if (grp->name)
sysfs_remove_subdir(dir); sysfs_remove_subdir(dir);
dput(dir); dput(dir);
...@@ -58,7 +60,8 @@ int sysfs_create_group(struct kobject * kobj, struct attribute_group * grp) ...@@ -58,7 +60,8 @@ int sysfs_create_group(struct kobject * kobj, struct attribute_group * grp)
return error; return error;
} }
void sysfs_remove_group(struct kobject * kobj, struct attribute_group * grp) void sysfs_remove_group(struct kobject * kobj,
const struct attribute_group * grp)
{ {
struct dentry * dir; struct dentry * dir;
......
...@@ -4,10 +4,10 @@ extern struct vfsmount * sysfs_mount; ...@@ -4,10 +4,10 @@ extern struct vfsmount * sysfs_mount;
extern struct inode * sysfs_new_inode(mode_t mode); extern struct inode * sysfs_new_inode(mode_t mode);
extern int sysfs_create(struct dentry *, int mode, int (*init)(struct inode *)); extern int sysfs_create(struct dentry *, int mode, int (*init)(struct inode *));
extern struct dentry * sysfs_get_dentry(struct dentry *, char *); extern struct dentry * sysfs_get_dentry(struct dentry *, const char *);
extern int sysfs_add_file(struct dentry * dir, struct attribute * attr); extern int sysfs_add_file(struct dentry * dir, const struct attribute * attr);
extern void sysfs_hash_and_remove(struct dentry * dir, const char * name); extern void sysfs_hash_and_remove(struct dentry * dir, const char * name);
extern struct dentry * sysfs_create_subdir(struct kobject *, char *); extern struct dentry * sysfs_create_subdir(struct kobject *, const char *);
extern void sysfs_remove_subdir(struct dentry *); extern void sysfs_remove_subdir(struct dentry *);
...@@ -176,8 +176,8 @@ struct class_attribute class_attr_##_name = { \ ...@@ -176,8 +176,8 @@ struct class_attribute class_attr_##_name = { \
.store = _store, \ .store = _store, \
}; };
extern int class_create_file(struct class *, struct class_attribute *); extern int class_create_file(struct class *, const struct class_attribute *);
extern void class_remove_file(struct class *, struct class_attribute *); extern void class_remove_file(struct class *, const struct class_attribute *);
struct class_device { struct class_device {
...@@ -228,8 +228,10 @@ struct class_device_attribute class_device_attr_##_name = { \ ...@@ -228,8 +228,10 @@ struct class_device_attribute class_device_attr_##_name = { \
.store = _store, \ .store = _store, \
}; };
extern int class_device_create_file(struct class_device *, struct class_device_attribute *); extern int class_device_create_file(struct class_device *,
extern void class_device_remove_file(struct class_device *, struct class_device_attribute *); const struct class_device_attribute *);
extern void class_device_remove_file(struct class_device *,
const struct class_device_attribute *);
struct class_interface { struct class_interface {
......
...@@ -40,16 +40,16 @@ extern void ...@@ -40,16 +40,16 @@ extern void
sysfs_remove_dir(struct kobject *); sysfs_remove_dir(struct kobject *);
extern void extern void
sysfs_rename_dir(struct kobject *, char *new_name); sysfs_rename_dir(struct kobject *, const char *new_name);
extern int extern int
sysfs_create_file(struct kobject *, struct attribute *); sysfs_create_file(struct kobject *, const struct attribute *);
extern int extern int
sysfs_update_file(struct kobject *, struct attribute *); sysfs_update_file(struct kobject *, const struct attribute *);
extern void extern void
sysfs_remove_file(struct kobject *, struct attribute *); sysfs_remove_file(struct kobject *, const struct attribute *);
extern int extern int
sysfs_create_link(struct kobject * kobj, struct kobject * target, char * name); sysfs_create_link(struct kobject * kobj, struct kobject * target, char * name);
...@@ -60,10 +60,10 @@ sysfs_remove_link(struct kobject *, char * name); ...@@ -60,10 +60,10 @@ sysfs_remove_link(struct kobject *, char * name);
struct attribute_group { struct attribute_group {
char * name; char * name;
struct attribute * attrs; struct attribute ** attrs;
}; };
int sysfs_create_group(struct kobject *, struct attribute_group *); int sysfs_create_group(struct kobject *, const struct attribute_group *);
void sysfs_remove_group(struct kobject *, struct attribute_group *); void sysfs_remove_group(struct kobject *, const struct attribute_group *);
#endif /* _SYSFS_H_ */ #endif /* _SYSFS_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment