aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-05-01 22:35:35 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2006-05-01 22:35:35 -0700
commit0122ac03f9cea48e9120a796d1a315bd833adc7e (patch)
tree92e3582a1ecb13a40eb08e1acf338dc40eb08ff1 /driver
parent2cdd2bd9854b9b39cc785426f77e7e71622a9a16 (diff)
downloadpatches-0122ac03f9cea48e9120a796d1a315bd833adc7e.tar.gz
usb patches added
Diffstat (limited to 'driver')
-rw-r--r--driver/driver-core-class_device_add-needs-error-checks.patch147
-rw-r--r--driver/driver-core-config_debug_pm-covers-drivers-base-power-too.patch26
-rw-r--r--driver/platform_bus-learns-about-modalias.patch72
3 files changed, 245 insertions, 0 deletions
diff --git a/driver/driver-core-class_device_add-needs-error-checks.patch b/driver/driver-core-class_device_add-needs-error-checks.patch
new file mode 100644
index 0000000000000..c47dca2c825e7
--- /dev/null
+++ b/driver/driver-core-class_device_add-needs-error-checks.patch
@@ -0,0 +1,147 @@
+From shemminger@osdl.org Wed Apr 26 09:53:19 2006
+Date: Wed, 26 Apr 2006 09:53:14 -0700
+From: Stephen Hemminger <shemminger@osdl.org>
+To: Greg KH <greg@kroah.com>
+Subject: Driver core: class_device_add needs error checks
+Message-ID: <20060426095314.21fdd490@localhost.localdomain>
+
+class_device_add needs to check the return value of all the setup it
+does. It doesn't handle out of memory well. This is not complete, probably
+more needs to be done.
+
+Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/base/class.c | 72 ++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 54 insertions(+), 18 deletions(-)
+
+--- gregkh-2.6.orig/drivers/base/class.c
++++ gregkh-2.6/drivers/base/class.c
+@@ -535,18 +535,22 @@ int class_device_add(struct class_device
+ return -EINVAL;
+
+ if (!strlen(class_dev->class_id))
+- goto register_done;
++ goto out1;
+
+ parent_class = class_get(class_dev->class);
+ if (!parent_class)
+- goto register_done;
++ goto out1;
++
+ parent_class_dev = class_device_get(class_dev->parent);
+
+ pr_debug("CLASS: registering class device: ID = '%s'\n",
+ class_dev->class_id);
+
+ /* first, register with generic layer. */
+- kobject_set_name(&class_dev->kobj, "%s", class_dev->class_id);
++ error = kobject_set_name(&class_dev->kobj, "%s", class_dev->class_id);
++ if (error)
++ goto out2;
++
+ if (parent_class_dev)
+ class_dev->kobj.parent = &parent_class_dev->kobj;
+ else
+@@ -554,41 +558,56 @@ int class_device_add(struct class_device
+
+ error = kobject_add(&class_dev->kobj);
+ if (error)
+- goto register_done;
++ goto out2;
+
+ /* add the needed attributes to this device */
+ class_dev->uevent_attr.attr.name = "uevent";
+ class_dev->uevent_attr.attr.mode = S_IWUSR;
+ class_dev->uevent_attr.attr.owner = parent_class->owner;
+ class_dev->uevent_attr.store = store_uevent;
+- class_device_create_file(class_dev, &class_dev->uevent_attr);
++ error = class_device_create_file(class_dev, &class_dev->uevent_attr);
++ if (error)
++ goto out3;
+
+ if (MAJOR(class_dev->devt)) {
+ struct class_device_attribute *attr;
+ attr = kzalloc(sizeof(*attr), GFP_KERNEL);
+ if (!attr) {
+ error = -ENOMEM;
+- kobject_del(&class_dev->kobj);
+- goto register_done;
++ goto out4;
+ }
+ attr->attr.name = "dev";
+ attr->attr.mode = S_IRUGO;
+ attr->attr.owner = parent_class->owner;
+ attr->show = show_dev;
+- class_device_create_file(class_dev, attr);
++ error = class_device_create_file(class_dev, attr);
++ if (error) {
++ kfree(attr);
++ goto out4;
++ }
++
+ class_dev->devt_attr = attr;
+ }
+
+- class_device_add_attrs(class_dev);
++ error = class_device_add_attrs(class_dev);
++ if (error)
++ goto out5;
++
+ if (class_dev->dev) {
+ class_name = make_class_name(class_dev);
+- sysfs_create_link(&class_dev->kobj,
+- &class_dev->dev->kobj, "device");
+- sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj,
+- class_name);
++ error = sysfs_create_link(&class_dev->kobj,
++ &class_dev->dev->kobj, "device");
++ if (error)
++ goto out6;
++ error = sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj,
++ class_name);
++ if (error)
++ goto out7;
+ }
+
+- class_device_add_groups(class_dev);
++ error = class_device_add_groups(class_dev);
++ if (error)
++ goto out8;
+
+ kobject_uevent(&class_dev->kobj, KOBJ_ADD);
+
+@@ -601,11 +620,28 @@ int class_device_add(struct class_device
+ }
+ up(&parent_class->sem);
+
+- register_done:
+- if (error) {
+- class_put(parent_class);
++ return 0;
++
++ out8:
++ if (class_dev->dev)
++ sysfs_remove_link(&class_dev->kobj, class_name);
++ out7:
++ if (class_dev->dev)
++ sysfs_remove_link(&class_dev->kobj, "device");
++ out6:
++ class_device_remove_attrs(class_dev);
++ out5:
++ if (class_dev->devt_attr)
++ class_device_remove_file(class_dev, class_dev->devt_attr);
++ out4:
++ class_device_remove_file(class_dev, &class_dev->uevent_attr);
++ out3:
++ kobject_del(&class_dev->kobj);
++ out2:
++ if(parent_class_dev)
+ class_device_put(parent_class_dev);
+- }
++ class_put(parent_class);
++ out1:
+ class_device_put(class_dev);
+ kfree(class_name);
+ return error;
diff --git a/driver/driver-core-config_debug_pm-covers-drivers-base-power-too.patch b/driver/driver-core-config_debug_pm-covers-drivers-base-power-too.patch
new file mode 100644
index 0000000000000..87e4dc1681512
--- /dev/null
+++ b/driver/driver-core-config_debug_pm-covers-drivers-base-power-too.patch
@@ -0,0 +1,26 @@
+From david-b@pacbell.net Mon May 1 14:05:11 2006
+From: David Brownell <david-b@pacbell.net>
+To: Greg KH <greg@kroah.com>
+Subject: Driver Core: CONFIG_DEBUG_PM covers drivers/base/power too
+Date: Mon, 1 May 2006 13:58:33 -0700
+Message-Id: <200605011358.33927.david-b@pacbell.net>
+
+The drivers/base/power PM debug messages should appear when
+either PM or driver model debug are enabled.
+
+Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/base/power/Makefile | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- gregkh-2.6.orig/drivers/base/power/Makefile
++++ gregkh-2.6/drivers/base/power/Makefile
+@@ -4,3 +4,6 @@ obj-$(CONFIG_PM) += main.o suspend.o res
+ ifeq ($(CONFIG_DEBUG_DRIVER),y)
+ EXTRA_CFLAGS += -DDEBUG
+ endif
++ifeq ($(CONFIG_PM_DEBUG),y)
++EXTRA_CFLAGS += -DDEBUG
++endif
diff --git a/driver/platform_bus-learns-about-modalias.patch b/driver/platform_bus-learns-about-modalias.patch
new file mode 100644
index 0000000000000..d1ca1c07041ab
--- /dev/null
+++ b/driver/platform_bus-learns-about-modalias.patch
@@ -0,0 +1,72 @@
+From david-b@pacbell.net Mon May 1 14:05:05 2006
+From: David Brownell <david-b@pacbell.net>
+To: Greg KH <greg@kroah.com>
+Subject: platform_bus learns about modalias
+Date: Mon, 1 May 2006 11:16:01 -0700
+Cc: Russell King <rmk@arm.linux.org.uk>,
+ Linux Kernel list <linux-kernel@vger.kernel.org>
+Message-Id: <200605011116.02250.david-b@pacbell.net>
+
+This patch adds modalias support to platform devices, for simpler
+hotplug/coldplug driven driver setup.
+
+Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/base/platform.c | 36 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 36 insertions(+)
+
+--- gregkh-2.6.orig/drivers/base/platform.c
++++ gregkh-2.6/drivers/base/platform.c
+@@ -452,6 +452,40 @@ void platform_driver_unregister(struct p
+ EXPORT_SYMBOL_GPL(platform_driver_unregister);
+
+
++/* modalias support enables more hands-off userspace setup:
++ * (a) environment variable lets new-style hotplug events work once system is
++ * fully running: "modprobe $MODALIAS"
++ * (b) sysfs attribute lets new-style coldplug recover from hotplug events
++ * mishandled before system is fully running: "modprobe $(cat modalias)"
++ */
++static ssize_t
++modalias_show(struct device *dev, struct device_attribute *a, char *buf)
++{
++ struct platform_device *pdev = to_platform_device(dev);
++ unsigned len = strlen(pdev->name);
++
++ len = min(len, (size_t)(PAGE_SIZE - 1));
++ memcpy(buf, pdev->name, len);
++ buf[PAGE_SIZE - 1] = 0;
++ return len;
++}
++
++static struct device_attribute platform_dev_attrs[] = {
++ __ATTR_RO(modalias),
++ __ATTR_NULL,
++};
++
++static int platform_uevent(struct device *dev, char **envp, int num_envp,
++ char *buffer, int buffer_size)
++{
++ struct platform_device *pdev = to_platform_device(dev);
++
++ envp[0] = buffer;
++ snprintf(buffer, buffer_size, "MODALIAS=%s", pdev->name);
++ return 0;
++}
++
++
+ /**
+ * platform_match - bind platform device to platform driver.
+ * @dev: device.
+@@ -496,7 +530,9 @@ static int platform_resume(struct device
+
+ struct bus_type platform_bus_type = {
+ .name = "platform",
++ .dev_attrs = platform_dev_attrs,
+ .match = platform_match,
++ .uevent = platform_uevent,
+ .suspend = platform_suspend,
+ .resume = platform_resume,
+ };