[PATCH] Driver Core: Allow sysdev_class have attributes
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@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
1740757e8f
commit
670dd90d81
@@ -80,10 +80,59 @@ void sysdev_remove_file(struct sys_device * s, struct sysdev_attribute * a)
|
|||||||
EXPORT_SYMBOL_GPL(sysdev_create_file);
|
EXPORT_SYMBOL_GPL(sysdev_create_file);
|
||||||
EXPORT_SYMBOL_GPL(sysdev_remove_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);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(sysdev_class_create_file);
|
||||||
|
|
||||||
|
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_remove_file);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* declare system_subsys
|
* 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)
|
int sysdev_class_register(struct sysdev_class * cls)
|
||||||
{
|
{
|
||||||
|
@@ -37,11 +37,27 @@ struct sysdev_class {
|
|||||||
struct kset kset;
|
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 int sysdev_class_register(struct sysdev_class *);
|
||||||
extern void sysdev_class_unregister(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.
|
* Auxillary system device drivers.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user