diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-05-01 22:35:35 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-05-01 22:35:35 -0700 |
commit | 0122ac03f9cea48e9120a796d1a315bd833adc7e (patch) | |
tree | 92e3582a1ecb13a40eb08e1acf338dc40eb08ff1 /driver | |
parent | 2cdd2bd9854b9b39cc785426f77e7e71622a9a16 (diff) | |
download | patches-0122ac03f9cea48e9120a796d1a315bd833adc7e.tar.gz |
usb patches added
Diffstat (limited to 'driver')
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, + }; |