diff options
Diffstat (limited to 'drivers/base/sys.c')
| -rw-r--r-- | drivers/base/sys.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/drivers/base/sys.c b/drivers/base/sys.c index 6fc23ab127bd..6858178b3aff 100644 --- a/drivers/base/sys.c +++ b/drivers/base/sys.c | |||
| @@ -80,10 +80,59 @@ void sysdev_remove_file(struct sys_device * s, struct sysdev_attribute * a) | |||
| 80 | EXPORT_SYMBOL_GPL(sysdev_create_file); | 80 | EXPORT_SYMBOL_GPL(sysdev_create_file); |
| 81 | EXPORT_SYMBOL_GPL(sysdev_remove_file); | 81 | EXPORT_SYMBOL_GPL(sysdev_remove_file); |
| 82 | 82 | ||
| 83 | #define to_sysdev_class(k) container_of(k, struct sysdev_class, kset.kobj) | ||
| 84 | #define to_sysdev_class_attr(a) container_of(a, \ | ||
| 85 | struct sysdev_class_attribute, attr) | ||
| 86 | |||
| 87 | static ssize_t sysdev_class_show(struct kobject *kobj, struct attribute *attr, | ||
| 88 | char *buffer) | ||
| 89 | { | ||
| 90 | struct sysdev_class * class = to_sysdev_class(kobj); | ||
| 91 | struct sysdev_class_attribute *class_attr = to_sysdev_class_attr(attr); | ||
| 92 | |||
| 93 | if (class_attr->show) | ||
| 94 | return class_attr->show(class, buffer); | ||
| 95 | return -EIO; | ||
| 96 | } | ||
| 97 | |||
| 98 | static ssize_t sysdev_class_store(struct kobject *kobj, struct attribute *attr, | ||
| 99 | const char *buffer, size_t count) | ||
| 100 | { | ||
| 101 | struct sysdev_class * class = to_sysdev_class(kobj); | ||
| 102 | struct sysdev_class_attribute * class_attr = to_sysdev_class_attr(attr); | ||
| 103 | |||
| 104 | if (class_attr->store) | ||
| 105 | return class_attr->store(class, buffer, count); | ||
| 106 | return -EIO; | ||
| 107 | } | ||
| 108 | |||
| 109 | static struct sysfs_ops sysfs_class_ops = { | ||
| 110 | .show = sysdev_class_show, | ||
| 111 | .store = sysdev_class_store, | ||
| 112 | }; | ||
| 113 | |||
| 114 | static struct kobj_type ktype_sysdev_class = { | ||
| 115 | .sysfs_ops = &sysfs_class_ops, | ||
| 116 | }; | ||
| 117 | |||
| 118 | int sysdev_class_create_file(struct sysdev_class *c, | ||
| 119 | struct sysdev_class_attribute *a) | ||
| 120 | { | ||
| 121 | return sysfs_create_file(&c->kset.kobj, &a->attr); | ||
| 122 | } | ||
| 123 | EXPORT_SYMBOL_GPL(sysdev_class_create_file); | ||
| 124 | |||
| 125 | void sysdev_class_remove_file(struct sysdev_class *c, | ||
| 126 | struct sysdev_class_attribute *a) | ||
| 127 | { | ||
| 128 | sysfs_remove_file(&c->kset.kobj, &a->attr); | ||
| 129 | } | ||
| 130 | EXPORT_SYMBOL_GPL(sysdev_class_remove_file); | ||
| 131 | |||
| 83 | /* | 132 | /* |
| 84 | * declare system_subsys | 133 | * declare system_subsys |
| 85 | */ | 134 | */ |
| 86 | static decl_subsys(system, &ktype_sysdev, NULL); | 135 | static decl_subsys(system, &ktype_sysdev_class, NULL); |
| 87 | 136 | ||
| 88 | int sysdev_class_register(struct sysdev_class * cls) | 137 | int sysdev_class_register(struct sysdev_class * cls) |
| 89 | { | 138 | { |
