[PATCH 9/10] Allow sysdev_calss have attributes
From: Shaohua Li
Date: Mon May 08 2006 - 01:49:58 EST
allow sysdev_class adding attribute. Next patch will use the new API to
add an attribute under /sys/device/system/cpu/.
Signed-off-by: Shaohua Li <shaohua.li@xxxxxxxxx>
---
linux-2.6.17-rc3-root/drivers/base/sys.c | 53 ++++++++++++++++++++++++++-
linux-2.6.17-rc3-root/include/linux/sysdev.h | 18 ++++++++-
2 files changed, 69 insertions(+), 2 deletions(-)
diff -puN drivers/base/sys.c~sysdev-class-attribute drivers/base/sys.c
--- linux-2.6.17-rc3/drivers/base/sys.c~sysdev-class-attribute 2006-05-07 07:46:51.000000000 +0800
+++ linux-2.6.17-rc3-root/drivers/base/sys.c 2006-05-07 07:46:51.000000000 +0800
@@ -80,10 +80,61 @@ void sysdev_remove_file(struct sys_devic
EXPORT_SYMBOL_GPL(sysdev_create_file);
EXPORT_SYMBOL_GPL(sysdev_remove_file);
+#define to_sysdev_class(k) container_of(k, struct sysdev_class, kset.kobj)
+#define to_sysdev_class_attr(a) container_of(a, \
+ struct sysdev_class_attribute, attr)
+
+static ssize_t
+sysdev_class_show(struct kobject * kobj, struct attribute * attr, char * buffer)
+{
+ struct sysdev_class * class = to_sysdev_class(kobj);
+ struct sysdev_class_attribute *class_attr = to_sysdev_class_attr(attr);
+
+ if (class_attr->show)
+ return class_attr->show(class, buffer);
+ return -EIO;
+}
+
+static ssize_t
+sysdev_class_store(struct kobject * kobj, struct attribute * attr,
+ const char * buffer, size_t count)
+{
+ struct sysdev_class * class = to_sysdev_class(kobj);
+ struct sysdev_class_attribute * class_attr = to_sysdev_class_attr(attr);
+
+ if (class_attr->store)
+ return class_attr->store(class, buffer, count);
+ return -EIO;
+}
+
+static struct sysfs_ops sysfs_class_ops = {
+ .show = sysdev_class_show,
+ .store = sysdev_class_store,
+};
+
+static struct kobj_type ktype_sysdev_class = {
+ .sysfs_ops = &sysfs_class_ops,
+};
+
+int sysdev_class_create_file(struct sysdev_class * c,
+ struct sysdev_class_attribute * a)
+{
+ return sysfs_create_file(&c->kset.kobj, &a->attr);
+}
+
+void sysdev_class_remove_file(struct sysdev_class * c,
+ struct sysdev_class_attribute * a)
+{
+ sysfs_remove_file(&c->kset.kobj, &a->attr);
+}
+
+EXPORT_SYMBOL_GPL(sysdev_class_create_file);
+EXPORT_SYMBOL_GPL(sysdev_class_remove_file);
+
/*
* declare system_subsys
*/
-static decl_subsys(system, &ktype_sysdev, NULL);
+static decl_subsys(system, &ktype_sysdev_class, NULL);
int sysdev_class_register(struct sysdev_class * cls)
{
diff -puN include/linux/sysdev.h~sysdev-class-attribute include/linux/sysdev.h
--- linux-2.6.17-rc3/include/linux/sysdev.h~sysdev-class-attribute 2006-05-07 07:46:51.000000000 +0800
+++ linux-2.6.17-rc3-root/include/linux/sysdev.h 2006-05-07 07:46:51.000000000 +0800
@@ -37,11 +37,27 @@ struct sysdev_class {
struct kset kset;
};
+struct sysdev_class_attribute {
+ struct attribute attr;
+ ssize_t (*show)(struct sysdev_class *, char *);
+ ssize_t (*store)(struct sysdev_class *, const char *, size_t);
+};
+
+#define SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) \
+struct sysdev_class_attribute attr_##_name = { \
+ .attr = {.name = __stringify(_name), .mode = _mode }, \
+ .show = _show, \
+ .store = _store, \
+};
+
extern int sysdev_class_register(struct sysdev_class *);
extern void sysdev_class_unregister(struct sysdev_class *);
-
+extern int sysdev_class_create_file(struct sysdev_class *,
+ struct sysdev_class_attribute *);
+extern void sysdev_class_remove_file(struct sysdev_class *,
+ struct sysdev_class_attribute *);
/**
* Auxillary system device drivers.
*/
_
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/