Driver core fixes for 2.6.22-rc4
PATCH 1/1 Driver core fixes for 2.6.22-rc4
Here are some driver core fixes for 2.6.22-rc4
They contain:
- documentation update
- email fixes for a deceased maintainer
- fixes for PHYSDEV for older class_devices that broke some userspace tools unnecessarily
- printk levels for kobjects.
- fix compiler warning that like 10 people have emailed me patches for.
All of these have been in the -mm tree for a number of weeks.
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6.git/
Patches will be sent as a follow-on to this message to lkml for people to see.
thanks,
greg k-h
Documentation/driver-model/platform.txt | 40 +++++++++++++ Documentation/firmware_class/README | 2 +- .../firmware_class/firmware_sample_driver.c | 2 +- .../firmware_sample_firmware_class.c | 4 +- drivers/base/class.c | 59 +++++++------------- drivers/base/core.c | 10 ++- drivers/base/dd.c | 13 ---- drivers/base/firmware_class.c | 4 +- lib/kobject.c | 10 ++-- 9 files changed, 78 insertions(+), 66 deletions(-)
---------------
David Brownell (1):
update Documentation/driver-model/platform.txt
Greg Kroah-Hartman (1):
kobject: use the proper printk level for kobject error
Kay Sievers (1):
Driver core: keep PHYSDEV for old struct class_device
Markus Rechberger (1):
firmware: remove orphaned Email
Stephen Hemminger (1):
Driver core: kill unused code
PATCH 1/5 update Documentation/driver-model/platform.txt
From: David Brownell <[email protected]>
Make note of the legacy "probe-the-hardware" drivers, and some APIs that are mostly unused except by such drivers. We probably can't escape having legacy drivers for a while (e.g. old ISA drivers), but we can at least discourage this style code for new drivers, and unless it's unavoidable.
--- Documentation/driver-model/platform.txt | 40 +++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-)
Documentation/driver-model/platform.txt +40 -0
@@ -96,6 +96,46 @@ System setup also associates those clocks with the device, so that that calls to clk_get(&pdev->dev, clock_name) return them as needed. +Legacy Drivers: Device Probing +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Some drivers are not fully converted to the driver model, because they take +on a non-driver role: the driver registers its platform device, rather than +leaving that for system infrastructure. Such drivers can't be hotplugged +or coldplugged, since those mechanisms require device creation to be in a +different system component than the driver. + +The only "good" reason for this is to handle older system designs which, like +original IBM PCs, rely on error-prone "probe-the-hardware" models for hardware +configuration. Newer systems have largely abandoned that model, in favor of +bus-level support for dynamic configuration (PCI, USB), or device tables +provided by the boot firmware (e.g. PNPACPI on x86). There are too many +conflicting options about what might be where, and even educated guesses by +an operating system will be wrong often enough to make trouble. + +This style of driver is discouraged. If you're updating such a driver, +please try to move the device enumeration to a more appropriate location, +outside the driver. This will usually be cleanup, since such drivers +tend to already have "normal" modes, such as ones using device nodes that +were created by PNP or by platform device setup. + +None the less, there are some APIs to support such legacy drivers. Avoid +using these calls except with such hotplug-deficient drivers. + + struct platform_device *platform_device_alloc( + char *name, unsigned id); + +You can use platform_device_alloc() to dynamically allocate a device, which +you will then initialize with resources and platform_device_register(). +A better solution is usually: + + struct platform_device *platform_device_register_simple( + char *name, unsigned id, + struct resource *res, unsigned nres); + +You can use platform_device_register_simple() as a one-step call to allocate +and register a device. + + Device Naming and Driver Binding ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The platform_device.dev.bus_id is the canonical name for the devices.
Signature · 1 line
1.5.2.1
PATCH 2/5 Driver core: keep PHYSDEV for old struct class_device
From: Kay Sievers <[email protected]>
Class-devices created by "struct class_device" are going to be replaced by "struct device". Keep the deprecated PHYSDEV* variables for the already "deprecated" struct class_device" devices.
--- drivers/base/class.c | 59 +++++++++++++++++-------------------------------- drivers/base/core.c | 10 +++++--- 2 files changed, 27 insertions(+), 42 deletions(-)
drivers/base/class.c +21 -38
@@ -369,36 +369,6 @@ char *make_class_name(const char *name, struct kobject *kobj)return class_name; } -static int deprecated_class_uevent (char **envp,int num_envp,int *cur_index, -char *buffer,int buffer_size, -int *cur_len, -struct class_device *class_dev) -{ -struct device *dev = class_dev->dev; -char *path; - -if (!dev) -return 0 ; - -/* add device, backing this class device (deprecated) */ - path =kobject_get_path (&dev->kobj,GFP_KERNEL ); - -add_uevent_var (envp, num_envp, cur_index, buffer, buffer_size, - cur_len,"PHYSDEVPATH=%s" , path); -kfree (path); - -if (dev->bus) -add_uevent_var (envp, num_envp, cur_index, - buffer, buffer_size, cur_len, -"PHYSDEVBUS=%s" , dev->bus->name); - -if (dev->driver) -add_uevent_var (envp, num_envp, cur_index, - buffer, buffer_size, cur_len, -"PHYSDEVDRIVER=%s" , dev->driver->name); -return 0 ; -} -static int make_deprecated_class_device_links (struct class_device *class_dev) {char *class_name;
@@ -430,11 +400,6 @@ static void remove_deprecated_class_device_links(struct class_device *class_dev) kfree(class_name); }#else -static inline int deprecated_class_uevent (char **envp,int num_envp, -int *cur_index,char *buffer, -int buffer_size,int *cur_len, -struct class_device *class_dev) -{return 0 ; }static inline int make_deprecated_class_device_links (struct class_device *cd) {return 0 ; }static void remove_deprecated_class_device_links (struct class_device *cd)
@@ -445,15 +410,13 @@ static int class_uevent(struct kset *kset, struct kobject *kobj, char **envp, int num_envp, char *buffer, int buffer_size) { struct class_device *class_dev = to_class_dev(kobj); +struct device *dev = class_dev->dev;int i =0 ;int length =0 ;int retval =0 ;pr_debug ("%s - name = %s\n" , __FUNCTION__, class_dev->class_id); -deprecated_class_uevent (envp, num_envp, &i, buffer, buffer_size, - &length, class_dev); -if (MAJOR (class_dev->devt)) { add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
@@ -464,6 +427,26 @@ static int class_uevent(struct kset *kset, struct kobject *kobj, char **envp, "MINOR=%u", MINOR(class_dev->devt)); } +if (dev) { +const char *path =kobject_get_path (&dev->kobj,GFP_KERNEL ); +if (path) { +add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"PHYSDEVPATH=%s" , path); +kfree (path); + } + +if (dev->bus) +add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"PHYSDEVBUS=%s" , dev->bus->name); + +if (dev->driver) +add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"PHYSDEVDRIVER=%s" , dev->driver->name); + } +/* terminate, set to next free slot, shrink available space */ envp[i] =NULL ; envp = &envp[i];
drivers/base/core.c +6 -4
@@ -180,10 +180,12 @@ static int dev_uevent(struct kset *kset, struct kobject *kobj, char **envp,const char *path; path =kobject_get_path (&parent->kobj,GFP_KERNEL ); -add_uevent_var (envp, num_envp, &i, - buffer, buffer_size, &length, -"PHYSDEVPATH=%s" , path); -kfree (path); +if (path) { +add_uevent_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"PHYSDEVPATH=%s" , path); +kfree (path); + } add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
Signature · 1 line
1.5.2.1
PATCH 3/5 Driver core: kill unused code
From: Stephen Hemminger <[email protected]>
CC drivers/base/dd.odrivers/base/dd.c:211: warning: =E2=80=98device_probe_drivers=E2=80=99 defi= ned but not used
Looks like the following is dead.
--- drivers/base/dd.c | 13 ------------- 1 files changed, 0 insertions(+), 13 deletions(-)
drivers/base/dd.c +0 -13
@@ -207,19 +207,6 @@ static int __device_attach(struct device_driver * drv, void * data)return driver_probe_device (drv, dev); } -static int device_probe_drivers (void *data) -{ -struct device *dev = data; -int ret =0 ; - -if (dev->bus) { -down (&dev->sem); - ret =bus_for_each_drv (dev->bus,NULL , dev, __device_attach); -up (&dev->sem); - } -return ret; -} -/** * device_attach - try to attach device to a driver. * @dev: device.
Signature · 1 line
1.5.2.1
PATCH 4/5 kobject: use the proper printk level for kobject error
Thanks to Jean Delvare <[email protected]> for pointing it out to me.
--- lib/kobject.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-)
lib/kobject.c +5 -5
@@ -202,14 +202,14 @@ int kobject_shadow_add(struct kobject * kobj, struct dentry *shadow_parent)/* be noisy on error issues */ if (error == -EEXIST ) -printk ("kobject_add failed for %s with -EEXIST, " -"don't try to register things with the " -"same name in the same directory.\n" , +printk (KERN_ERR "kobject_add failed for %s with " +"-EEXIST, don't try to register things with " +"the same name in the same directory.\n" ,kobject_name (kobj));else -printk ("kobject_add failed for %s (%d)\n" , +printk (KERN_ERR "kobject_add failed for %s (%d)\n" ,kobject_name (kobj), error); -dump_stack (); +dump_stack (); }return error;
Signature · 1 line
1.5.2.1
PATCH 5/5 firmware: remove orphaned Email
From: Markus Rechberger <[email protected]>
Manuel Estrada Sainz passed away on May 9th 2004, his email account got deactivated. He was in charge of the firmware_class code, and still got CC'ed in recent discussions about it.
--- Documentation/firmware_class/README | 2 +- .../firmware_class/firmware_sample_driver.c | 2 +- .../firmware_sample_firmware_class.c | 4 ++-- drivers/base/firmware_class.c | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-)
Documentation/firmware_class/README +1 -1
@@ -1,7 +1,7 @@ request_firmware() hotplug interface: ------------------------------------ - Copyright (C) 2003 Manuel Estrada Sainz <[email protected]> + Copyright (C) 2003 Manuel Estrada Sainz Why: ---
Documentation/firmware_class/firmware_sample_driver.c +1 -1
@@ -1,7 +1,7 @@/* * firmware_sample_driver.c - * -* Copyright (c) 2003 Manuel Estrada Sainz <[email protected]> +* Copyright (c) 2003 Manuel Estrada Sainz * * Sample code on how to use request_firmware() from drivers. *
Documentation/firmware_class/firmware_sample_firmware_class.c +2 -2
@@ -1,7 +1,7 @@/* * firmware_sample_firmware_class.c - * -* Copyright (c) 2003 Manuel Estrada Sainz <[email protected]> +* Copyright (c) 2003 Manuel Estrada Sainz * * NOTE: This is just a probe of concept, if you think that your driver would * be well served by this mechanism please contact me first.
@@ -19,7 +19,7 @@#include <linux/firmware.h> -MODULE_AUTHOR ("Manuel Estrada Sainz <[email protected]>" ); +MODULE_AUTHOR ("Manuel Estrada Sainz" );MODULE_DESCRIPTION ("Hackish sample for using firmware class directly" );MODULE_LICENSE ("GPL" );
drivers/base/firmware_class.c +2 -2
@@ -1,7 +1,7 @@/* * firmware_class.c - Multi purpose firmware loading support * -* Copyright (c) 2003 Manuel Estrada Sainz <[email protected]> +* Copyright (c) 2003 Manuel Estrada Sainz * * Please see Documentation/firmware_class/ for more information. *
@@ -23,7 +23,7 @@#define to_dev (obj) container_of(obj, struct device, kobj) -MODULE_AUTHOR ("Manuel Estrada Sainz <[email protected]>" ); +MODULE_AUTHOR ("Manuel Estrada Sainz" );MODULE_DESCRIPTION ("Multi purpose firmware loading support" );MODULE_LICENSE ("GPL" );
Signature · 1 line
1.5.2.1