summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@home.transmeta.com>2003-05-10 07:58:50 -0700
committerLinus Torvalds <torvalds@home.transmeta.com>2003-05-10 07:58:50 -0700
commit0774aa2d456669415e04d8d56e73ae5f1939509c (patch)
treec278ca7efbadf674b2fb02ad5001aed636157675
parent04c8dca9d426dc7d6df5448a74fc71640615a924 (diff)
parent3e3122a7734939c0f1788b2bcc68d61a33fa6a73 (diff)
Merge master.kernel.org:/home/gregkh/BK/i2c-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
-rw-r--r--drivers/base/class.c18
-rw-r--r--include/linux/cpu.h1
-rw-r--r--kernel/cpufreq.c2
3 files changed, 20 insertions, 1 deletions
diff --git a/drivers/base/class.c b/drivers/base/class.c
index eda427f96134..4e43e97a8a70 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -133,6 +133,21 @@ static void class_device_dev_unlink(struct class_device * class_dev)
sysfs_remove_link(&class_dev->kobj, "device");
}
+static int class_device_driver_link(struct class_device * class_dev)
+{
+ if ((class_dev->dev) && (class_dev->dev->driver))
+ return sysfs_create_link(&class_dev->kobj,
+ &class_dev->dev->driver->kobj, "driver");
+ return 0;
+}
+
+static void class_device_driver_unlink(struct class_device * class_dev)
+{
+ if ((class_dev->dev) && (class_dev->dev->driver))
+ sysfs_remove_link(&class_dev->kobj, "driver");
+}
+
+
#define to_class_dev(obj) container_of(obj,struct class_device,kobj)
#define to_class_dev_attr(_attr) container_of(_attr,struct class_device_attribute,attr)
@@ -244,7 +259,6 @@ int class_device_add(struct class_device *class_dev)
/* first, register with generic layer. */
strncpy(class_dev->kobj.name, class_dev->class_id, KOBJ_NAME_LEN);
- kobj_set_kset_s(class_dev, class_subsys);
kobj_set_kset_s(class_dev, class_obj_subsys);
if (parent)
class_dev->kobj.parent = &parent->subsys.kset.kobj;
@@ -265,6 +279,7 @@ int class_device_add(struct class_device *class_dev)
}
class_device_dev_link(class_dev);
+ class_device_driver_link(class_dev);
register_done:
if (error && parent)
@@ -298,6 +313,7 @@ void class_device_del(struct class_device *class_dev)
if (class_dev->dev) {
class_device_dev_unlink(class_dev);
+ class_device_driver_unlink(class_dev);
put_device(class_dev->dev);
}
diff --git a/include/linux/cpu.h b/include/linux/cpu.h
index 0cea32df8325..e9e7ebfd63d4 100644
--- a/include/linux/cpu.h
+++ b/include/linux/cpu.h
@@ -29,6 +29,7 @@ struct cpu {
};
extern int register_cpu(struct cpu *, int, struct node *);
+extern struct class cpu_class;
/* Stop CPUs going up and down. */
extern struct semaphore cpucontrol;
diff --git a/kernel/cpufreq.c b/kernel/cpufreq.c
index f548aead6a9d..913e6b0f56fb 100644
--- a/kernel/cpufreq.c
+++ b/kernel/cpufreq.c
@@ -22,6 +22,7 @@
#include <linux/spinlock.h>
#include <linux/device.h>
#include <linux/slab.h>
+#include <linux/cpu.h>
/**
* The "cpufreq driver" - the arch- or hardware-dependend low
@@ -115,6 +116,7 @@ static void cpufreq_remove_dev (struct class_device * dev);
extern struct device_class cpu_devclass;
static struct class_interface cpufreq_interface = {
+ .class = &cpu_class,
.add = &cpufreq_add_dev,
.remove = &cpufreq_remove_dev,
};