diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-12 18:49:37 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-12 18:49:37 -0400 |
| commit | efefc6eb38d43b8e5daef482f575d767b002004e (patch) | |
| tree | 8a3933db1f8721f9bcc9912c800dc8406f4bdf94 /drivers | |
| parent | 117494a1b65183f0e3fcc817b07944bc5c465050 (diff) | |
| parent | cd59abfcc441b2abb4cf2cd62c1eb0f02a60e8dd (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6: (75 commits)
PM: merge device power-management source files
sysfs: add copyrights
kobject: update the copyrights
kset: add some kerneldoc to help describe what these strange things are
Driver core: rename ktype_edd and ktype_efivar
Driver core: rename ktype_driver
Driver core: rename ktype_device
Driver core: rename ktype_class
driver core: remove subsystem_init()
sysfs: move sysfs file poll implementation to sysfs_open_dirent
sysfs: implement sysfs_open_dirent
sysfs: move sysfs_dirent->s_children into sysfs_dirent->s_dir
sysfs: make sysfs_root a regular directory dirent
sysfs: open code sysfs_attach_dentry()
sysfs: make s_elem an anonymous union
sysfs: make bin attr open get active reference of parent too
sysfs: kill unnecessary NULL pointer check in sysfs_release()
sysfs: kill unnecessary sysfs_get() in open paths
sysfs: reposition sysfs_dirent->s_mode.
sysfs: kill sysfs_update_file()
...
Diffstat (limited to 'drivers')
73 files changed, 743 insertions, 1121 deletions
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index feab124d8e05..cbfc81579c9a 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
| @@ -194,7 +194,7 @@ int acpi_bus_set_power(acpi_handle handle, int state) | |||
| 194 | 194 | ||
| 195 | if (!device->flags.power_manageable) { | 195 | if (!device->flags.power_manageable) { |
| 196 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device `[%s]' is not power manageable\n", | 196 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device `[%s]' is not power manageable\n", |
| 197 | device->dev.kobj.name)); | 197 | kobject_name(&device->dev.kobj))); |
| 198 | return -ENODEV; | 198 | return -ENODEV; |
| 199 | } | 199 | } |
| 200 | /* | 200 | /* |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 64620d668742..5b4d462117cf 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -319,16 +319,18 @@ static int acpi_bus_match(struct device *dev, struct device_driver *drv) | |||
| 319 | return !acpi_match_device_ids(acpi_dev, acpi_drv->ids); | 319 | return !acpi_match_device_ids(acpi_dev, acpi_drv->ids); |
| 320 | } | 320 | } |
| 321 | 321 | ||
| 322 | static int acpi_device_uevent(struct device *dev, char **envp, int num_envp, | 322 | static int acpi_device_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 323 | char *buffer, int buffer_size) | ||
| 324 | { | 323 | { |
| 325 | struct acpi_device *acpi_dev = to_acpi_device(dev); | 324 | struct acpi_device *acpi_dev = to_acpi_device(dev); |
| 325 | int len; | ||
| 326 | 326 | ||
| 327 | strcpy(buffer, "MODALIAS="); | 327 | if (add_uevent_var(env, "MODALIAS=")) |
| 328 | if (create_modalias(acpi_dev, buffer + 9, buffer_size - 9) > 0) { | 328 | return -ENOMEM; |
| 329 | envp[0] = buffer; | 329 | len = create_modalias(acpi_dev, &env->buf[env->buflen - 1], |
| 330 | envp[1] = NULL; | 330 | sizeof(env->buf) - env->buflen); |
| 331 | } | 331 | if (len >= (sizeof(env->buf) - env->buflen)) |
| 332 | return -ENOMEM; | ||
| 333 | env->buflen += len; | ||
| 332 | return 0; | 334 | return 0; |
| 333 | } | 335 | } |
| 334 | 336 | ||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index d05891f16282..b8a2095cb5ee 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -316,7 +316,7 @@ static int acpi_video_output_get(struct output_device *od) | |||
| 316 | { | 316 | { |
| 317 | unsigned long state; | 317 | unsigned long state; |
| 318 | struct acpi_video_device *vd = | 318 | struct acpi_video_device *vd = |
| 319 | (struct acpi_video_device *)class_get_devdata(&od->class_dev); | 319 | (struct acpi_video_device *)dev_get_drvdata(&od->dev); |
| 320 | acpi_video_device_get_state(vd, &state); | 320 | acpi_video_device_get_state(vd, &state); |
| 321 | return (int)state; | 321 | return (int)state; |
| 322 | } | 322 | } |
| @@ -325,7 +325,7 @@ static int acpi_video_output_set(struct output_device *od) | |||
| 325 | { | 325 | { |
| 326 | unsigned long state = od->request_state; | 326 | unsigned long state = od->request_state; |
| 327 | struct acpi_video_device *vd= | 327 | struct acpi_video_device *vd= |
| 328 | (struct acpi_video_device *)class_get_devdata(&od->class_dev); | 328 | (struct acpi_video_device *)dev_get_drvdata(&od->dev); |
| 329 | return acpi_video_device_set_state(vd, state); | 329 | return acpi_video_device_set_state(vd, state); |
| 330 | } | 330 | } |
| 331 | 331 | ||
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index 268e301775fc..6b94fb7be5f2 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c | |||
| @@ -44,15 +44,12 @@ static int amba_match(struct device *dev, struct device_driver *drv) | |||
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | #ifdef CONFIG_HOTPLUG | 46 | #ifdef CONFIG_HOTPLUG |
| 47 | static int amba_uevent(struct device *dev, char **envp, int nr_env, char *buf, int bufsz) | 47 | static int amba_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 48 | { | 48 | { |
| 49 | struct amba_device *pcdev = to_amba_device(dev); | 49 | struct amba_device *pcdev = to_amba_device(dev); |
| 50 | int retval = 0, i = 0, len = 0; | 50 | int retval = 0; |
| 51 | 51 | ||
| 52 | retval = add_uevent_var(envp, nr_env, &i, | 52 | retval = add_uevent_var(env, "AMBA_ID=%08x", pcdev->periphid); |
| 53 | buf, bufsz, &len, | ||
| 54 | "AMBA_ID=%08x", pcdev->periphid); | ||
| 55 | envp[i] = NULL; | ||
| 56 | return retval; | 53 | return retval; |
| 57 | } | 54 | } |
| 58 | #else | 55 | #else |
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig index 5d6312e33490..d7da109c24fd 100644 --- a/drivers/base/Kconfig +++ b/drivers/base/Kconfig | |||
| @@ -1,5 +1,13 @@ | |||
| 1 | menu "Generic Driver Options" | 1 | menu "Generic Driver Options" |
| 2 | 2 | ||
| 3 | config UEVENT_HELPER_PATH | ||
| 4 | string "path to uevent helper" | ||
| 5 | depends on HOTPLUG | ||
| 6 | default "/sbin/hotplug" | ||
| 7 | help | ||
| 8 | Path to uevent helper program forked by the kernel for | ||
| 9 | every uevent. | ||
| 10 | |||
| 3 | config STANDALONE | 11 | config STANDALONE |
| 4 | bool "Select only drivers that don't need compile-time external firmware" if EXPERIMENTAL | 12 | bool "Select only drivers that don't need compile-time external firmware" if EXPERIMENTAL |
| 5 | default y | 13 | default y |
diff --git a/drivers/base/base.h b/drivers/base/base.h index 47eb02d9f1af..10b2fb6c9ce6 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h | |||
| @@ -18,8 +18,6 @@ extern int attribute_container_init(void); | |||
| 18 | extern int bus_add_device(struct device * dev); | 18 | extern int bus_add_device(struct device * dev); |
| 19 | extern void bus_attach_device(struct device * dev); | 19 | extern void bus_attach_device(struct device * dev); |
| 20 | extern void bus_remove_device(struct device * dev); | 20 | extern void bus_remove_device(struct device * dev); |
| 21 | extern struct bus_type *get_bus(struct bus_type * bus); | ||
| 22 | extern void put_bus(struct bus_type * bus); | ||
| 23 | 21 | ||
| 24 | extern int bus_add_driver(struct device_driver *); | 22 | extern int bus_add_driver(struct device_driver *); |
| 25 | extern void bus_remove_driver(struct device_driver *); | 23 | extern void bus_remove_driver(struct device_driver *); |
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 61c67526a656..9a19b071c573 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c | |||
| @@ -30,6 +30,17 @@ | |||
| 30 | static int __must_check bus_rescan_devices_helper(struct device *dev, | 30 | static int __must_check bus_rescan_devices_helper(struct device *dev, |
| 31 | void *data); | 31 | void *data); |
| 32 | 32 | ||
| 33 | static struct bus_type *bus_get(struct bus_type *bus) | ||
| 34 | { | ||
| 35 | return bus ? container_of(kset_get(&bus->subsys), | ||
| 36 | struct bus_type, subsys) : NULL; | ||
| 37 | } | ||
| 38 | |||
| 39 | static void bus_put(struct bus_type *bus) | ||
| 40 | { | ||
| 41 | kset_put(&bus->subsys); | ||
| 42 | } | ||
| 43 | |||
| 33 | static ssize_t | 44 | static ssize_t |
| 34 | drv_attr_show(struct kobject * kobj, struct attribute * attr, char * buf) | 45 | drv_attr_show(struct kobject * kobj, struct attribute * attr, char * buf) |
| 35 | { | 46 | { |
| @@ -78,7 +89,7 @@ static void driver_release(struct kobject * kobj) | |||
| 78 | */ | 89 | */ |
| 79 | } | 90 | } |
| 80 | 91 | ||
| 81 | static struct kobj_type ktype_driver = { | 92 | static struct kobj_type driver_ktype = { |
| 82 | .sysfs_ops = &driver_sysfs_ops, | 93 | .sysfs_ops = &driver_sysfs_ops, |
| 83 | .release = driver_release, | 94 | .release = driver_release, |
| 84 | }; | 95 | }; |
| @@ -122,9 +133,9 @@ static struct sysfs_ops bus_sysfs_ops = { | |||
| 122 | int bus_create_file(struct bus_type * bus, struct bus_attribute * attr) | 133 | int bus_create_file(struct bus_type * bus, struct bus_attribute * attr) |
| 123 | { | 134 | { |
| 124 | int error; | 135 | int error; |
| 125 | if (get_bus(bus)) { | 136 | if (bus_get(bus)) { |
| 126 | error = sysfs_create_file(&bus->subsys.kobj, &attr->attr); | 137 | error = sysfs_create_file(&bus->subsys.kobj, &attr->attr); |
| 127 | put_bus(bus); | 138 | bus_put(bus); |
| 128 | } else | 139 | } else |
| 129 | error = -EINVAL; | 140 | error = -EINVAL; |
| 130 | return error; | 141 | return error; |
| @@ -132,9 +143,9 @@ int bus_create_file(struct bus_type * bus, struct bus_attribute * attr) | |||
| 132 | 143 | ||
| 133 | void bus_remove_file(struct bus_type * bus, struct bus_attribute * attr) | 144 | void bus_remove_file(struct bus_type * bus, struct bus_attribute * attr) |
| 134 | { | 145 | { |
| 135 | if (get_bus(bus)) { | 146 | if (bus_get(bus)) { |
| 136 | sysfs_remove_file(&bus->subsys.kobj, &attr->attr); | 147 | sysfs_remove_file(&bus->subsys.kobj, &attr->attr); |
| 137 | put_bus(bus); | 148 | bus_put(bus); |
| 138 | } | 149 | } |
| 139 | } | 150 | } |
| 140 | 151 | ||
| @@ -172,7 +183,7 @@ static int driver_helper(struct device *dev, void *data) | |||
| 172 | static ssize_t driver_unbind(struct device_driver *drv, | 183 | static ssize_t driver_unbind(struct device_driver *drv, |
| 173 | const char *buf, size_t count) | 184 | const char *buf, size_t count) |
| 174 | { | 185 | { |
| 175 | struct bus_type *bus = get_bus(drv->bus); | 186 | struct bus_type *bus = bus_get(drv->bus); |
| 176 | struct device *dev; | 187 | struct device *dev; |
| 177 | int err = -ENODEV; | 188 | int err = -ENODEV; |
| 178 | 189 | ||
| @@ -186,7 +197,7 @@ static ssize_t driver_unbind(struct device_driver *drv, | |||
| 186 | err = count; | 197 | err = count; |
| 187 | } | 198 | } |
| 188 | put_device(dev); | 199 | put_device(dev); |
| 189 | put_bus(bus); | 200 | bus_put(bus); |
| 190 | return err; | 201 | return err; |
| 191 | } | 202 | } |
| 192 | static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind); | 203 | static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind); |
| @@ -199,7 +210,7 @@ static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind); | |||
| 199 | static ssize_t driver_bind(struct device_driver *drv, | 210 | static ssize_t driver_bind(struct device_driver *drv, |
| 200 | const char *buf, size_t count) | 211 | const char *buf, size_t count) |
| 201 | { | 212 | { |
| 202 | struct bus_type *bus = get_bus(drv->bus); | 213 | struct bus_type *bus = bus_get(drv->bus); |
| 203 | struct device *dev; | 214 | struct device *dev; |
| 204 | int err = -ENODEV; | 215 | int err = -ENODEV; |
| 205 | 216 | ||
| @@ -219,7 +230,7 @@ static ssize_t driver_bind(struct device_driver *drv, | |||
| 219 | err = -ENODEV; | 230 | err = -ENODEV; |
| 220 | } | 231 | } |
| 221 | put_device(dev); | 232 | put_device(dev); |
| 222 | put_bus(bus); | 233 | bus_put(bus); |
| 223 | return err; | 234 | return err; |
| 224 | } | 235 | } |
| 225 | static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind); | 236 | static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind); |
| @@ -430,7 +441,7 @@ static inline void remove_deprecated_bus_links(struct device *dev) { } | |||
| 430 | */ | 441 | */ |
| 431 | int bus_add_device(struct device * dev) | 442 | int bus_add_device(struct device * dev) |
| 432 | { | 443 | { |
| 433 | struct bus_type * bus = get_bus(dev->bus); | 444 | struct bus_type * bus = bus_get(dev->bus); |
| 434 | int error = 0; | 445 | int error = 0; |
| 435 | 446 | ||
| 436 | if (bus) { | 447 | if (bus) { |
| @@ -459,7 +470,7 @@ out_subsys: | |||
| 459 | out_id: | 470 | out_id: |
| 460 | device_remove_attrs(bus, dev); | 471 | device_remove_attrs(bus, dev); |
| 461 | out_put: | 472 | out_put: |
| 462 | put_bus(dev->bus); | 473 | bus_put(dev->bus); |
| 463 | return error; | 474 | return error; |
| 464 | } | 475 | } |
| 465 | 476 | ||
| @@ -509,7 +520,7 @@ void bus_remove_device(struct device * dev) | |||
| 509 | } | 520 | } |
| 510 | pr_debug("bus %s: remove device %s\n", dev->bus->name, dev->bus_id); | 521 | pr_debug("bus %s: remove device %s\n", dev->bus->name, dev->bus_id); |
| 511 | device_release_driver(dev); | 522 | device_release_driver(dev); |
| 512 | put_bus(dev->bus); | 523 | bus_put(dev->bus); |
| 513 | } | 524 | } |
| 514 | } | 525 | } |
| 515 | 526 | ||
| @@ -568,32 +579,29 @@ static void remove_bind_files(struct device_driver *drv) | |||
| 568 | driver_remove_file(drv, &driver_attr_unbind); | 579 | driver_remove_file(drv, &driver_attr_unbind); |
| 569 | } | 580 | } |
| 570 | 581 | ||
| 582 | static BUS_ATTR(drivers_probe, S_IWUSR, NULL, store_drivers_probe); | ||
| 583 | static BUS_ATTR(drivers_autoprobe, S_IWUSR | S_IRUGO, | ||
| 584 | show_drivers_autoprobe, store_drivers_autoprobe); | ||
| 585 | |||
| 571 | static int add_probe_files(struct bus_type *bus) | 586 | static int add_probe_files(struct bus_type *bus) |
| 572 | { | 587 | { |
| 573 | int retval; | 588 | int retval; |
| 574 | 589 | ||
| 575 | bus->drivers_probe_attr.attr.name = "drivers_probe"; | 590 | retval = bus_create_file(bus, &bus_attr_drivers_probe); |
| 576 | bus->drivers_probe_attr.attr.mode = S_IWUSR; | ||
| 577 | bus->drivers_probe_attr.store = store_drivers_probe; | ||
| 578 | retval = bus_create_file(bus, &bus->drivers_probe_attr); | ||
| 579 | if (retval) | 591 | if (retval) |
| 580 | goto out; | 592 | goto out; |
| 581 | 593 | ||
| 582 | bus->drivers_autoprobe_attr.attr.name = "drivers_autoprobe"; | 594 | retval = bus_create_file(bus, &bus_attr_drivers_autoprobe); |
| 583 | bus->drivers_autoprobe_attr.attr.mode = S_IWUSR | S_IRUGO; | ||
| 584 | bus->drivers_autoprobe_attr.show = show_drivers_autoprobe; | ||
| 585 | bus->drivers_autoprobe_attr.store = store_drivers_autoprobe; | ||
| 586 | retval = bus_create_file(bus, &bus->drivers_autoprobe_attr); | ||
| 587 | if (retval) | 595 | if (retval) |
| 588 | bus_remove_file(bus, &bus->drivers_probe_attr); | 596 | bus_remove_file(bus, &bus_attr_drivers_probe); |
| 589 | out: | 597 | out: |
| 590 | return retval; | 598 | return retval; |
| 591 | } | 599 | } |
| 592 | 600 | ||
| 593 | static void remove_probe_files(struct bus_type *bus) | 601 | static void remove_probe_files(struct bus_type *bus) |
| 594 | { | 602 | { |
| 595 | bus_remove_file(bus, &bus->drivers_autoprobe_attr); | 603 | bus_remove_file(bus, &bus_attr_drivers_autoprobe); |
| 596 | bus_remove_file(bus, &bus->drivers_probe_attr); | 604 | bus_remove_file(bus, &bus_attr_drivers_probe); |
| 597 | } | 605 | } |
| 598 | #else | 606 | #else |
| 599 | static inline int add_bind_files(struct device_driver *drv) { return 0; } | 607 | static inline int add_bind_files(struct device_driver *drv) { return 0; } |
| @@ -602,6 +610,17 @@ static inline int add_probe_files(struct bus_type *bus) { return 0; } | |||
| 602 | static inline void remove_probe_files(struct bus_type *bus) {} | 610 | static inline void remove_probe_files(struct bus_type *bus) {} |
| 603 | #endif | 611 | #endif |
| 604 | 612 | ||
| 613 | static ssize_t driver_uevent_store(struct device_driver *drv, | ||
| 614 | const char *buf, size_t count) | ||
| 615 | { | ||
| 616 | enum kobject_action action; | ||
| 617 | |||
| 618 | if (kobject_action_type(buf, count, &action) == 0) | ||
| 619 | kobject_uevent(&drv->kobj, action); | ||
| 620 | return count; | ||
| 621 | } | ||
| 622 | static DRIVER_ATTR(uevent, S_IWUSR, NULL, driver_uevent_store); | ||
| 623 | |||
| 605 | /** | 624 | /** |
| 606 | * bus_add_driver - Add a driver to the bus. | 625 | * bus_add_driver - Add a driver to the bus. |
| 607 | * @drv: driver. | 626 | * @drv: driver. |
| @@ -609,7 +628,7 @@ static inline void remove_probe_files(struct bus_type *bus) {} | |||
| 609 | */ | 628 | */ |
| 610 | int bus_add_driver(struct device_driver *drv) | 629 | int bus_add_driver(struct device_driver *drv) |
| 611 | { | 630 | { |
| 612 | struct bus_type * bus = get_bus(drv->bus); | 631 | struct bus_type * bus = bus_get(drv->bus); |
| 613 | int error = 0; | 632 | int error = 0; |
| 614 | 633 | ||
| 615 | if (!bus) | 634 | if (!bus) |
| @@ -632,6 +651,11 @@ int bus_add_driver(struct device_driver *drv) | |||
| 632 | klist_add_tail(&drv->knode_bus, &bus->klist_drivers); | 651 | klist_add_tail(&drv->knode_bus, &bus->klist_drivers); |
| 633 | module_add_driver(drv->owner, drv); | 652 | module_add_driver(drv->owner, drv); |
| 634 | 653 | ||
| 654 | error = driver_create_file(drv, &driver_attr_uevent); | ||
| 655 | if (error) { | ||
| 656 | printk(KERN_ERR "%s: uevent attr (%s) failed\n", | ||
| 657 | __FUNCTION__, drv->name); | ||
| 658 | } | ||
| 635 | error = driver_add_attrs(bus, drv); | 659 | error = driver_add_attrs(bus, drv); |
| 636 | if (error) { | 660 | if (error) { |
| 637 | /* How the hell do we get out of this pickle? Give up */ | 661 | /* How the hell do we get out of this pickle? Give up */ |
| @@ -649,7 +673,7 @@ int bus_add_driver(struct device_driver *drv) | |||
| 649 | out_unregister: | 673 | out_unregister: |
| 650 | kobject_unregister(&drv->kobj); | 674 | kobject_unregister(&drv->kobj); |
| 651 | out_put_bus: | 675 | out_put_bus: |
| 652 | put_bus(bus); | 676 | bus_put(bus); |
| 653 | return error; | 677 | return error; |
| 654 | } | 678 | } |
| 655 | 679 | ||
| @@ -669,12 +693,13 @@ void bus_remove_driver(struct device_driver * drv) | |||
| 669 | 693 | ||
| 670 | remove_bind_files(drv); | 694 | remove_bind_files(drv); |
| 671 | driver_remove_attrs(drv->bus, drv); | 695 | driver_remove_attrs(drv->bus, drv); |
| 696 | driver_remove_file(drv, &driver_attr_uevent); | ||
| 672 | klist_remove(&drv->knode_bus); | 697 | klist_remove(&drv->knode_bus); |
| 673 | pr_debug("bus %s: remove driver %s\n", drv->bus->name, drv->name); | 698 | pr_debug("bus %s: remove driver %s\n", drv->bus->name, drv->name); |
| 674 | driver_detach(drv); | 699 | driver_detach(drv); |
| 675 | module_remove_driver(drv); | 700 | module_remove_driver(drv); |
| 676 | kobject_unregister(&drv->kobj); | 701 | kobject_unregister(&drv->kobj); |
| 677 | put_bus(drv->bus); | 702 | bus_put(drv->bus); |
| 678 | } | 703 | } |
| 679 | 704 | ||
| 680 | 705 | ||
| @@ -729,18 +754,6 @@ int device_reprobe(struct device *dev) | |||
| 729 | } | 754 | } |
| 730 | EXPORT_SYMBOL_GPL(device_reprobe); | 755 | EXPORT_SYMBOL_GPL(device_reprobe); |
| 731 | 756 | ||
| 732 | struct bus_type *get_bus(struct bus_type *bus) | ||
| 733 | { | ||
| 734 | return bus ? container_of(subsys_get(&bus->subsys), | ||
| 735 | struct bus_type, subsys) : NULL; | ||
| 736 | } | ||
| 737 | |||
| 738 | void put_bus(struct bus_type * bus) | ||
| 739 | { | ||
| 740 | subsys_put(&bus->subsys); | ||
| 741 | } | ||
| 742 | |||
| 743 | |||
| 744 | /** | 757 | /** |
| 745 | * find_bus - locate bus by name. | 758 | * find_bus - locate bus by name. |
| 746 | * @name: name of bus. | 759 | * @name: name of bus. |
| @@ -808,6 +821,17 @@ static void klist_devices_put(struct klist_node *n) | |||
| 808 | put_device(dev); | 821 | put_device(dev); |
| 809 | } | 822 | } |
| 810 | 823 | ||
| 824 | static ssize_t bus_uevent_store(struct bus_type *bus, | ||
| 825 | const char *buf, size_t count) | ||
| 826 | { | ||
| 827 | enum kobject_action action; | ||
| 828 | |||
| 829 | if (kobject_action_type(buf, count, &action) == 0) | ||
| 830 | kobject_uevent(&bus->subsys.kobj, action); | ||
| 831 | return count; | ||
| 832 | } | ||
| 833 | static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store); | ||
| 834 | |||
| 811 | /** | 835 | /** |
| 812 | * bus_register - register a bus with the system. | 836 | * bus_register - register a bus with the system. |
| 813 | * @bus: bus. | 837 | * @bus: bus. |
| @@ -826,11 +850,16 @@ int bus_register(struct bus_type * bus) | |||
| 826 | if (retval) | 850 | if (retval) |
| 827 | goto out; | 851 | goto out; |
| 828 | 852 | ||
| 829 | subsys_set_kset(bus, bus_subsys); | 853 | bus->subsys.kobj.kset = &bus_subsys; |
| 854 | |||
| 830 | retval = subsystem_register(&bus->subsys); | 855 | retval = subsystem_register(&bus->subsys); |
| 831 | if (retval) | 856 | if (retval) |
| 832 | goto out; | 857 | goto out; |
| 833 | 858 | ||
| 859 | retval = bus_create_file(bus, &bus_attr_uevent); | ||
| 860 | if (retval) | ||
| 861 | goto bus_uevent_fail; | ||
| 862 | |||
| 834 | kobject_set_name(&bus->devices.kobj, "devices"); | 863 | kobject_set_name(&bus->devices.kobj, "devices"); |
| 835 | bus->devices.kobj.parent = &bus->subsys.kobj; | 864 | bus->devices.kobj.parent = &bus->subsys.kobj; |
| 836 | retval = kset_register(&bus->devices); | 865 | retval = kset_register(&bus->devices); |
| @@ -839,7 +868,7 @@ int bus_register(struct bus_type * bus) | |||
| 839 | 868 | ||
| 840 | kobject_set_name(&bus->drivers.kobj, "drivers"); | 869 | kobject_set_name(&bus->drivers.kobj, "drivers"); |
| 841 | bus->drivers.kobj.parent = &bus->subsys.kobj; | 870 | bus->drivers.kobj.parent = &bus->subsys.kobj; |
| 842 | bus->drivers.ktype = &ktype_driver; | 871 | bus->drivers.ktype = &driver_ktype; |
| 843 | retval = kset_register(&bus->drivers); | 872 | retval = kset_register(&bus->drivers); |
| 844 | if (retval) | 873 | if (retval) |
| 845 | goto bus_drivers_fail; | 874 | goto bus_drivers_fail; |
| @@ -866,6 +895,8 @@ bus_probe_files_fail: | |||
| 866 | bus_drivers_fail: | 895 | bus_drivers_fail: |
| 867 | kset_unregister(&bus->devices); | 896 | kset_unregister(&bus->devices); |
| 868 | bus_devices_fail: | 897 | bus_devices_fail: |
| 898 | bus_remove_file(bus, &bus_attr_uevent); | ||
| 899 | bus_uevent_fail: | ||
| 869 | subsystem_unregister(&bus->subsys); | 900 | subsystem_unregister(&bus->subsys); |
| 870 | out: | 901 | out: |
| 871 | return retval; | 902 | return retval; |
| @@ -876,7 +907,7 @@ out: | |||
| 876 | * @bus: bus. | 907 | * @bus: bus. |
| 877 | * | 908 | * |
| 878 | * Unregister the child subsystems and the bus itself. | 909 | * Unregister the child subsystems and the bus itself. |
| 879 | * Finally, we call put_bus() to release the refcount | 910 | * Finally, we call bus_put() to release the refcount |
| 880 | */ | 911 | */ |
| 881 | void bus_unregister(struct bus_type * bus) | 912 | void bus_unregister(struct bus_type * bus) |
| 882 | { | 913 | { |
| @@ -885,6 +916,7 @@ void bus_unregister(struct bus_type * bus) | |||
| 885 | remove_probe_files(bus); | 916 | remove_probe_files(bus); |
| 886 | kset_unregister(&bus->drivers); | 917 | kset_unregister(&bus->drivers); |
| 887 | kset_unregister(&bus->devices); | 918 | kset_unregister(&bus->devices); |
| 919 | bus_remove_file(bus, &bus_attr_uevent); | ||
| 888 | subsystem_unregister(&bus->subsys); | 920 | subsystem_unregister(&bus->subsys); |
| 889 | } | 921 | } |
| 890 | 922 | ||
diff --git a/drivers/base/class.c b/drivers/base/class.c index 4d2222618b78..a863bb091e11 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c | |||
| @@ -65,13 +65,13 @@ static struct sysfs_ops class_sysfs_ops = { | |||
| 65 | .store = class_attr_store, | 65 | .store = class_attr_store, |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | static struct kobj_type ktype_class = { | 68 | static struct kobj_type class_ktype = { |
| 69 | .sysfs_ops = &class_sysfs_ops, | 69 | .sysfs_ops = &class_sysfs_ops, |
| 70 | .release = class_release, | 70 | .release = class_release, |
| 71 | }; | 71 | }; |
| 72 | 72 | ||
| 73 | /* Hotplug events for classes go to the class_obj subsys */ | 73 | /* Hotplug events for classes go to the class_obj subsys */ |
| 74 | static decl_subsys(class, &ktype_class, NULL); | 74 | static decl_subsys(class, &class_ktype, NULL); |
| 75 | 75 | ||
| 76 | 76 | ||
| 77 | int class_create_file(struct class * cls, const struct class_attribute * attr) | 77 | int class_create_file(struct class * cls, const struct class_attribute * attr) |
| @@ -93,14 +93,14 @@ void class_remove_file(struct class * cls, const struct class_attribute * attr) | |||
| 93 | static struct class *class_get(struct class *cls) | 93 | static struct class *class_get(struct class *cls) |
| 94 | { | 94 | { |
| 95 | if (cls) | 95 | if (cls) |
| 96 | return container_of(subsys_get(&cls->subsys), struct class, subsys); | 96 | return container_of(kset_get(&cls->subsys), struct class, subsys); |
| 97 | return NULL; | 97 | return NULL; |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | static void class_put(struct class * cls) | 100 | static void class_put(struct class * cls) |
| 101 | { | 101 | { |
| 102 | if (cls) | 102 | if (cls) |
| 103 | subsys_put(&cls->subsys); | 103 | kset_put(&cls->subsys); |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | 106 | ||
| @@ -149,7 +149,7 @@ int class_register(struct class * cls) | |||
| 149 | if (error) | 149 | if (error) |
| 150 | return error; | 150 | return error; |
| 151 | 151 | ||
| 152 | subsys_set_kset(cls, class_subsys); | 152 | cls->subsys.kobj.kset = &class_subsys; |
| 153 | 153 | ||
| 154 | error = subsystem_register(&cls->subsys); | 154 | error = subsystem_register(&cls->subsys); |
| 155 | if (!error) { | 155 | if (!error) { |
| @@ -180,8 +180,7 @@ static void class_device_create_release(struct class_device *class_dev) | |||
| 180 | 180 | ||
| 181 | /* needed to allow these devices to have parent class devices */ | 181 | /* needed to allow these devices to have parent class devices */ |
| 182 | static int class_device_create_uevent(struct class_device *class_dev, | 182 | static int class_device_create_uevent(struct class_device *class_dev, |
| 183 | char **envp, int num_envp, | 183 | struct kobj_uevent_env *env) |
| 184 | char *buffer, int buffer_size) | ||
| 185 | { | 184 | { |
| 186 | pr_debug("%s called for %s\n", __FUNCTION__, class_dev->class_id); | 185 | pr_debug("%s called for %s\n", __FUNCTION__, class_dev->class_id); |
| 187 | return 0; | 186 | return 0; |
| @@ -324,7 +323,7 @@ static void class_dev_release(struct kobject * kobj) | |||
| 324 | } | 323 | } |
| 325 | } | 324 | } |
| 326 | 325 | ||
| 327 | static struct kobj_type ktype_class_device = { | 326 | static struct kobj_type class_device_ktype = { |
| 328 | .sysfs_ops = &class_dev_sysfs_ops, | 327 | .sysfs_ops = &class_dev_sysfs_ops, |
| 329 | .release = class_dev_release, | 328 | .release = class_dev_release, |
| 330 | }; | 329 | }; |
| @@ -333,7 +332,7 @@ static int class_uevent_filter(struct kset *kset, struct kobject *kobj) | |||
| 333 | { | 332 | { |
| 334 | struct kobj_type *ktype = get_ktype(kobj); | 333 | struct kobj_type *ktype = get_ktype(kobj); |
| 335 | 334 | ||
| 336 | if (ktype == &ktype_class_device) { | 335 | if (ktype == &class_device_ktype) { |
| 337 | struct class_device *class_dev = to_class_dev(kobj); | 336 | struct class_device *class_dev = to_class_dev(kobj); |
| 338 | if (class_dev->class) | 337 | if (class_dev->class) |
| 339 | return 1; | 338 | return 1; |
| @@ -403,64 +402,43 @@ static void remove_deprecated_class_device_links(struct class_device *cd) | |||
| 403 | { } | 402 | { } |
| 404 | #endif | 403 | #endif |
| 405 | 404 | ||
| 406 | static int class_uevent(struct kset *kset, struct kobject *kobj, char **envp, | 405 | static int class_uevent(struct kset *kset, struct kobject *kobj, |
| 407 | int num_envp, char *buffer, int buffer_size) | 406 | struct kobj_uevent_env *env) |
| 408 | { | 407 | { |
| 409 | struct class_device *class_dev = to_class_dev(kobj); | 408 | struct class_device *class_dev = to_class_dev(kobj); |
| 410 | struct device *dev = class_dev->dev; | 409 | struct device *dev = class_dev->dev; |
| 411 | int i = 0; | ||
| 412 | int length = 0; | ||
| 413 | int retval = 0; | 410 | int retval = 0; |
| 414 | 411 | ||
| 415 | pr_debug("%s - name = %s\n", __FUNCTION__, class_dev->class_id); | 412 | pr_debug("%s - name = %s\n", __FUNCTION__, class_dev->class_id); |
| 416 | 413 | ||
| 417 | if (MAJOR(class_dev->devt)) { | 414 | if (MAJOR(class_dev->devt)) { |
| 418 | add_uevent_var(envp, num_envp, &i, | 415 | add_uevent_var(env, "MAJOR=%u", MAJOR(class_dev->devt)); |
| 419 | buffer, buffer_size, &length, | ||
| 420 | "MAJOR=%u", MAJOR(class_dev->devt)); | ||
| 421 | 416 | ||
| 422 | add_uevent_var(envp, num_envp, &i, | 417 | add_uevent_var(env, "MINOR=%u", MINOR(class_dev->devt)); |
| 423 | buffer, buffer_size, &length, | ||
| 424 | "MINOR=%u", MINOR(class_dev->devt)); | ||
| 425 | } | 418 | } |
| 426 | 419 | ||
| 427 | if (dev) { | 420 | if (dev) { |
| 428 | const char *path = kobject_get_path(&dev->kobj, GFP_KERNEL); | 421 | const char *path = kobject_get_path(&dev->kobj, GFP_KERNEL); |
| 429 | if (path) { | 422 | if (path) { |
| 430 | add_uevent_var(envp, num_envp, &i, | 423 | add_uevent_var(env, "PHYSDEVPATH=%s", path); |
| 431 | buffer, buffer_size, &length, | ||
| 432 | "PHYSDEVPATH=%s", path); | ||
| 433 | kfree(path); | 424 | kfree(path); |
| 434 | } | 425 | } |
| 435 | 426 | ||
| 436 | if (dev->bus) | 427 | if (dev->bus) |
| 437 | add_uevent_var(envp, num_envp, &i, | 428 | add_uevent_var(env, "PHYSDEVBUS=%s", dev->bus->name); |
| 438 | buffer, buffer_size, &length, | ||
| 439 | "PHYSDEVBUS=%s", dev->bus->name); | ||
| 440 | 429 | ||
| 441 | if (dev->driver) | 430 | if (dev->driver) |
| 442 | add_uevent_var(envp, num_envp, &i, | 431 | add_uevent_var(env, "PHYSDEVDRIVER=%s", dev->driver->name); |
| 443 | buffer, buffer_size, &length, | ||
| 444 | "PHYSDEVDRIVER=%s", dev->driver->name); | ||
| 445 | } | 432 | } |
| 446 | 433 | ||
| 447 | /* terminate, set to next free slot, shrink available space */ | ||
| 448 | envp[i] = NULL; | ||
| 449 | envp = &envp[i]; | ||
| 450 | num_envp -= i; | ||
| 451 | buffer = &buffer[length]; | ||
| 452 | buffer_size -= length; | ||
| 453 | |||
| 454 | if (class_dev->uevent) { | 434 | if (class_dev->uevent) { |
| 455 | /* have the class device specific function add its stuff */ | 435 | /* have the class device specific function add its stuff */ |
| 456 | retval = class_dev->uevent(class_dev, envp, num_envp, | 436 | retval = class_dev->uevent(class_dev, env); |
| 457 | buffer, buffer_size); | ||
| 458 | if (retval) | 437 | if (retval) |
| 459 | pr_debug("class_dev->uevent() returned %d\n", retval); | 438 | pr_debug("class_dev->uevent() returned %d\n", retval); |
| 460 | } else if (class_dev->class->uevent) { | 439 | } else if (class_dev->class->uevent) { |
| 461 | /* have the class specific function add its stuff */ | 440 | /* have the class specific function add its stuff */ |
| 462 | retval = class_dev->class->uevent(class_dev, envp, num_envp, | 441 | retval = class_dev->class->uevent(class_dev, env); |
| 463 | buffer, buffer_size); | ||
| 464 | if (retval) | 442 | if (retval) |
| 465 | pr_debug("class->uevent() returned %d\n", retval); | 443 | pr_debug("class->uevent() returned %d\n", retval); |
| 466 | } | 444 | } |
| @@ -474,7 +452,7 @@ static struct kset_uevent_ops class_uevent_ops = { | |||
| 474 | .uevent = class_uevent, | 452 | .uevent = class_uevent, |
| 475 | }; | 453 | }; |
| 476 | 454 | ||
| 477 | static decl_subsys(class_obj, &ktype_class_device, &class_uevent_ops); | 455 | static decl_subsys(class_obj, &class_device_ktype, &class_uevent_ops); |
| 478 | 456 | ||
| 479 | 457 | ||
| 480 | static int class_device_add_attrs(struct class_device * cd) | 458 | static int class_device_add_attrs(struct class_device * cd) |
| @@ -883,7 +861,7 @@ int __init classes_init(void) | |||
| 883 | 861 | ||
| 884 | /* ick, this is ugly, the things we go through to keep from showing up | 862 | /* ick, this is ugly, the things we go through to keep from showing up |
| 885 | * in sysfs... */ | 863 | * in sysfs... */ |
| 886 | subsystem_init(&class_obj_subsys); | 864 | kset_init(&class_obj_subsys); |
| 887 | if (!class_obj_subsys.kobj.parent) | 865 | if (!class_obj_subsys.kobj.parent) |
| 888 | class_obj_subsys.kobj.parent = &class_obj_subsys.kobj; | 866 | class_obj_subsys.kobj.parent = &class_obj_subsys.kobj; |
| 889 | return 0; | 867 | return 0; |
diff --git a/drivers/base/core.c b/drivers/base/core.c index ec86d6fc2360..c1343414d285 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
| @@ -108,7 +108,7 @@ static void device_release(struct kobject * kobj) | |||
| 108 | } | 108 | } |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | static struct kobj_type ktype_device = { | 111 | static struct kobj_type device_ktype = { |
| 112 | .release = device_release, | 112 | .release = device_release, |
| 113 | .sysfs_ops = &dev_sysfs_ops, | 113 | .sysfs_ops = &dev_sysfs_ops, |
| 114 | }; | 114 | }; |
| @@ -118,7 +118,7 @@ static int dev_uevent_filter(struct kset *kset, struct kobject *kobj) | |||
| 118 | { | 118 | { |
| 119 | struct kobj_type *ktype = get_ktype(kobj); | 119 | struct kobj_type *ktype = get_ktype(kobj); |
| 120 | 120 | ||
| 121 | if (ktype == &ktype_device) { | 121 | if (ktype == &device_ktype) { |
| 122 | struct device *dev = to_dev(kobj); | 122 | struct device *dev = to_dev(kobj); |
| 123 | if (dev->uevent_suppress) | 123 | if (dev->uevent_suppress) |
| 124 | return 0; | 124 | return 0; |
| @@ -141,33 +141,23 @@ static const char *dev_uevent_name(struct kset *kset, struct kobject *kobj) | |||
| 141 | return NULL; | 141 | return NULL; |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | static int dev_uevent(struct kset *kset, struct kobject *kobj, char **envp, | 144 | static int dev_uevent(struct kset *kset, struct kobject *kobj, |
| 145 | int num_envp, char *buffer, int buffer_size) | 145 | struct kobj_uevent_env *env) |
| 146 | { | 146 | { |
| 147 | struct device *dev = to_dev(kobj); | 147 | struct device *dev = to_dev(kobj); |
| 148 | int i = 0; | ||
| 149 | int length = 0; | ||
| 150 | int retval = 0; | 148 | int retval = 0; |
| 151 | 149 | ||
| 152 | /* add the major/minor if present */ | 150 | /* add the major/minor if present */ |
| 153 | if (MAJOR(dev->devt)) { | 151 | if (MAJOR(dev->devt)) { |
| 154 | add_uevent_var(envp, num_envp, &i, | 152 | add_uevent_var(env, "MAJOR=%u", MAJOR(dev->devt)); |
| 155 | buffer, buffer_size, &length, | 153 | add_uevent_var(env, "MINOR=%u", MINOR(dev->devt)); |
| 156 | "MAJOR=%u", MAJOR(dev->devt)); | ||
| 157 | add_uevent_var(envp, num_envp, &i, | ||
| 158 | buffer, buffer_size, &length, | ||
| 159 | "MINOR=%u", MINOR(dev->devt)); | ||
| 160 | } | 154 | } |
| 161 | 155 | ||
| 162 | if (dev->type && dev->type->name) | 156 | if (dev->type && dev->type->name) |
| 163 | add_uevent_var(envp, num_envp, &i, | 157 | add_uevent_var(env, "DEVTYPE=%s", dev->type->name); |
| 164 | buffer, buffer_size, &length, | ||
| 165 | "DEVTYPE=%s", dev->type->name); | ||
| 166 | 158 | ||
| 167 | if (dev->driver) | 159 | if (dev->driver) |
| 168 | add_uevent_var(envp, num_envp, &i, | 160 | add_uevent_var(env, "DRIVER=%s", dev->driver->name); |
| 169 | buffer, buffer_size, &length, | ||
| 170 | "DRIVER=%s", dev->driver->name); | ||
| 171 | 161 | ||
| 172 | #ifdef CONFIG_SYSFS_DEPRECATED | 162 | #ifdef CONFIG_SYSFS_DEPRECATED |
| 173 | if (dev->class) { | 163 | if (dev->class) { |
| @@ -181,59 +171,43 @@ static int dev_uevent(struct kset *kset, struct kobject *kobj, char **envp, | |||
| 181 | 171 | ||
| 182 | path = kobject_get_path(&parent->kobj, GFP_KERNEL); | 172 | path = kobject_get_path(&parent->kobj, GFP_KERNEL); |
| 183 | if (path) { | 173 | if (path) { |
| 184 | add_uevent_var(envp, num_envp, &i, | 174 | add_uevent_var(env, "PHYSDEVPATH=%s", path); |
| 185 | buffer, buffer_size, &length, | ||
| 186 | "PHYSDEVPATH=%s", path); | ||
| 187 | kfree(path); | 175 | kfree(path); |
| 188 | } | 176 | } |
| 189 | 177 | ||
| 190 | add_uevent_var(envp, num_envp, &i, | 178 | add_uevent_var(env, "PHYSDEVBUS=%s", parent->bus->name); |
| 191 | buffer, buffer_size, &length, | ||
| 192 | "PHYSDEVBUS=%s", parent->bus->name); | ||
| 193 | 179 | ||
| 194 | if (parent->driver) | 180 | if (parent->driver) |
| 195 | add_uevent_var(envp, num_envp, &i, | 181 | add_uevent_var(env, "PHYSDEVDRIVER=%s", |
| 196 | buffer, buffer_size, &length, | 182 | parent->driver->name); |
| 197 | "PHYSDEVDRIVER=%s", parent->driver->name); | ||
| 198 | } | 183 | } |
| 199 | } else if (dev->bus) { | 184 | } else if (dev->bus) { |
| 200 | add_uevent_var(envp, num_envp, &i, | 185 | add_uevent_var(env, "PHYSDEVBUS=%s", dev->bus->name); |
| 201 | buffer, buffer_size, &length, | ||
| 202 | "PHYSDEVBUS=%s", dev->bus->name); | ||
| 203 | 186 | ||
| 204 | if (dev->driver) | 187 | if (dev->driver) |
| 205 | add_uevent_var(envp, num_envp, &i, | 188 | add_uevent_var(env, "PHYSDEVDRIVER=%s", dev->driver->name); |
| 206 | buffer, buffer_size, &length, | ||
| 207 | "PHYSDEVDRIVER=%s", dev->driver->name); | ||
| 208 | } | 189 | } |
| 209 | #endif | 190 | #endif |
| 210 | 191 | ||
| 211 | /* terminate, set to next free slot, shrink available space */ | 192 | /* have the bus specific function add its stuff */ |
| 212 | envp[i] = NULL; | ||
| 213 | envp = &envp[i]; | ||
| 214 | num_envp -= i; | ||
| 215 | buffer = &buffer[length]; | ||
| 216 | buffer_size -= length; | ||
| 217 | |||
| 218 | if (dev->bus && dev->bus->uevent) { | 193 | if (dev->bus && dev->bus->uevent) { |
| 219 | /* have the bus specific function add its stuff */ | 194 | retval = dev->bus->uevent(dev, env); |
| 220 | retval = dev->bus->uevent(dev, envp, num_envp, buffer, buffer_size); | ||
| 221 | if (retval) | 195 | if (retval) |
| 222 | pr_debug ("%s: bus uevent() returned %d\n", | 196 | pr_debug ("%s: bus uevent() returned %d\n", |
| 223 | __FUNCTION__, retval); | 197 | __FUNCTION__, retval); |
| 224 | } | 198 | } |
| 225 | 199 | ||
| 200 | /* have the class specific function add its stuff */ | ||
| 226 | if (dev->class && dev->class->dev_uevent) { | 201 | if (dev->class && dev->class->dev_uevent) { |
| 227 | /* have the class specific function add its stuff */ | 202 | retval = dev->class->dev_uevent(dev, env); |
| 228 | retval = dev->class->dev_uevent(dev, envp, num_envp, buffer, buffer_size); | ||
| 229 | if (retval) | 203 | if (retval) |
| 230 | pr_debug("%s: class uevent() returned %d\n", | 204 | pr_debug("%s: class uevent() returned %d\n", |
| 231 | __FUNCTION__, retval); | 205 | __FUNCTION__, retval); |
| 232 | } | 206 | } |
| 233 | 207 | ||
| 208 | /* have the device type specific fuction add its stuff */ | ||
| 234 | if (dev->type && dev->type->uevent) { | 209 | if (dev->type && dev->type->uevent) { |
| 235 | /* have the device type specific fuction add its stuff */ | 210 | retval = dev->type->uevent(dev, env); |
| 236 | retval = dev->type->uevent(dev, envp, num_envp, buffer, buffer_size); | ||
| 237 | if (retval) | 211 | if (retval) |
| 238 | pr_debug("%s: dev_type uevent() returned %d\n", | 212 | pr_debug("%s: dev_type uevent() returned %d\n", |
| 239 | __FUNCTION__, retval); | 213 | __FUNCTION__, retval); |
| @@ -253,22 +227,18 @@ static ssize_t show_uevent(struct device *dev, struct device_attribute *attr, | |||
| 253 | { | 227 | { |
| 254 | struct kobject *top_kobj; | 228 | struct kobject *top_kobj; |
| 255 | struct kset *kset; | 229 | struct kset *kset; |
| 256 | char *envp[32]; | 230 | struct kobj_uevent_env *env = NULL; |
| 257 | char *data = NULL; | ||
| 258 | char *pos; | ||
| 259 | int i; | 231 | int i; |
| 260 | size_t count = 0; | 232 | size_t count = 0; |
| 261 | int retval; | 233 | int retval; |
| 262 | 234 | ||
| 263 | /* search the kset, the device belongs to */ | 235 | /* search the kset, the device belongs to */ |
| 264 | top_kobj = &dev->kobj; | 236 | top_kobj = &dev->kobj; |
| 265 | if (!top_kobj->kset && top_kobj->parent) { | 237 | while (!top_kobj->kset && top_kobj->parent) |
| 266 | do { | 238 | top_kobj = top_kobj->parent; |
| 267 | top_kobj = top_kobj->parent; | ||
| 268 | } while (!top_kobj->kset && top_kobj->parent); | ||
| 269 | } | ||
| 270 | if (!top_kobj->kset) | 239 | if (!top_kobj->kset) |
| 271 | goto out; | 240 | goto out; |
| 241 | |||
| 272 | kset = top_kobj->kset; | 242 | kset = top_kobj->kset; |
| 273 | if (!kset->uevent_ops || !kset->uevent_ops->uevent) | 243 | if (!kset->uevent_ops || !kset->uevent_ops->uevent) |
| 274 | goto out; | 244 | goto out; |
| @@ -278,43 +248,29 @@ static ssize_t show_uevent(struct device *dev, struct device_attribute *attr, | |||
| 278 | if (!kset->uevent_ops->filter(kset, &dev->kobj)) | 248 | if (!kset->uevent_ops->filter(kset, &dev->kobj)) |
| 279 | goto out; | 249 | goto out; |
| 280 | 250 | ||
| 281 | data = (char *)get_zeroed_page(GFP_KERNEL); | 251 | env = kzalloc(sizeof(struct kobj_uevent_env), GFP_KERNEL); |
| 282 | if (!data) | 252 | if (!env) |
| 283 | return -ENOMEM; | 253 | return -ENOMEM; |
| 284 | 254 | ||
| 285 | /* let the kset specific function add its keys */ | 255 | /* let the kset specific function add its keys */ |
| 286 | pos = data; | 256 | retval = kset->uevent_ops->uevent(kset, &dev->kobj, env); |
| 287 | memset(envp, 0, sizeof(envp)); | ||
| 288 | retval = kset->uevent_ops->uevent(kset, &dev->kobj, | ||
| 289 | envp, ARRAY_SIZE(envp), | ||
| 290 | pos, PAGE_SIZE); | ||
| 291 | if (retval) | 257 | if (retval) |
| 292 | goto out; | 258 | goto out; |
| 293 | 259 | ||
| 294 | /* copy keys to file */ | 260 | /* copy keys to file */ |
| 295 | for (i = 0; envp[i]; i++) { | 261 | for (i = 0; i < env->envp_idx; i++) |
| 296 | pos = &buf[count]; | 262 | count += sprintf(&buf[count], "%s\n", env->envp[i]); |
| 297 | count += sprintf(pos, "%s\n", envp[i]); | ||
| 298 | } | ||
| 299 | out: | 263 | out: |
| 300 | free_page((unsigned long)data); | 264 | kfree(env); |
| 301 | return count; | 265 | return count; |
| 302 | } | 266 | } |
| 303 | 267 | ||
| 304 | static ssize_t store_uevent(struct device *dev, struct device_attribute *attr, | 268 | static ssize_t store_uevent(struct device *dev, struct device_attribute *attr, |
| 305 | const char *buf, size_t count) | 269 | const char *buf, size_t count) |
| 306 | { | 270 | { |
| 307 | size_t len = count; | ||
| 308 | enum kobject_action action; | 271 | enum kobject_action action; |
| 309 | 272 | ||
| 310 | if (len && buf[len-1] == '\n') | 273 | if (kobject_action_type(buf, count, &action) == 0) { |
| 311 | len--; | ||
| 312 | |||
| 313 | for (action = 0; action < KOBJ_MAX; action++) { | ||
| 314 | if (strncmp(kobject_actions[action], buf, len) != 0) | ||
| 315 | continue; | ||
| 316 | if (kobject_actions[action][len] != '\0') | ||
| 317 | continue; | ||
| 318 | kobject_uevent(&dev->kobj, action); | 274 | kobject_uevent(&dev->kobj, action); |
| 319 | goto out; | 275 | goto out; |
| 320 | } | 276 | } |
| @@ -449,7 +405,7 @@ static struct device_attribute devt_attr = | |||
| 449 | * devices_subsys - structure to be registered with kobject core. | 405 | * devices_subsys - structure to be registered with kobject core. |
| 450 | */ | 406 | */ |
| 451 | 407 | ||
| 452 | decl_subsys(devices, &ktype_device, &device_uevent_ops); | 408 | decl_subsys(devices, &device_ktype, &device_uevent_ops); |
| 453 | 409 | ||
| 454 | 410 | ||
| 455 | /** | 411 | /** |
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index b24efd4e3e3d..0295855a3eef 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c | |||
| @@ -88,19 +88,14 @@ static CLASS_ATTR(timeout, 0644, firmware_timeout_show, firmware_timeout_store); | |||
| 88 | 88 | ||
| 89 | static void fw_dev_release(struct device *dev); | 89 | static void fw_dev_release(struct device *dev); |
| 90 | 90 | ||
| 91 | static int firmware_uevent(struct device *dev, char **envp, int num_envp, | 91 | static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 92 | char *buffer, int buffer_size) | ||
| 93 | { | 92 | { |
| 94 | struct firmware_priv *fw_priv = dev_get_drvdata(dev); | 93 | struct firmware_priv *fw_priv = dev_get_drvdata(dev); |
| 95 | int i = 0, len = 0; | ||
| 96 | 94 | ||
| 97 | if (add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, | 95 | if (add_uevent_var(env, "FIRMWARE=%s", fw_priv->fw_id)) |
| 98 | "FIRMWARE=%s", fw_priv->fw_id)) | ||
| 99 | return -ENOMEM; | 96 | return -ENOMEM; |
| 100 | if (add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, | 97 | if (add_uevent_var(env, "TIMEOUT=%i", loading_timeout)) |
| 101 | "TIMEOUT=%i", loading_timeout)) | ||
| 102 | return -ENOMEM; | 98 | return -ENOMEM; |
| 103 | envp[i] = NULL; | ||
| 104 | 99 | ||
| 105 | return 0; | 100 | return 0; |
| 106 | } | 101 | } |
| @@ -297,8 +292,7 @@ firmware_class_timeout(u_long data) | |||
| 297 | 292 | ||
| 298 | static inline void fw_setup_device_id(struct device *f_dev, struct device *dev) | 293 | static inline void fw_setup_device_id(struct device *f_dev, struct device *dev) |
| 299 | { | 294 | { |
| 300 | /* XXX warning we should watch out for name collisions */ | 295 | snprintf(f_dev->bus_id, BUS_ID_SIZE, "firmware-%s", dev->bus_id); |
| 301 | strlcpy(f_dev->bus_id, dev->bus_id, BUS_ID_SIZE); | ||
| 302 | } | 296 | } |
| 303 | 297 | ||
| 304 | static int fw_register_device(struct device **dev_p, const char *fw_name, | 298 | static int fw_register_device(struct device **dev_p, const char *fw_name, |
diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 74b96795d2f5..cb99daeae936 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c | |||
| @@ -34,8 +34,7 @@ static const char *memory_uevent_name(struct kset *kset, struct kobject *kobj) | |||
| 34 | return MEMORY_CLASS_NAME; | 34 | return MEMORY_CLASS_NAME; |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | static int memory_uevent(struct kset *kset, struct kobject *kobj, char **envp, | 37 | static int memory_uevent(struct kset *kset, struct kobj_uevent_env *env) |
| 38 | int num_envp, char *buffer, int buffer_size) | ||
| 39 | { | 38 | { |
| 40 | int retval = 0; | 39 | int retval = 0; |
| 41 | 40 | ||
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 869ff8c00146..fb5609241482 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
| @@ -160,13 +160,8 @@ static void platform_device_release(struct device *dev) | |||
| 160 | * | 160 | * |
| 161 | * Create a platform device object which can have other objects attached | 161 | * Create a platform device object which can have other objects attached |
| 162 | * to it, and which will have attached objects freed when it is released. | 162 | * to it, and which will have attached objects freed when it is released. |
| 163 | * | ||
| 164 | * This device will be marked as not supporting hotpluggable drivers; no | ||
| 165 | * device add/remove uevents will be generated. In the unusual case that | ||
| 166 | * the device isn't being dynamically allocated as a legacy "probe the | ||
| 167 | * hardware" driver, infrastructure code should reverse this marking. | ||
| 168 | */ | 163 | */ |
| 169 | struct platform_device *platform_device_alloc(const char *name, unsigned int id) | 164 | struct platform_device *platform_device_alloc(const char *name, int id) |
| 170 | { | 165 | { |
| 171 | struct platform_object *pa; | 166 | struct platform_object *pa; |
| 172 | 167 | ||
| @@ -177,12 +172,6 @@ struct platform_device *platform_device_alloc(const char *name, unsigned int id) | |||
| 177 | pa->pdev.id = id; | 172 | pa->pdev.id = id; |
| 178 | device_initialize(&pa->pdev.dev); | 173 | device_initialize(&pa->pdev.dev); |
| 179 | pa->pdev.dev.release = platform_device_release; | 174 | pa->pdev.dev.release = platform_device_release; |
| 180 | |||
| 181 | /* prevent hotplug "modprobe $(MODALIAS)" from causing trouble in | ||
| 182 | * legacy probe-the-hardware drivers, which don't properly split | ||
| 183 | * out device enumeration logic from drivers. | ||
| 184 | */ | ||
| 185 | pa->pdev.dev.uevent_suppress = 1; | ||
| 186 | } | 175 | } |
| 187 | 176 | ||
| 188 | return pa ? &pa->pdev : NULL; | 177 | return pa ? &pa->pdev : NULL; |
| @@ -256,7 +245,8 @@ int platform_device_add(struct platform_device *pdev) | |||
| 256 | pdev->dev.bus = &platform_bus_type; | 245 | pdev->dev.bus = &platform_bus_type; |
| 257 | 246 | ||
| 258 | if (pdev->id != -1) | 247 | if (pdev->id != -1) |
| 259 | snprintf(pdev->dev.bus_id, BUS_ID_SIZE, "%s.%u", pdev->name, pdev->id); | 248 | snprintf(pdev->dev.bus_id, BUS_ID_SIZE, "%s.%d", pdev->name, |
| 249 | pdev->id); | ||
| 260 | else | 250 | else |
| 261 | strlcpy(pdev->dev.bus_id, pdev->name, BUS_ID_SIZE); | 251 | strlcpy(pdev->dev.bus_id, pdev->name, BUS_ID_SIZE); |
| 262 | 252 | ||
| @@ -370,7 +360,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister); | |||
| 370 | * the Linux driver model. In particular, when such drivers are built | 360 | * the Linux driver model. In particular, when such drivers are built |
| 371 | * as modules, they can't be "hotplugged". | 361 | * as modules, they can't be "hotplugged". |
| 372 | */ | 362 | */ |
| 373 | struct platform_device *platform_device_register_simple(char *name, unsigned int id, | 363 | struct platform_device *platform_device_register_simple(char *name, int id, |
| 374 | struct resource *res, unsigned int num) | 364 | struct resource *res, unsigned int num) |
| 375 | { | 365 | { |
| 376 | struct platform_device *pdev; | 366 | struct platform_device *pdev; |
| @@ -530,7 +520,7 @@ static ssize_t | |||
| 530 | modalias_show(struct device *dev, struct device_attribute *a, char *buf) | 520 | modalias_show(struct device *dev, struct device_attribute *a, char *buf) |
| 531 | { | 521 | { |
| 532 | struct platform_device *pdev = to_platform_device(dev); | 522 | struct platform_device *pdev = to_platform_device(dev); |
| 533 | int len = snprintf(buf, PAGE_SIZE, "%s\n", pdev->name); | 523 | int len = snprintf(buf, PAGE_SIZE, "platform:%s\n", pdev->name); |
| 534 | 524 | ||
| 535 | return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; | 525 | return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; |
| 536 | } | 526 | } |
| @@ -540,13 +530,11 @@ static struct device_attribute platform_dev_attrs[] = { | |||
| 540 | __ATTR_NULL, | 530 | __ATTR_NULL, |
| 541 | }; | 531 | }; |
| 542 | 532 | ||
| 543 | static int platform_uevent(struct device *dev, char **envp, int num_envp, | 533 | static int platform_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 544 | char *buffer, int buffer_size) | ||
| 545 | { | 534 | { |
| 546 | struct platform_device *pdev = to_platform_device(dev); | 535 | struct platform_device *pdev = to_platform_device(dev); |
| 547 | 536 | ||
| 548 | envp[0] = buffer; | 537 | add_uevent_var(env, "MODALIAS=platform:%s", pdev->name); |
| 549 | snprintf(buffer, buffer_size, "MODALIAS=%s", pdev->name); | ||
| 550 | return 0; | 538 | return 0; |
| 551 | } | 539 | } |
| 552 | 540 | ||
diff --git a/drivers/base/power/Makefile b/drivers/base/power/Makefile index 9caeaea753a3..a803733c839e 100644 --- a/drivers/base/power/Makefile +++ b/drivers/base/power/Makefile | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | obj-y := shutdown.o | 1 | obj-y := shutdown.o |
| 2 | obj-$(CONFIG_PM_SLEEP) += main.o suspend.o resume.o sysfs.o | 2 | obj-$(CONFIG_PM_SLEEP) += main.o sysfs.o |
| 3 | obj-$(CONFIG_PM_TRACE) += trace.o | 3 | obj-$(CONFIG_PM_TRACE) += trace.o |
| 4 | 4 | ||
| 5 | ifeq ($(CONFIG_DEBUG_DRIVER),y) | 5 | ifeq ($(CONFIG_DEBUG_DRIVER),y) |
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index eb9f38d0aa58..0ab4ab21f564 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
| @@ -20,19 +20,24 @@ | |||
| 20 | */ | 20 | */ |
| 21 | 21 | ||
| 22 | #include <linux/device.h> | 22 | #include <linux/device.h> |
| 23 | #include <linux/kallsyms.h> | ||
| 23 | #include <linux/mutex.h> | 24 | #include <linux/mutex.h> |
| 25 | #include <linux/pm.h> | ||
| 26 | #include <linux/resume-trace.h> | ||
| 24 | 27 | ||
| 28 | #include "../base.h" | ||
| 25 | #include "power.h" | 29 | #include "power.h" |
| 26 | 30 | ||
| 27 | LIST_HEAD(dpm_active); | 31 | LIST_HEAD(dpm_active); |
| 28 | LIST_HEAD(dpm_off); | 32 | static LIST_HEAD(dpm_off); |
| 29 | LIST_HEAD(dpm_off_irq); | 33 | static LIST_HEAD(dpm_off_irq); |
| 30 | 34 | ||
| 31 | DEFINE_MUTEX(dpm_mtx); | 35 | static DEFINE_MUTEX(dpm_mtx); |
| 32 | DEFINE_MUTEX(dpm_list_mtx); | 36 | static DEFINE_MUTEX(dpm_list_mtx); |
| 33 | 37 | ||
| 34 | int (*platform_enable_wakeup)(struct device *dev, int is_on); | 38 | int (*platform_enable_wakeup)(struct device *dev, int is_on); |
| 35 | 39 | ||
| 40 | |||
| 36 | int device_pm_add(struct device *dev) | 41 | int device_pm_add(struct device *dev) |
| 37 | { | 42 | { |
| 38 | int error; | 43 | int error; |
| @@ -61,3 +66,334 @@ void device_pm_remove(struct device *dev) | |||
| 61 | } | 66 | } |
| 62 | 67 | ||
| 63 | 68 | ||
| 69 | /*------------------------- Resume routines -------------------------*/ | ||
| 70 | |||
| 71 | /** | ||
| 72 | * resume_device - Restore state for one device. | ||
| 73 | * @dev: Device. | ||
| 74 | * | ||
| 75 | */ | ||
| 76 | |||
| 77 | static int resume_device(struct device * dev) | ||
| 78 | { | ||
| 79 | int error = 0; | ||
| 80 | |||
| 81 | TRACE_DEVICE(dev); | ||
| 82 | TRACE_RESUME(0); | ||
| 83 | |||
| 84 | down(&dev->sem); | ||
| 85 | |||
| 86 | if (dev->bus && dev->bus->resume) { | ||
| 87 | dev_dbg(dev,"resuming\n"); | ||
| 88 | error = dev->bus->resume(dev); | ||
| 89 | } | ||
| 90 | |||
| 91 | if (!error && dev->type && dev->type->resume) { | ||
| 92 | dev_dbg(dev,"resuming\n"); | ||
| 93 | error = dev->type->resume(dev); | ||
| 94 | } | ||
| 95 | |||
| 96 | if (!error && dev->class && dev->class->resume) { | ||
| 97 | dev_dbg(dev,"class resume\n"); | ||
| 98 | error = dev->class->resume(dev); | ||
| 99 | } | ||
| 100 | |||
| 101 | up(&dev->sem); | ||
| 102 | |||
| 103 | TRACE_RESUME(error); | ||
| 104 | return error; | ||
| 105 | } | ||
| 106 | |||
| 107 | |||
| 108 | static int resume_device_early(struct device * dev) | ||
| 109 | { | ||
| 110 | int error = 0; | ||
| 111 | |||
| 112 | TRACE_DEVICE(dev); | ||
| 113 | TRACE_RESUME(0); | ||
| 114 | if (dev->bus && dev->bus->resume_early) { | ||
| 115 | dev_dbg(dev,"EARLY resume\n"); | ||
| 116 | error = dev->bus->resume_early(dev); | ||
| 117 | } | ||
| 118 | TRACE_RESUME(error); | ||
| 119 | return error; | ||
| 120 | } | ||
| 121 | |||
| 122 | /* | ||
| 123 | * Resume the devices that have either not gone through | ||
| 124 | * the late suspend, or that did go through it but also | ||
| 125 | * went through the early resume | ||
| 126 | */ | ||
| 127 | static void dpm_resume(void) | ||
| 128 | { | ||
| 129 | mutex_lock(&dpm_list_mtx); | ||
| 130 | while(!list_empty(&dpm_off)) { | ||
| 131 | struct list_head * entry = dpm_off.next; | ||
| 132 | struct device * dev = to_device(entry); | ||
| 133 | |||
| 134 | get_device(dev); | ||
| 135 | list_move_tail(entry, &dpm_active); | ||
| 136 | |||
| 137 | mutex_unlock(&dpm_list_mtx); | ||
| 138 | resume_device(dev); | ||
| 139 | mutex_lock(&dpm_list_mtx); | ||
| 140 | put_device(dev); | ||
| 141 | } | ||
| 142 | mutex_unlock(&dpm_list_mtx); | ||
| 143 | } | ||
| 144 | |||
| 145 | |||
| 146 | /** | ||
| 147 | * device_resume - Restore state of each device in system. | ||
| 148 | * | ||
| 149 | * Walk the dpm_off list, remove each entry, resume the device, | ||
| 150 | * then add it to the dpm_active list. | ||
| 151 | */ | ||
| 152 | |||
| 153 | void device_resume(void) | ||
| 154 | { | ||
| 155 | might_sleep(); | ||
| 156 | mutex_lock(&dpm_mtx); | ||
| 157 | dpm_resume(); | ||
| 158 | mutex_unlock(&dpm_mtx); | ||
| 159 | } | ||
| 160 | |||
| 161 | EXPORT_SYMBOL_GPL(device_resume); | ||
| 162 | |||
| 163 | |||
| 164 | /** | ||
| 165 | * dpm_power_up - Power on some devices. | ||
| 166 | * | ||
| 167 | * Walk the dpm_off_irq list and power each device up. This | ||
| 168 | * is used for devices that required they be powered down with | ||
| 169 | * interrupts disabled. As devices are powered on, they are moved | ||
| 170 | * to the dpm_active list. | ||
| 171 | * | ||
| 172 | * Interrupts must be disabled when calling this. | ||
| 173 | */ | ||
| 174 | |||
| 175 | static void dpm_power_up(void) | ||
| 176 | { | ||
| 177 | while(!list_empty(&dpm_off_irq)) { | ||
| 178 | struct list_head * entry = dpm_off_irq.next; | ||
| 179 | struct device * dev = to_device(entry); | ||
| 180 | |||
| 181 | list_move_tail(entry, &dpm_off); | ||
| 182 | resume_device_early(dev); | ||
| 183 | } | ||
| 184 | } | ||
| 185 | |||
| 186 | |||
| 187 | /** | ||
| 188 | * device_power_up - Turn on all devices that need special attention. | ||
| 189 | * | ||
| 190 | * Power on system devices then devices that required we shut them down | ||
| 191 | * with interrupts disabled. | ||
| 192 | * Called with interrupts disabled. | ||
| 193 | */ | ||
| 194 | |||
| 195 | void device_power_up(void) | ||
| 196 | { | ||
| 197 | sysdev_resume(); | ||
| 198 | dpm_power_up(); | ||
| 199 | } | ||
| 200 | |||
| 201 | EXPORT_SYMBOL_GPL(device_power_up); | ||
| 202 | |||
| 203 | |||
| 204 | /*------------------------- Suspend routines -------------------------*/ | ||
| 205 | |||
| 206 | /* | ||
| 207 | * The entries in the dpm_active list are in a depth first order, simply | ||
| 208 | * because children are guaranteed to be discovered after parents, and | ||
| 209 | * are inserted at the back of the list on discovery. | ||
| 210 | * | ||
| 211 | * All list on the suspend path are done in reverse order, so we operate | ||
| 212 | * on the leaves of the device tree (or forests, depending on how you want | ||
| 213 | * to look at it ;) first. As nodes are removed from the back of the list, | ||
| 214 | * they are inserted into the front of their destintation lists. | ||
| 215 | * | ||
| 216 | * Things are the reverse on the resume path - iterations are done in | ||
| 217 | * forward order, and nodes are inserted at the back of their destination | ||
| 218 | * lists. This way, the ancestors will be accessed before their descendents. | ||
| 219 | */ | ||
| 220 | |||
| 221 | static inline char *suspend_verb(u32 event) | ||
| 222 | { | ||
| 223 | switch (event) { | ||
| 224 | case PM_EVENT_SUSPEND: return "suspend"; | ||
| 225 | case PM_EVENT_FREEZE: return "freeze"; | ||
| 226 | case PM_EVENT_PRETHAW: return "prethaw"; | ||
| 227 | default: return "(unknown suspend event)"; | ||
| 228 | } | ||
| 229 | } | ||
| 230 | |||
| 231 | |||
| 232 | static void | ||
| 233 | suspend_device_dbg(struct device *dev, pm_message_t state, char *info) | ||
| 234 | { | ||
| 235 | dev_dbg(dev, "%s%s%s\n", info, suspend_verb(state.event), | ||
| 236 | ((state.event == PM_EVENT_SUSPEND) && device_may_wakeup(dev)) ? | ||
| 237 | ", may wakeup" : ""); | ||
| 238 | } | ||
| 239 | |||
| 240 | /** | ||
| 241 | * suspend_device - Save state of one device. | ||
| 242 | * @dev: Device. | ||
| 243 | * @state: Power state device is entering. | ||
| 244 | */ | ||
| 245 | |||
| 246 | static int suspend_device(struct device * dev, pm_message_t state) | ||
| 247 | { | ||
| 248 | int error = 0; | ||
| 249 | |||
| 250 | down(&dev->sem); | ||
| 251 | if (dev->power.power_state.event) { | ||
| 252 | dev_dbg(dev, "PM: suspend %d-->%d\n", | ||
| 253 | dev->power.power_state.event, state.event); | ||
| 254 | } | ||
| 255 | |||
| 256 | if (dev->class && dev->class->suspend) { | ||
| 257 | suspend_device_dbg(dev, state, "class "); | ||
| 258 | error = dev->class->suspend(dev, state); | ||
| 259 | suspend_report_result(dev->class->suspend, error); | ||
| 260 | } | ||
| 261 | |||
| 262 | if (!error && dev->type && dev->type->suspend) { | ||
| 263 | suspend_device_dbg(dev, state, "type "); | ||
| 264 | error = dev->type->suspend(dev, state); | ||
| 265 | suspend_report_result(dev->type->suspend, error); | ||
| 266 | } | ||
| 267 | |||
| 268 | if (!error && dev->bus && dev->bus->suspend) { | ||
| 269 | suspend_device_dbg(dev, state, ""); | ||
| 270 | error = dev->bus->suspend(dev, state); | ||
| 271 | suspend_report_result(dev->bus->suspend, error); | ||
| 272 | } | ||
| 273 | up(&dev->sem); | ||
| 274 | return error; | ||
| 275 | } | ||
| 276 | |||
| 277 | |||
| 278 | /* | ||
| 279 | * This is called with interrupts off, only a single CPU | ||
| 280 | * running. We can't acquire a mutex or semaphore (and we don't | ||
| 281 | * need the protection) | ||
| 282 | */ | ||
| 283 | static int suspend_device_late(struct device *dev, pm_message_t state) | ||
| 284 | { | ||
| 285 | int error = 0; | ||
| 286 | |||
| 287 | if (dev->bus && dev->bus->suspend_late) { | ||
| 288 | suspend_device_dbg(dev, state, "LATE "); | ||
| 289 | error = dev->bus->suspend_late(dev, state); | ||
| 290 | suspend_report_result(dev->bus->suspend_late, error); | ||
| 291 | } | ||
| 292 | return error; | ||
| 293 | } | ||
| 294 | |||
| 295 | /** | ||
| 296 | * device_suspend - Save state and stop all devices in system. | ||
| 297 | * @state: Power state to put each device in. | ||
| 298 | * | ||
| 299 | * Walk the dpm_active list, call ->suspend() for each device, and move | ||
| 300 | * it to the dpm_off list. | ||
| 301 | * | ||
| 302 | * (For historical reasons, if it returns -EAGAIN, that used to mean | ||
| 303 | * that the device would be called again with interrupts disabled. | ||
| 304 | * These days, we use the "suspend_late()" callback for that, so we | ||
| 305 | * print a warning and consider it an error). | ||
| 306 | * | ||
| 307 | * If we get a different error, try and back out. | ||
| 308 | * | ||
| 309 | * If we hit a failure with any of the devices, call device_resume() | ||
| 310 | * above to bring the suspended devices back to life. | ||
| 311 | * | ||
| 312 | */ | ||
| 313 | |||
| 314 | int device_suspend(pm_message_t state) | ||
| 315 | { | ||
| 316 | int error = 0; | ||
| 317 | |||
| 318 | might_sleep(); | ||
| 319 | mutex_lock(&dpm_mtx); | ||
| 320 | mutex_lock(&dpm_list_mtx); | ||
| 321 | while (!list_empty(&dpm_active) && error == 0) { | ||
| 322 | struct list_head * entry = dpm_active.prev; | ||
| 323 | struct device * dev = to_device(entry); | ||
| 324 | |||
| 325 | get_device(dev); | ||
| 326 | mutex_unlock(&dpm_list_mtx); | ||
| 327 | |||
| 328 | error = suspend_device(dev, state); | ||
| 329 | |||
| 330 | mutex_lock(&dpm_list_mtx); | ||
| 331 | |||
| 332 | /* Check if the device got removed */ | ||
| 333 | if (!list_empty(&dev->power.entry)) { | ||
| 334 | /* Move it to the dpm_off list */ | ||
| 335 | if (!error) | ||
| 336 | list_move(&dev->power.entry, &dpm_off); | ||
| 337 | } | ||
| 338 | if (error) | ||
| 339 | printk(KERN_ERR "Could not suspend device %s: " | ||
| 340 | "error %d%s\n", | ||
| 341 | kobject_name(&dev->kobj), error, | ||
| 342 | error == -EAGAIN ? " (please convert to suspend_late)" : ""); | ||
| 343 | put_device(dev); | ||
| 344 | } | ||
| 345 | mutex_unlock(&dpm_list_mtx); | ||
| 346 | if (error) | ||
| 347 | dpm_resume(); | ||
| 348 | |||
| 349 | mutex_unlock(&dpm_mtx); | ||
| 350 | return error; | ||
| 351 | } | ||
| 352 | |||
| 353 | EXPORT_SYMBOL_GPL(device_suspend); | ||
| 354 | |||
| 355 | /** | ||
| 356 | * device_power_down - Shut down special devices. | ||
| 357 | * @state: Power state to enter. | ||
| 358 | * | ||
| 359 | * Walk the dpm_off_irq list, calling ->power_down() for each device that | ||
| 360 | * couldn't power down the device with interrupts enabled. When we're | ||
| 361 | * done, power down system devices. | ||
| 362 | */ | ||
| 363 | |||
| 364 | int device_power_down(pm_message_t state) | ||
| 365 | { | ||
| 366 | int error = 0; | ||
| 367 | struct device * dev; | ||
| 368 | |||
| 369 | while (!list_empty(&dpm_off)) { | ||
| 370 | struct list_head * entry = dpm_off.prev; | ||
| 371 | |||
| 372 | dev = to_device(entry); | ||
| 373 | error = suspend_device_late(dev, state); | ||
| 374 | if (error) | ||
| 375 | goto Error; | ||
| 376 | list_move(&dev->power.entry, &dpm_off_irq); | ||
| 377 | } | ||
| 378 | |||
| 379 | error = sysdev_suspend(state); | ||
| 380 | Done: | ||
| 381 | return error; | ||
| 382 | Error: | ||
| 383 | printk(KERN_ERR "Could not power down device %s: " | ||
| 384 | "error %d\n", kobject_name(&dev->kobj), error); | ||
| 385 | dpm_power_up(); | ||
| 386 | goto Done; | ||
| 387 | } | ||
| 388 | |||
| 389 | EXPORT_SYMBOL_GPL(device_power_down); | ||
| 390 | |||
| 391 | void __suspend_report_result(const char *function, void *fn, int ret) | ||
| 392 | { | ||
| 393 | if (ret) { | ||
| 394 | printk(KERN_ERR "%s(): ", function); | ||
| 395 | print_fn_descriptor_symbol("%s() returns ", (unsigned long)fn); | ||
| 396 | printk("%d\n", ret); | ||
| 397 | } | ||
| 398 | } | ||
| 399 | EXPORT_SYMBOL_GPL(__suspend_report_result); | ||
diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h index 8ba0830cbc03..5c4efd493fa5 100644 --- a/drivers/base/power/power.h +++ b/drivers/base/power/power.h | |||
| @@ -11,32 +11,11 @@ extern void device_shutdown(void); | |||
| 11 | * main.c | 11 | * main.c |
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | /* | 14 | extern struct list_head dpm_active; /* The active device list */ |
| 15 | * Used to synchronize global power management operations. | ||
| 16 | */ | ||
| 17 | extern struct mutex dpm_mtx; | ||
| 18 | |||
| 19 | /* | ||
| 20 | * Used to serialize changes to the dpm_* lists. | ||
| 21 | */ | ||
| 22 | extern struct mutex dpm_list_mtx; | ||
| 23 | |||
| 24 | /* | ||
| 25 | * The PM lists. | ||
| 26 | */ | ||
| 27 | extern struct list_head dpm_active; | ||
| 28 | extern struct list_head dpm_off; | ||
| 29 | extern struct list_head dpm_off_irq; | ||
| 30 | |||
| 31 | |||
| 32 | static inline struct dev_pm_info * to_pm_info(struct list_head * entry) | ||
| 33 | { | ||
| 34 | return container_of(entry, struct dev_pm_info, entry); | ||
| 35 | } | ||
| 36 | 15 | ||
| 37 | static inline struct device * to_device(struct list_head * entry) | 16 | static inline struct device * to_device(struct list_head * entry) |
| 38 | { | 17 | { |
| 39 | return container_of(to_pm_info(entry), struct device, power); | 18 | return container_of(entry, struct device, power.entry); |
| 40 | } | 19 | } |
| 41 | 20 | ||
| 42 | extern int device_pm_add(struct device *); | 21 | extern int device_pm_add(struct device *); |
| @@ -49,19 +28,6 @@ extern void device_pm_remove(struct device *); | |||
| 49 | extern int dpm_sysfs_add(struct device *); | 28 | extern int dpm_sysfs_add(struct device *); |
| 50 | extern void dpm_sysfs_remove(struct device *); | 29 | extern void dpm_sysfs_remove(struct device *); |
| 51 | 30 | ||
| 52 | /* | ||
| 53 | * resume.c | ||
| 54 | */ | ||
| 55 | |||
| 56 | extern void dpm_resume(void); | ||
| 57 | extern void dpm_power_up(void); | ||
| 58 | extern int resume_device(struct device *); | ||
| 59 | |||
| 60 | /* | ||
| 61 | * suspend.c | ||
| 62 | */ | ||
| 63 | extern int suspend_device(struct device *, pm_message_t); | ||
| 64 | |||
| 65 | #else /* CONFIG_PM_SLEEP */ | 31 | #else /* CONFIG_PM_SLEEP */ |
| 66 | 32 | ||
| 67 | 33 | ||
diff --git a/drivers/base/power/resume.c b/drivers/base/power/resume.c deleted file mode 100644 index 00fd84ae6e66..000000000000 --- a/drivers/base/power/resume.c +++ /dev/null | |||
| @@ -1,149 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * resume.c - Functions for waking devices up. | ||
| 3 | * | ||
| 4 | * Copyright (c) 2003 Patrick Mochel | ||
| 5 | * Copyright (c) 2003 Open Source Development Labs | ||
| 6 | * | ||
| 7 | * This file is released under the GPLv2 | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/device.h> | ||
| 12 | #include <linux/resume-trace.h> | ||
| 13 | #include "../base.h" | ||
| 14 | #include "power.h" | ||
| 15 | |||
| 16 | |||
| 17 | /** | ||
| 18 | * resume_device - Restore state for one device. | ||
| 19 | * @dev: Device. | ||
| 20 | * | ||
| 21 | */ | ||
| 22 | |||
| 23 | int resume_device(struct device * dev) | ||
| 24 | { | ||
| 25 | int error = 0; | ||
| 26 | |||
| 27 | TRACE_DEVICE(dev); | ||
| 28 | TRACE_RESUME(0); | ||
| 29 | |||
| 30 | down(&dev->sem); | ||
| 31 | |||
| 32 | if (dev->bus && dev->bus->resume) { | ||
| 33 | dev_dbg(dev,"resuming\n"); | ||
| 34 | error = dev->bus->resume(dev); | ||
| 35 | } | ||
| 36 | |||
| 37 | if (!error && dev->type && dev->type->resume) { | ||
| 38 | dev_dbg(dev,"resuming\n"); | ||
| 39 | error = dev->type->resume(dev); | ||
| 40 | } | ||
| 41 | |||
| 42 | if (!error && dev->class && dev->class->resume) { | ||
| 43 | dev_dbg(dev,"class resume\n"); | ||
| 44 | error = dev->class->resume(dev); | ||
| 45 | } | ||
| 46 | |||
| 47 | up(&dev->sem); | ||
| 48 | |||
| 49 | TRACE_RESUME(error); | ||
| 50 | return error; | ||
| 51 | } | ||
| 52 | |||
| 53 | |||
| 54 | static int resume_device_early(struct device * dev) | ||
| 55 | { | ||
| 56 | int error = 0; | ||
| 57 | |||
| 58 | TRACE_DEVICE(dev); | ||
| 59 | TRACE_RESUME(0); | ||
| 60 | if (dev->bus && dev->bus->resume_early) { | ||
| 61 | dev_dbg(dev,"EARLY resume\n"); | ||
| 62 | error = dev->bus->resume_early(dev); | ||
| 63 | } | ||
| 64 | TRACE_RESUME(error); | ||
| 65 | return error; | ||
| 66 | } | ||
| 67 | |||
| 68 | /* | ||
| 69 | * Resume the devices that have either not gone through | ||
| 70 | * the late suspend, or that did go through it but also | ||
| 71 | * went through the early resume | ||
| 72 | */ | ||
| 73 | void dpm_resume(void) | ||
| 74 | { | ||
| 75 | mutex_lock(&dpm_list_mtx); | ||
| 76 | while(!list_empty(&dpm_off)) { | ||
| 77 | struct list_head * entry = dpm_off.next; | ||
| 78 | struct device * dev = to_device(entry); | ||
| 79 | |||
| 80 | get_device(dev); | ||
| 81 | list_move_tail(entry, &dpm_active); | ||
| 82 | |||
| 83 | mutex_unlock(&dpm_list_mtx); | ||
| 84 | resume_device(dev); | ||
| 85 | mutex_lock(&dpm_list_mtx); | ||
| 86 | put_device(dev); | ||
| 87 | } | ||
| 88 | mutex_unlock(&dpm_list_mtx); | ||
| 89 | } | ||
| 90 | |||
| 91 | |||
| 92 | /** | ||
| 93 | * device_resume - Restore state of each device in system. | ||
| 94 | * | ||
| 95 | * Walk the dpm_off list, remove each entry, resume the device, | ||
| 96 | * then add it to the dpm_active list. | ||
| 97 | */ | ||
| 98 | |||
| 99 | void device_resume(void) | ||
| 100 | { | ||
| 101 | might_sleep(); | ||
| 102 | mutex_lock(&dpm_mtx); | ||
| 103 | dpm_resume(); | ||
| 104 | mutex_unlock(&dpm_mtx); | ||
| 105 | } | ||
| 106 | |||
| 107 | EXPORT_SYMBOL_GPL(device_resume); | ||
| 108 | |||
| 109 | |||
| 110 | /** | ||
| 111 | * dpm_power_up - Power on some devices. | ||
| 112 | * | ||
| 113 | * Walk the dpm_off_irq list and power each device up. This | ||
| 114 | * is used for devices that required they be powered down with | ||
| 115 | * interrupts disabled. As devices are powered on, they are moved | ||
| 116 | * to the dpm_active list. | ||
| 117 | * | ||
| 118 | * Interrupts must be disabled when calling this. | ||
| 119 | */ | ||
| 120 | |||
| 121 | void dpm_power_up(void) | ||
| 122 | { | ||
| 123 | while(!list_empty(&dpm_off_irq)) { | ||
| 124 | struct list_head * entry = dpm_off_irq.next; | ||
| 125 | struct device * dev = to_device(entry); | ||
| 126 | |||
| 127 | list_move_tail(entry, &dpm_off); | ||
| 128 | resume_device_early(dev); | ||
| 129 | } | ||
| 130 | } | ||
| 131 | |||
| 132 | |||
| 133 | /** | ||
| 134 | * device_power_up - Turn on all devices that need special attention. | ||
| 135 | * | ||
| 136 | * Power on system devices then devices that required we shut them down | ||
| 137 | * with interrupts disabled. | ||
| 138 | * Called with interrupts disabled. | ||
| 139 | */ | ||
| 140 | |||
| 141 | void device_power_up(void) | ||
| 142 | { | ||
| 143 | sysdev_resume(); | ||
| 144 | dpm_power_up(); | ||
| 145 | } | ||
| 146 | |||
| 147 | EXPORT_SYMBOL_GPL(device_power_up); | ||
| 148 | |||
| 149 | |||
diff --git a/drivers/base/power/suspend.c b/drivers/base/power/suspend.c deleted file mode 100644 index 26df9b231737..000000000000 --- a/drivers/base/power/suspend.c +++ /dev/null | |||
| @@ -1,210 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * suspend.c - Functions for putting devices to sleep. | ||
| 3 | * | ||
| 4 | * Copyright (c) 2003 Patrick Mochel | ||
| 5 | * Copyright (c) 2003 Open Source Development Labs | ||
| 6 | * | ||
| 7 | * This file is released under the GPLv2 | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/device.h> | ||
| 12 | #include <linux/kallsyms.h> | ||
| 13 | #include <linux/pm.h> | ||
| 14 | #include "../base.h" | ||
| 15 | #include "power.h" | ||
| 16 | |||
| 17 | /* | ||
| 18 | * The entries in the dpm_active list are in a depth first order, simply | ||
| 19 | * because children are guaranteed to be discovered after parents, and | ||
| 20 | * are inserted at the back of the list on discovery. | ||
| 21 | * | ||
| 22 | * All list on the suspend path are done in reverse order, so we operate | ||
| 23 | * on the leaves of the device tree (or forests, depending on how you want | ||
| 24 | * to look at it ;) first. As nodes are removed from the back of the list, | ||
| 25 | * they are inserted into the front of their destintation lists. | ||
| 26 | * | ||
| 27 | * Things are the reverse on the resume path - iterations are done in | ||
| 28 | * forward order, and nodes are inserted at the back of their destination | ||
| 29 | * lists. This way, the ancestors will be accessed before their descendents. | ||
| 30 | */ | ||
| 31 | |||
| 32 | static inline char *suspend_verb(u32 event) | ||
| 33 | { | ||
| 34 | switch (event) { | ||
| 35 | case PM_EVENT_SUSPEND: return "suspend"; | ||
| 36 | case PM_EVENT_FREEZE: return "freeze"; | ||
| 37 | case PM_EVENT_PRETHAW: return "prethaw"; | ||
| 38 | default: return "(unknown suspend event)"; | ||
| 39 | } | ||
| 40 | } | ||
| 41 | |||
| 42 | |||
| 43 | static void | ||
| 44 | suspend_device_dbg(struct device *dev, pm_message_t state, char *info) | ||
| 45 | { | ||
| 46 | dev_dbg(dev, "%s%s%s\n", info, suspend_verb(state.event), | ||
| 47 | ((state.event == PM_EVENT_SUSPEND) && device_may_wakeup(dev)) ? | ||
| 48 | ", may wakeup" : ""); | ||
| 49 | } | ||
| 50 | |||
| 51 | /** | ||
| 52 | * suspend_device - Save state of one device. | ||
| 53 | * @dev: Device. | ||
| 54 | * @state: Power state device is entering. | ||
| 55 | */ | ||
| 56 | |||
| 57 | int suspend_device(struct device * dev, pm_message_t state) | ||
| 58 | { | ||
| 59 | int error = 0; | ||
| 60 | |||
| 61 | down(&dev->sem); | ||
| 62 | if (dev->power.power_state.event) { | ||
| 63 | dev_dbg(dev, "PM: suspend %d-->%d\n", | ||
| 64 | dev->power.power_state.event, state.event); | ||
| 65 | } | ||
| 66 | |||
| 67 | if (dev->class && dev->class->suspend) { | ||
| 68 | suspend_device_dbg(dev, state, "class "); | ||
| 69 | error = dev->class->suspend(dev, state); | ||
| 70 | suspend_report_result(dev->class->suspend, error); | ||
| 71 | } | ||
| 72 | |||
| 73 | if (!error && dev->type && dev->type->suspend) { | ||
| 74 | suspend_device_dbg(dev, state, "type "); | ||
| 75 | error = dev->type->suspend(dev, state); | ||
| 76 | suspend_report_result(dev->type->suspend, error); | ||
| 77 | } | ||
| 78 | |||
| 79 | if (!error && dev->bus && dev->bus->suspend) { | ||
| 80 | suspend_device_dbg(dev, state, ""); | ||
| 81 | error = dev->bus->suspend(dev, state); | ||
| 82 | suspend_report_result(dev->bus->suspend, error); | ||
| 83 | } | ||
| 84 | up(&dev->sem); | ||
| 85 | return error; | ||
| 86 | } | ||
| 87 | |||
| 88 | |||
| 89 | /* | ||
| 90 | * This is called with interrupts off, only a single CPU | ||
| 91 | * running. We can't acquire a mutex or semaphore (and we don't | ||
| 92 | * need the protection) | ||
| 93 | */ | ||
| 94 | static int suspend_device_late(struct device *dev, pm_message_t state) | ||
| 95 | { | ||
| 96 | int error = 0; | ||
| 97 | |||
| 98 | if (dev->bus && dev->bus->suspend_late) { | ||
| 99 | suspend_device_dbg(dev, state, "LATE "); | ||
| 100 | error = dev->bus->suspend_late(dev, state); | ||
| 101 | suspend_report_result(dev->bus->suspend_late, error); | ||
| 102 | } | ||
| 103 | return error; | ||
| 104 | } | ||
| 105 | |||
| 106 | /** | ||
| 107 | * device_suspend - Save state and stop all devices in system. | ||
| 108 | * @state: Power state to put each device in. | ||
| 109 | * | ||
| 110 | * Walk the dpm_active list, call ->suspend() for each device, and move | ||
| 111 | * it to the dpm_off list. | ||
| 112 | * | ||
| 113 | * (For historical reasons, if it returns -EAGAIN, that used to mean | ||
| 114 | * that the device would be called again with interrupts disabled. | ||
| 115 | * These days, we use the "suspend_late()" callback for that, so we | ||
| 116 | * print a warning and consider it an error). | ||
| 117 | * | ||
| 118 | * If we get a different error, try and back out. | ||
| 119 | * | ||
| 120 | * If we hit a failure with any of the devices, call device_resume() | ||
| 121 | * above to bring the suspended devices back to life. | ||
| 122 | * | ||
| 123 | */ | ||
| 124 | |||
| 125 | int device_suspend(pm_message_t state) | ||
| 126 | { | ||
| 127 | int error = 0; | ||
| 128 | |||
| 129 | might_sleep(); | ||
| 130 | mutex_lock(&dpm_mtx); | ||
| 131 | mutex_lock(&dpm_list_mtx); | ||
| 132 | while (!list_empty(&dpm_active) && error == 0) { | ||
| 133 | struct list_head * entry = dpm_active.prev; | ||
| 134 | struct device * dev = to_device(entry); | ||
| 135 | |||
| 136 | get_device(dev); | ||
| 137 | mutex_unlock(&dpm_list_mtx); | ||
| 138 | |||
| 139 | error = suspend_device(dev, state); | ||
| 140 | |||
| 141 | mutex_lock(&dpm_list_mtx); | ||
| 142 | |||
| 143 | /* Check if the device got removed */ | ||
| 144 | if (!list_empty(&dev->power.entry)) { | ||
| 145 | /* Move it to the dpm_off list */ | ||
| 146 | if (!error) | ||
| 147 | list_move(&dev->power.entry, &dpm_off); | ||
| 148 | } | ||
| 149 | if (error) | ||
| 150 | printk(KERN_ERR "Could not suspend device %s: " | ||
| 151 | "error %d%s\n", | ||
| 152 | kobject_name(&dev->kobj), error, | ||
| 153 | error == -EAGAIN ? " (please convert to suspend_late)" : ""); | ||
| 154 | put_device(dev); | ||
| 155 | } | ||
| 156 | mutex_unlock(&dpm_list_mtx); | ||
| 157 | if (error) | ||
| 158 | dpm_resume(); | ||
| 159 | |||
| 160 | mutex_unlock(&dpm_mtx); | ||
| 161 | return error; | ||
| 162 | } | ||
| 163 | |||
| 164 | EXPORT_SYMBOL_GPL(device_suspend); | ||
| 165 | |||
| 166 | /** | ||
| 167 | * device_power_down - Shut down special devices. | ||
| 168 | * @state: Power state to enter. | ||
| 169 | * | ||
| 170 | * Walk the dpm_off_irq list, calling ->power_down() for each device that | ||
| 171 | * couldn't power down the device with interrupts enabled. When we're | ||
| 172 | * done, power down system devices. | ||
| 173 | */ | ||
| 174 | |||
| 175 | int device_power_down(pm_message_t state) | ||
| 176 | { | ||
| 177 | int error = 0; | ||
| 178 | struct device * dev; | ||
| 179 | |||
| 180 | while (!list_empty(&dpm_off)) { | ||
| 181 | struct list_head * entry = dpm_off.prev; | ||
| 182 | |||
| 183 | dev = to_device(entry); | ||
| 184 | error = suspend_device_late(dev, state); | ||
| 185 | if (error) | ||
| 186 | goto Error; | ||
| 187 | list_move(&dev->power.entry, &dpm_off_irq); | ||
| 188 | } | ||
| 189 | |||
| 190 | error = sysdev_suspend(state); | ||
| 191 | Done: | ||
| 192 | return error; | ||
| 193 | Error: | ||
| 194 | printk(KERN_ERR "Could not power down device %s: " | ||
| 195 | "error %d\n", kobject_name(&dev->kobj), error); | ||
| 196 | dpm_power_up(); | ||
| 197 | goto Done; | ||
| 198 | } | ||
| 199 | |||
| 200 | EXPORT_SYMBOL_GPL(device_power_down); | ||
| 201 | |||
| 202 | void __suspend_report_result(const char *function, void *fn, int ret) | ||
| 203 | { | ||
| 204 | if (ret) { | ||
| 205 | printk(KERN_ERR "%s(): ", function); | ||
| 206 | print_fn_descriptor_symbol("%s() returns ", (unsigned long)fn); | ||
| 207 | printk("%d\n", ret); | ||
| 208 | } | ||
| 209 | } | ||
| 210 | EXPORT_SYMBOL_GPL(__suspend_report_result); | ||
diff --git a/drivers/base/sys.c b/drivers/base/sys.c index 18febe26caa1..ac7ff6d0c6e5 100644 --- a/drivers/base/sys.c +++ b/drivers/base/sys.c | |||
| @@ -139,7 +139,7 @@ int sysdev_class_register(struct sysdev_class * cls) | |||
| 139 | kobject_name(&cls->kset.kobj)); | 139 | kobject_name(&cls->kset.kobj)); |
| 140 | INIT_LIST_HEAD(&cls->drivers); | 140 | INIT_LIST_HEAD(&cls->drivers); |
| 141 | cls->kset.kobj.parent = &system_subsys.kobj; | 141 | cls->kset.kobj.parent = &system_subsys.kobj; |
| 142 | kset_set_kset_s(cls, system_subsys); | 142 | cls->kset.kobj.kset = &system_subsys; |
| 143 | return kset_register(&cls->kset); | 143 | return kset_register(&cls->kset); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| @@ -153,25 +153,22 @@ void sysdev_class_unregister(struct sysdev_class * cls) | |||
| 153 | EXPORT_SYMBOL_GPL(sysdev_class_register); | 153 | EXPORT_SYMBOL_GPL(sysdev_class_register); |
| 154 | EXPORT_SYMBOL_GPL(sysdev_class_unregister); | 154 | EXPORT_SYMBOL_GPL(sysdev_class_unregister); |
| 155 | 155 | ||
| 156 | |||
| 157 | static LIST_HEAD(sysdev_drivers); | ||
| 158 | static DEFINE_MUTEX(sysdev_drivers_lock); | 156 | static DEFINE_MUTEX(sysdev_drivers_lock); |
| 159 | 157 | ||
| 160 | /** | 158 | /** |
| 161 | * sysdev_driver_register - Register auxillary driver | 159 | * sysdev_driver_register - Register auxillary driver |
| 162 | * @cls: Device class driver belongs to. | 160 | * @cls: Device class driver belongs to. |
| 163 | * @drv: Driver. | 161 | * @drv: Driver. |
| 164 | * | 162 | * |
| 165 | * If @cls is valid, then @drv is inserted into @cls->drivers to be | 163 | * @drv is inserted into @cls->drivers to be |
| 166 | * called on each operation on devices of that class. The refcount | 164 | * called on each operation on devices of that class. The refcount |
| 167 | * of @cls is incremented. | 165 | * of @cls is incremented. |
| 168 | * Otherwise, @drv is inserted into sysdev_drivers, and called for | ||
| 169 | * each device. | ||
| 170 | */ | 166 | */ |
| 171 | 167 | ||
| 172 | int sysdev_driver_register(struct sysdev_class * cls, | 168 | int sysdev_driver_register(struct sysdev_class *cls, struct sysdev_driver *drv) |
| 173 | struct sysdev_driver * drv) | ||
| 174 | { | 169 | { |
| 170 | int err = 0; | ||
| 171 | |||
| 175 | mutex_lock(&sysdev_drivers_lock); | 172 | mutex_lock(&sysdev_drivers_lock); |
| 176 | if (cls && kset_get(&cls->kset)) { | 173 | if (cls && kset_get(&cls->kset)) { |
| 177 | list_add_tail(&drv->entry, &cls->drivers); | 174 | list_add_tail(&drv->entry, &cls->drivers); |
| @@ -182,10 +179,13 @@ int sysdev_driver_register(struct sysdev_class * cls, | |||
| 182 | list_for_each_entry(dev, &cls->kset.list, kobj.entry) | 179 | list_for_each_entry(dev, &cls->kset.list, kobj.entry) |
| 183 | drv->add(dev); | 180 | drv->add(dev); |
| 184 | } | 181 | } |
| 185 | } else | 182 | } else { |
| 186 | list_add_tail(&drv->entry, &sysdev_drivers); | 183 | err = -EINVAL; |
| 184 | printk(KERN_ERR "%s: invalid device class\n", __FUNCTION__); | ||
| 185 | WARN_ON(1); | ||
| 186 | } | ||
| 187 | mutex_unlock(&sysdev_drivers_lock); | 187 | mutex_unlock(&sysdev_drivers_lock); |
| 188 | return 0; | 188 | return err; |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | 191 | ||
| @@ -251,12 +251,6 @@ int sysdev_register(struct sys_device * sysdev) | |||
| 251 | * code that should have called us. | 251 | * code that should have called us. |
| 252 | */ | 252 | */ |
| 253 | 253 | ||
| 254 | /* Notify global drivers */ | ||
| 255 | list_for_each_entry(drv, &sysdev_drivers, entry) { | ||
| 256 | if (drv->add) | ||
| 257 | drv->add(sysdev); | ||
| 258 | } | ||
| 259 | |||
| 260 | /* Notify class auxillary drivers */ | 254 | /* Notify class auxillary drivers */ |
| 261 | list_for_each_entry(drv, &cls->drivers, entry) { | 255 | list_for_each_entry(drv, &cls->drivers, entry) { |
| 262 | if (drv->add) | 256 | if (drv->add) |
| @@ -272,11 +266,6 @@ void sysdev_unregister(struct sys_device * sysdev) | |||
| 272 | struct sysdev_driver * drv; | 266 | struct sysdev_driver * drv; |
| 273 | 267 | ||
| 274 | mutex_lock(&sysdev_drivers_lock); | 268 | mutex_lock(&sysdev_drivers_lock); |
| 275 | list_for_each_entry(drv, &sysdev_drivers, entry) { | ||
| 276 | if (drv->remove) | ||
| 277 | drv->remove(sysdev); | ||
| 278 | } | ||
| 279 | |||
| 280 | list_for_each_entry(drv, &sysdev->cls->drivers, entry) { | 269 | list_for_each_entry(drv, &sysdev->cls->drivers, entry) { |
| 281 | if (drv->remove) | 270 | if (drv->remove) |
| 282 | drv->remove(sysdev); | 271 | drv->remove(sysdev); |
| @@ -293,7 +282,7 @@ void sysdev_unregister(struct sys_device * sysdev) | |||
| 293 | * | 282 | * |
| 294 | * Loop over each class of system devices, and the devices in each | 283 | * Loop over each class of system devices, and the devices in each |
| 295 | * of those classes. For each device, we call the shutdown method for | 284 | * of those classes. For each device, we call the shutdown method for |
| 296 | * each driver registered for the device - the globals, the auxillaries, | 285 | * each driver registered for the device - the auxillaries, |
| 297 | * and the class driver. | 286 | * and the class driver. |
| 298 | * | 287 | * |
| 299 | * Note: The list is iterated in reverse order, so that we shut down | 288 | * Note: The list is iterated in reverse order, so that we shut down |
| @@ -320,13 +309,7 @@ void sysdev_shutdown(void) | |||
| 320 | struct sysdev_driver * drv; | 309 | struct sysdev_driver * drv; |
| 321 | pr_debug(" %s\n", kobject_name(&sysdev->kobj)); | 310 | pr_debug(" %s\n", kobject_name(&sysdev->kobj)); |
| 322 | 311 | ||
| 323 | /* Call global drivers first. */ | 312 | /* Call auxillary drivers first */ |
| 324 | list_for_each_entry(drv, &sysdev_drivers, entry) { | ||
| 325 | if (drv->shutdown) | ||
| 326 | drv->shutdown(sysdev); | ||
| 327 | } | ||
| 328 | |||
| 329 | /* Call auxillary drivers next. */ | ||
| 330 | list_for_each_entry(drv, &cls->drivers, entry) { | 313 | list_for_each_entry(drv, &cls->drivers, entry) { |
| 331 | if (drv->shutdown) | 314 | if (drv->shutdown) |
| 332 | drv->shutdown(sysdev); | 315 | drv->shutdown(sysdev); |
| @@ -354,12 +337,6 @@ static void __sysdev_resume(struct sys_device *dev) | |||
| 354 | if (drv->resume) | 337 | if (drv->resume) |
| 355 | drv->resume(dev); | 338 | drv->resume(dev); |
| 356 | } | 339 | } |
| 357 | |||
| 358 | /* Call global drivers. */ | ||
| 359 | list_for_each_entry(drv, &sysdev_drivers, entry) { | ||
| 360 | if (drv->resume) | ||
| 361 | drv->resume(dev); | ||
| 362 | } | ||
| 363 | } | 340 | } |
| 364 | 341 | ||
| 365 | /** | 342 | /** |
| @@ -393,16 +370,7 @@ int sysdev_suspend(pm_message_t state) | |||
| 393 | list_for_each_entry(sysdev, &cls->kset.list, kobj.entry) { | 370 | list_for_each_entry(sysdev, &cls->kset.list, kobj.entry) { |
| 394 | pr_debug(" %s\n", kobject_name(&sysdev->kobj)); | 371 | pr_debug(" %s\n", kobject_name(&sysdev->kobj)); |
| 395 | 372 | ||
| 396 | /* Call global drivers first. */ | 373 | /* Call auxillary drivers first */ |
| 397 | list_for_each_entry(drv, &sysdev_drivers, entry) { | ||
| 398 | if (drv->suspend) { | ||
| 399 | ret = drv->suspend(sysdev, state); | ||
| 400 | if (ret) | ||
| 401 | goto gbl_driver; | ||
| 402 | } | ||
| 403 | } | ||
| 404 | |||
| 405 | /* Call auxillary drivers next. */ | ||
| 406 | list_for_each_entry(drv, &cls->drivers, entry) { | 374 | list_for_each_entry(drv, &cls->drivers, entry) { |
| 407 | if (drv->suspend) { | 375 | if (drv->suspend) { |
| 408 | ret = drv->suspend(sysdev, state); | 376 | ret = drv->suspend(sysdev, state); |
| @@ -436,18 +404,7 @@ aux_driver: | |||
| 436 | if (err_drv->resume) | 404 | if (err_drv->resume) |
| 437 | err_drv->resume(sysdev); | 405 | err_drv->resume(sysdev); |
| 438 | } | 406 | } |
| 439 | drv = NULL; | ||
| 440 | 407 | ||
| 441 | gbl_driver: | ||
| 442 | if (drv) | ||
| 443 | printk(KERN_ERR "sysdev driver suspend failed for %s\n", | ||
| 444 | kobject_name(&sysdev->kobj)); | ||
| 445 | list_for_each_entry(err_drv, &sysdev_drivers, entry) { | ||
| 446 | if (err_drv == drv) | ||
| 447 | break; | ||
| 448 | if (err_drv->resume) | ||
| 449 | err_drv->resume(sysdev); | ||
| 450 | } | ||
| 451 | /* resume other sysdevs in current class */ | 408 | /* resume other sysdevs in current class */ |
| 452 | list_for_each_entry(err_dev, &cls->kset.list, kobj.entry) { | 409 | list_for_each_entry(err_dev, &cls->kset.list, kobj.entry) { |
| 453 | if (err_dev == sysdev) | 410 | if (err_dev == sysdev) |
diff --git a/drivers/char/dsp56k.c b/drivers/char/dsp56k.c index 9b8278e1f4f8..acbfe1c49b4d 100644 --- a/drivers/char/dsp56k.c +++ b/drivers/char/dsp56k.c | |||
| @@ -513,7 +513,7 @@ static int __init dsp56k_init_driver(void) | |||
| 513 | err = PTR_ERR(dsp56k_class); | 513 | err = PTR_ERR(dsp56k_class); |
| 514 | goto out_chrdev; | 514 | goto out_chrdev; |
| 515 | } | 515 | } |
| 516 | class_device_create(dsp56k_class, NULL, MKDEV(DSP56K_MAJOR, 0), NULL, "dsp56k"); | 516 | device_create(dsp56k_class, NULL, MKDEV(DSP56K_MAJOR, 0), "dsp56k"); |
| 517 | 517 | ||
| 518 | printk(banner); | 518 | printk(banner); |
| 519 | goto out; | 519 | goto out; |
| @@ -527,7 +527,7 @@ module_init(dsp56k_init_driver); | |||
| 527 | 527 | ||
| 528 | static void __exit dsp56k_cleanup_driver(void) | 528 | static void __exit dsp56k_cleanup_driver(void) |
| 529 | { | 529 | { |
| 530 | class_device_destroy(dsp56k_class, MKDEV(DSP56K_MAJOR, 0)); | 530 | device_destroy(dsp56k_class, MKDEV(DSP56K_MAJOR, 0)); |
| 531 | class_destroy(dsp56k_class); | 531 | class_destroy(dsp56k_class); |
| 532 | unregister_chrdev(DSP56K_MAJOR, "dsp56k"); | 532 | unregister_chrdev(DSP56K_MAJOR, "dsp56k"); |
| 533 | } | 533 | } |
diff --git a/drivers/char/ip2/ip2main.c b/drivers/char/ip2/ip2main.c index 8d74b8745e60..bd94d5f9e62b 100644 --- a/drivers/char/ip2/ip2main.c +++ b/drivers/char/ip2/ip2main.c | |||
| @@ -411,8 +411,8 @@ cleanup_module(void) | |||
| 411 | iiResetDelay( i2BoardPtrTable[i] ); | 411 | iiResetDelay( i2BoardPtrTable[i] ); |
| 412 | /* free io addresses and Tibet */ | 412 | /* free io addresses and Tibet */ |
| 413 | release_region( ip2config.addr[i], 8 ); | 413 | release_region( ip2config.addr[i], 8 ); |
| 414 | class_device_destroy(ip2_class, MKDEV(IP2_IPL_MAJOR, 4 * i)); | 414 | device_destroy(ip2_class, MKDEV(IP2_IPL_MAJOR, 4 * i)); |
| 415 | class_device_destroy(ip2_class, MKDEV(IP2_IPL_MAJOR, 4 * i + 1)); | 415 | device_destroy(ip2_class, MKDEV(IP2_IPL_MAJOR, 4 * i + 1)); |
| 416 | } | 416 | } |
| 417 | /* Disable and remove interrupt handler. */ | 417 | /* Disable and remove interrupt handler. */ |
| 418 | if ( (ip2config.irq[i] > 0) && have_requested_irq(ip2config.irq[i]) ) { | 418 | if ( (ip2config.irq[i] > 0) && have_requested_irq(ip2config.irq[i]) ) { |
| @@ -718,12 +718,12 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize) | |||
| 718 | } | 718 | } |
| 719 | 719 | ||
| 720 | if ( NULL != ( pB = i2BoardPtrTable[i] ) ) { | 720 | if ( NULL != ( pB = i2BoardPtrTable[i] ) ) { |
| 721 | class_device_create(ip2_class, NULL, | 721 | device_create(ip2_class, NULL, |
| 722 | MKDEV(IP2_IPL_MAJOR, 4 * i), | 722 | MKDEV(IP2_IPL_MAJOR, 4 * i), |
| 723 | NULL, "ipl%d", i); | 723 | "ipl%d", i); |
| 724 | class_device_create(ip2_class, NULL, | 724 | device_create(ip2_class, NULL, |
| 725 | MKDEV(IP2_IPL_MAJOR, 4 * i + 1), | 725 | MKDEV(IP2_IPL_MAJOR, 4 * i + 1), |
| 726 | NULL, "stat%d", i); | 726 | "stat%d", i); |
| 727 | 727 | ||
| 728 | for ( box = 0; box < ABS_MAX_BOXES; ++box ) | 728 | for ( box = 0; box < ABS_MAX_BOXES; ++box ) |
| 729 | { | 729 | { |
diff --git a/drivers/char/ipmi/ipmi_devintf.c b/drivers/char/ipmi/ipmi_devintf.c index c2aa44ee6eb6..0246a2b8ce48 100644 --- a/drivers/char/ipmi/ipmi_devintf.c +++ b/drivers/char/ipmi/ipmi_devintf.c | |||
| @@ -865,7 +865,7 @@ static void ipmi_new_smi(int if_num, struct device *device) | |||
| 865 | entry->dev = dev; | 865 | entry->dev = dev; |
| 866 | 866 | ||
| 867 | mutex_lock(®_list_mutex); | 867 | mutex_lock(®_list_mutex); |
| 868 | class_device_create(ipmi_class, NULL, dev, device, "ipmi%d", if_num); | 868 | device_create(ipmi_class, device, dev, "ipmi%d", if_num); |
| 869 | list_add(&entry->link, ®_list); | 869 | list_add(&entry->link, ®_list); |
| 870 | mutex_unlock(®_list_mutex); | 870 | mutex_unlock(®_list_mutex); |
| 871 | } | 871 | } |
| @@ -883,7 +883,7 @@ static void ipmi_smi_gone(int if_num) | |||
| 883 | break; | 883 | break; |
| 884 | } | 884 | } |
| 885 | } | 885 | } |
| 886 | class_device_destroy(ipmi_class, dev); | 886 | device_destroy(ipmi_class, dev); |
| 887 | mutex_unlock(®_list_mutex); | 887 | mutex_unlock(®_list_mutex); |
| 888 | } | 888 | } |
| 889 | 889 | ||
| @@ -938,7 +938,7 @@ static __exit void cleanup_ipmi(void) | |||
| 938 | mutex_lock(®_list_mutex); | 938 | mutex_lock(®_list_mutex); |
| 939 | list_for_each_entry_safe(entry, entry2, ®_list, link) { | 939 | list_for_each_entry_safe(entry, entry2, ®_list, link) { |
| 940 | list_del(&entry->link); | 940 | list_del(&entry->link); |
| 941 | class_device_destroy(ipmi_class, entry->dev); | 941 | device_destroy(ipmi_class, entry->dev); |
| 942 | kfree(entry); | 942 | kfree(entry); |
| 943 | } | 943 | } |
| 944 | mutex_unlock(®_list_mutex); | 944 | mutex_unlock(®_list_mutex); |
diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c index 3c66f402f9d7..1f27be1ec3d4 100644 --- a/drivers/char/istallion.c +++ b/drivers/char/istallion.c | |||
| @@ -4624,9 +4624,8 @@ static int __init istallion_module_init(void) | |||
| 4624 | 4624 | ||
| 4625 | istallion_class = class_create(THIS_MODULE, "staliomem"); | 4625 | istallion_class = class_create(THIS_MODULE, "staliomem"); |
| 4626 | for (i = 0; i < 4; i++) | 4626 | for (i = 0; i < 4; i++) |
| 4627 | class_device_create(istallion_class, NULL, | 4627 | device_create(istallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i), |
| 4628 | MKDEV(STL_SIOMEMMAJOR, i), | 4628 | "staliomem%d", i); |
| 4629 | NULL, "staliomem%d", i); | ||
| 4630 | 4629 | ||
| 4631 | return 0; | 4630 | return 0; |
| 4632 | err_deinit: | 4631 | err_deinit: |
| @@ -4659,8 +4658,7 @@ static void __exit istallion_module_exit(void) | |||
| 4659 | unregister_chrdev(STL_SIOMEMMAJOR, "staliomem"); | 4658 | unregister_chrdev(STL_SIOMEMMAJOR, "staliomem"); |
| 4660 | 4659 | ||
| 4661 | for (j = 0; j < 4; j++) | 4660 | for (j = 0; j < 4; j++) |
| 4662 | class_device_destroy(istallion_class, MKDEV(STL_SIOMEMMAJOR, | 4661 | device_destroy(istallion_class, MKDEV(STL_SIOMEMMAJOR, j)); |
| 4663 | j)); | ||
| 4664 | class_destroy(istallion_class); | 4662 | class_destroy(istallion_class); |
| 4665 | 4663 | ||
| 4666 | pci_unregister_driver(&stli_pcidriver); | 4664 | pci_unregister_driver(&stli_pcidriver); |
diff --git a/drivers/char/lp.c b/drivers/char/lp.c index 62051f8b0910..c59e2a0996cc 100644 --- a/drivers/char/lp.c +++ b/drivers/char/lp.c | |||
| @@ -799,8 +799,7 @@ static int lp_register(int nr, struct parport *port) | |||
| 799 | if (reset) | 799 | if (reset) |
| 800 | lp_reset(nr); | 800 | lp_reset(nr); |
| 801 | 801 | ||
| 802 | class_device_create(lp_class, NULL, MKDEV(LP_MAJOR, nr), port->dev, | 802 | device_create(lp_class, port->dev, MKDEV(LP_MAJOR, nr), "lp%d", nr); |
| 803 | "lp%d", nr); | ||
| 804 | 803 | ||
| 805 | printk(KERN_INFO "lp%d: using %s (%s).\n", nr, port->name, | 804 | printk(KERN_INFO "lp%d: using %s (%s).\n", nr, port->name, |
| 806 | (port->irq == PARPORT_IRQ_NONE)?"polling":"interrupt-driven"); | 805 | (port->irq == PARPORT_IRQ_NONE)?"polling":"interrupt-driven"); |
| @@ -971,7 +970,7 @@ static void lp_cleanup_module (void) | |||
| 971 | if (lp_table[offset].dev == NULL) | 970 | if (lp_table[offset].dev == NULL) |
| 972 | continue; | 971 | continue; |
| 973 | parport_unregister_device(lp_table[offset].dev); | 972 | parport_unregister_device(lp_table[offset].dev); |
| 974 | class_device_destroy(lp_class, MKDEV(LP_MAJOR, offset)); | 973 | device_destroy(lp_class, MKDEV(LP_MAJOR, offset)); |
| 975 | } | 974 | } |
| 976 | class_destroy(lp_class); | 975 | class_destroy(lp_class); |
| 977 | } | 976 | } |
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c index 4177f6db83e9..cc5d77797def 100644 --- a/drivers/char/pcmcia/cm4000_cs.c +++ b/drivers/char/pcmcia/cm4000_cs.c | |||
| @@ -1863,8 +1863,7 @@ static int cm4000_probe(struct pcmcia_device *link) | |||
| 1863 | return ret; | 1863 | return ret; |
| 1864 | } | 1864 | } |
| 1865 | 1865 | ||
| 1866 | class_device_create(cmm_class, NULL, MKDEV(major, i), NULL, | 1866 | device_create(cmm_class, NULL, MKDEV(major, i), "cmm%d", i); |
| 1867 | "cmm%d", i); | ||
| 1868 | 1867 | ||
| 1869 | return 0; | 1868 | return 0; |
| 1870 | } | 1869 | } |
| @@ -1888,7 +1887,7 @@ static void cm4000_detach(struct pcmcia_device *link) | |||
| 1888 | dev_table[devno] = NULL; | 1887 | dev_table[devno] = NULL; |
| 1889 | kfree(dev); | 1888 | kfree(dev); |
| 1890 | 1889 | ||
| 1891 | class_device_destroy(cmm_class, MKDEV(major, devno)); | 1890 | device_destroy(cmm_class, MKDEV(major, devno)); |
| 1892 | 1891 | ||
| 1893 | return; | 1892 | return; |
| 1894 | } | 1893 | } |
diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c index b24a3e7bbb9f..a0b9c8728d56 100644 --- a/drivers/char/pcmcia/cm4040_cs.c +++ b/drivers/char/pcmcia/cm4040_cs.c | |||
| @@ -642,8 +642,7 @@ static int reader_probe(struct pcmcia_device *link) | |||
| 642 | return ret; | 642 | return ret; |
| 643 | } | 643 | } |
| 644 | 644 | ||
| 645 | class_device_create(cmx_class, NULL, MKDEV(major, i), NULL, | 645 | device_create(cmx_class, NULL, MKDEV(major, i), "cmx%d", i); |
| 646 | "cmx%d", i); | ||
| 647 | 646 | ||
| 648 | return 0; | 647 | return 0; |
| 649 | } | 648 | } |
| @@ -666,7 +665,7 @@ static void reader_detach(struct pcmcia_device *link) | |||
| 666 | dev_table[devno] = NULL; | 665 | dev_table[devno] = NULL; |
| 667 | kfree(dev); | 666 | kfree(dev); |
| 668 | 667 | ||
| 669 | class_device_destroy(cmx_class, MKDEV(major, devno)); | 668 | device_destroy(cmx_class, MKDEV(major, devno)); |
| 670 | 669 | ||
| 671 | return; | 670 | return; |
| 672 | } | 671 | } |
diff --git a/drivers/char/pty.c b/drivers/char/pty.c index de14aea34e11..73de77105fea 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c | |||
| @@ -248,14 +248,19 @@ static int pty_bsd_ioctl(struct tty_struct *tty, struct file *file, | |||
| 248 | return -ENOIOCTLCMD; | 248 | return -ENOIOCTLCMD; |
| 249 | } | 249 | } |
| 250 | 250 | ||
| 251 | static int legacy_count = CONFIG_LEGACY_PTY_COUNT; | ||
| 252 | module_param(legacy_count, int, 0); | ||
| 253 | |||
| 251 | static void __init legacy_pty_init(void) | 254 | static void __init legacy_pty_init(void) |
| 252 | { | 255 | { |
| 256 | if (legacy_count <= 0) | ||
| 257 | return; | ||
| 253 | 258 | ||
| 254 | pty_driver = alloc_tty_driver(NR_PTYS); | 259 | pty_driver = alloc_tty_driver(legacy_count); |
| 255 | if (!pty_driver) | 260 | if (!pty_driver) |
| 256 | panic("Couldn't allocate pty driver"); | 261 | panic("Couldn't allocate pty driver"); |
| 257 | 262 | ||
| 258 | pty_slave_driver = alloc_tty_driver(NR_PTYS); | 263 | pty_slave_driver = alloc_tty_driver(legacy_count); |
| 259 | if (!pty_slave_driver) | 264 | if (!pty_slave_driver) |
| 260 | panic("Couldn't allocate pty slave driver"); | 265 | panic("Couldn't allocate pty slave driver"); |
| 261 | 266 | ||
diff --git a/drivers/char/raw.c b/drivers/char/raw.c index 1f0d7c60c944..bbfa0e241cba 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c | |||
| @@ -255,10 +255,7 @@ static const struct file_operations raw_ctl_fops = { | |||
| 255 | .owner = THIS_MODULE, | 255 | .owner = THIS_MODULE, |
| 256 | }; | 256 | }; |
| 257 | 257 | ||
| 258 | static struct cdev raw_cdev = { | 258 | static struct cdev raw_cdev; |
| 259 | .kobj = {.name = "raw", }, | ||
| 260 | .owner = THIS_MODULE, | ||
| 261 | }; | ||
| 262 | 259 | ||
| 263 | static int __init raw_init(void) | 260 | static int __init raw_init(void) |
| 264 | { | 261 | { |
diff --git a/drivers/char/snsc.c b/drivers/char/snsc.c index 52753e723eaa..b9c1dba6bd01 100644 --- a/drivers/char/snsc.c +++ b/drivers/char/snsc.c | |||
| @@ -441,8 +441,7 @@ scdrv_init(void) | |||
| 441 | continue; | 441 | continue; |
| 442 | } | 442 | } |
| 443 | 443 | ||
| 444 | class_device_create(snsc_class, NULL, dev, NULL, | 444 | device_create(snsc_class, NULL, dev, "%s", devname); |
| 445 | "%s", devname); | ||
| 446 | 445 | ||
| 447 | ia64_sn_irtr_intr_enable(scd->scd_nasid, | 446 | ia64_sn_irtr_intr_enable(scd->scd_nasid, |
| 448 | 0 /*ignored */ , | 447 | 0 /*ignored */ , |
diff --git a/drivers/char/stallion.c b/drivers/char/stallion.c index 4a80b2f864e0..45758d5b56ef 100644 --- a/drivers/char/stallion.c +++ b/drivers/char/stallion.c | |||
| @@ -4778,9 +4778,8 @@ static int __init stallion_module_init(void) | |||
| 4778 | if (IS_ERR(stallion_class)) | 4778 | if (IS_ERR(stallion_class)) |
| 4779 | printk("STALLION: failed to create class\n"); | 4779 | printk("STALLION: failed to create class\n"); |
| 4780 | for (i = 0; i < 4; i++) | 4780 | for (i = 0; i < 4; i++) |
| 4781 | class_device_create(stallion_class, NULL, | 4781 | device_create(stallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i), |
| 4782 | MKDEV(STL_SIOMEMMAJOR, i), NULL, | 4782 | "staliomem%d", i); |
| 4783 | "staliomem%d", i); | ||
| 4784 | 4783 | ||
| 4785 | return 0; | 4784 | return 0; |
| 4786 | err_unrtty: | 4785 | err_unrtty: |
| @@ -4816,7 +4815,7 @@ static void __exit stallion_module_exit(void) | |||
| 4816 | } | 4815 | } |
| 4817 | 4816 | ||
| 4818 | for (i = 0; i < 4; i++) | 4817 | for (i = 0; i < 4; i++) |
| 4819 | class_device_destroy(stallion_class, MKDEV(STL_SIOMEMMAJOR, i)); | 4818 | device_destroy(stallion_class, MKDEV(STL_SIOMEMMAJOR, i)); |
| 4820 | unregister_chrdev(STL_SIOMEMMAJOR, "staliomem"); | 4819 | unregister_chrdev(STL_SIOMEMMAJOR, "staliomem"); |
| 4821 | class_destroy(stallion_class); | 4820 | class_destroy(stallion_class); |
| 4822 | 4821 | ||
diff --git a/drivers/char/tipar.c b/drivers/char/tipar.c index 35b40b996534..cef55c40654f 100644 --- a/drivers/char/tipar.c +++ b/drivers/char/tipar.c | |||
| @@ -441,8 +441,8 @@ tipar_register(int nr, struct parport *port) | |||
| 441 | goto out; | 441 | goto out; |
| 442 | } | 442 | } |
| 443 | 443 | ||
| 444 | class_device_create(tipar_class, NULL, MKDEV(TIPAR_MAJOR, | 444 | device_create(tipar_class, port->dev, MKDEV(TIPAR_MAJOR, |
| 445 | TIPAR_MINOR + nr), port->dev, "par%d", nr); | 445 | TIPAR_MINOR + nr), "par%d", nr); |
| 446 | 446 | ||
| 447 | /* Display informations */ | 447 | /* Display informations */ |
| 448 | pr_info("tipar%d: using %s (%s)\n", nr, port->name, (port->irq == | 448 | pr_info("tipar%d: using %s (%s)\n", nr, port->name, (port->irq == |
| @@ -534,7 +534,7 @@ tipar_cleanup_module(void) | |||
| 534 | if (table[i].dev == NULL) | 534 | if (table[i].dev == NULL) |
| 535 | continue; | 535 | continue; |
| 536 | parport_unregister_device(table[i].dev); | 536 | parport_unregister_device(table[i].dev); |
| 537 | class_device_destroy(tipar_class, MKDEV(TIPAR_MAJOR, i)); | 537 | device_destroy(tipar_class, MKDEV(TIPAR_MAJOR, i)); |
| 538 | } | 538 | } |
| 539 | class_destroy(tipar_class); | 539 | class_destroy(tipar_class); |
| 540 | 540 | ||
diff --git a/drivers/char/viotape.c b/drivers/char/viotape.c index f1d60f0cef8f..db7a731e2362 100644 --- a/drivers/char/viotape.c +++ b/drivers/char/viotape.c | |||
| @@ -871,10 +871,10 @@ static int viotape_probe(struct vio_dev *vdev, const struct vio_device_id *id) | |||
| 871 | state[i].cur_part = 0; | 871 | state[i].cur_part = 0; |
| 872 | for (j = 0; j < MAX_PARTITIONS; ++j) | 872 | for (j = 0; j < MAX_PARTITIONS; ++j) |
| 873 | state[i].part_stat_rwi[j] = VIOT_IDLE; | 873 | state[i].part_stat_rwi[j] = VIOT_IDLE; |
| 874 | class_device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i), NULL, | 874 | device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i), |
| 875 | "iseries!vt%d", i); | 875 | "iseries!vt%d", i); |
| 876 | class_device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i | 0x80), | 876 | device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i | 0x80), |
| 877 | NULL, "iseries!nvt%d", i); | 877 | "iseries!nvt%d", i); |
| 878 | printk(VIOTAPE_KERN_INFO "tape iseries/vt%d is iSeries " | 878 | printk(VIOTAPE_KERN_INFO "tape iseries/vt%d is iSeries " |
| 879 | "resource %10.10s type %4.4s, model %3.3s\n", | 879 | "resource %10.10s type %4.4s, model %3.3s\n", |
| 880 | i, viotape_unitinfo[i].rsrcname, | 880 | i, viotape_unitinfo[i].rsrcname, |
| @@ -886,8 +886,8 @@ static int viotape_remove(struct vio_dev *vdev) | |||
| 886 | { | 886 | { |
| 887 | int i = vdev->unit_address; | 887 | int i = vdev->unit_address; |
| 888 | 888 | ||
| 889 | class_device_destroy(tape_class, MKDEV(VIOTAPE_MAJOR, i | 0x80)); | 889 | device_destroy(tape_class, MKDEV(VIOTAPE_MAJOR, i | 0x80)); |
| 890 | class_device_destroy(tape_class, MKDEV(VIOTAPE_MAJOR, i)); | 890 | device_destroy(tape_class, MKDEV(VIOTAPE_MAJOR, i)); |
| 891 | return 0; | 891 | return 0; |
| 892 | } | 892 | } |
| 893 | 893 | ||
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index f7b9d6fce123..5e626b12b97e 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -830,7 +830,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev) | |||
| 830 | /* prepare interface data */ | 830 | /* prepare interface data */ |
| 831 | policy->kobj.parent = &sys_dev->kobj; | 831 | policy->kobj.parent = &sys_dev->kobj; |
| 832 | policy->kobj.ktype = &ktype_cpufreq; | 832 | policy->kobj.ktype = &ktype_cpufreq; |
| 833 | strlcpy(policy->kobj.name, "cpufreq", KOBJ_NAME_LEN); | 833 | kobject_set_name(&policy->kobj, "cpufreq"); |
| 834 | 834 | ||
| 835 | ret = kobject_register(&policy->kobj); | 835 | ret = kobject_register(&policy->kobj); |
| 836 | if (ret) { | 836 | if (ret) { |
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index 4a0576bd06fc..3706b2bc0987 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c | |||
| @@ -743,7 +743,7 @@ static struct kobj_type ktype_mc_set_attribs = { | |||
| 743 | * /sys/devices/system/edac/mc | 743 | * /sys/devices/system/edac/mc |
| 744 | */ | 744 | */ |
| 745 | static struct kset mc_kset = { | 745 | static struct kset mc_kset = { |
| 746 | .kobj = {.name = "mc", .ktype = &ktype_mc_set_attribs }, | 746 | .kobj = {.ktype = &ktype_mc_set_attribs }, |
| 747 | .ktype = &ktype_mci, | 747 | .ktype = &ktype_mci, |
| 748 | }; | 748 | }; |
| 749 | 749 | ||
| @@ -1010,6 +1010,7 @@ int edac_sysfs_setup_mc_kset(void) | |||
| 1010 | } | 1010 | } |
| 1011 | 1011 | ||
| 1012 | /* Init the MC's kobject */ | 1012 | /* Init the MC's kobject */ |
| 1013 | kobject_set_name(&mc_kset.kobj, "mc"); | ||
| 1013 | mc_kset.kobj.parent = &edac_class->kset.kobj; | 1014 | mc_kset.kobj.parent = &edac_class->kset.kobj; |
| 1014 | 1015 | ||
| 1015 | /* register the mc_kset */ | 1016 | /* register the mc_kset */ |
diff --git a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c index d944647c82c2..4d4a47393909 100644 --- a/drivers/eisa/eisa-bus.c +++ b/drivers/eisa/eisa-bus.c | |||
| @@ -128,16 +128,11 @@ static int eisa_bus_match (struct device *dev, struct device_driver *drv) | |||
| 128 | return 0; | 128 | return 0; |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | static int eisa_bus_uevent(struct device *dev, char **envp, int num_envp, | 131 | static int eisa_bus_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 132 | char *buffer, int buffer_size) | ||
| 133 | { | 132 | { |
| 134 | struct eisa_device *edev = to_eisa_device(dev); | 133 | struct eisa_device *edev = to_eisa_device(dev); |
| 135 | int i = 0; | ||
| 136 | int length = 0; | ||
| 137 | 134 | ||
| 138 | add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length, | 135 | add_uevent_var(env, "MODALIAS=" EISA_DEVICE_MODALIAS_FMT, edev->id.sig); |
| 139 | "MODALIAS=" EISA_DEVICE_MODALIAS_FMT, edev->id.sig); | ||
| 140 | envp[i] = NULL; | ||
| 141 | return 0; | 136 | return 0; |
| 142 | } | 137 | } |
| 143 | 138 | ||
diff --git a/drivers/firewire/fw-device.c b/drivers/firewire/fw-device.c index 2b6586341635..56681b3b297b 100644 --- a/drivers/firewire/fw-device.c +++ b/drivers/firewire/fw-device.c | |||
| @@ -130,23 +130,16 @@ static int get_modalias(struct fw_unit *unit, char *buffer, size_t buffer_size) | |||
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | static int | 132 | static int |
| 133 | fw_unit_uevent(struct device *dev, char **envp, int num_envp, | 133 | fw_unit_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 134 | char *buffer, int buffer_size) | ||
| 135 | { | 134 | { |
| 136 | struct fw_unit *unit = fw_unit(dev); | 135 | struct fw_unit *unit = fw_unit(dev); |
| 137 | char modalias[64]; | 136 | char modalias[64]; |
| 138 | int length = 0; | ||
| 139 | int i = 0; | ||
| 140 | 137 | ||
| 141 | get_modalias(unit, modalias, sizeof(modalias)); | 138 | get_modalias(unit, modalias, sizeof(modalias)); |
| 142 | 139 | ||
| 143 | if (add_uevent_var(envp, num_envp, &i, | 140 | if (add_uevent_var(env, "MODALIAS=%s", modalias)) |
| 144 | buffer, buffer_size, &length, | ||
| 145 | "MODALIAS=%s", modalias)) | ||
| 146 | return -ENOMEM; | 141 | return -ENOMEM; |
| 147 | 142 | ||
| 148 | envp[i] = NULL; | ||
| 149 | |||
| 150 | return 0; | 143 | return 0; |
| 151 | } | 144 | } |
| 152 | 145 | ||
diff --git a/drivers/firmware/dmi-id.c b/drivers/firmware/dmi-id.c index 59c3b5aa89f4..b6e1eb77d148 100644 --- a/drivers/firmware/dmi-id.c +++ b/drivers/firmware/dmi-id.c | |||
| @@ -13,21 +13,31 @@ | |||
| 13 | #include <linux/device.h> | 13 | #include <linux/device.h> |
| 14 | #include <linux/autoconf.h> | 14 | #include <linux/autoconf.h> |
| 15 | 15 | ||
| 16 | #define DEFINE_DMI_ATTR(_name, _mode, _show) \ | 16 | struct dmi_device_attribute{ |
| 17 | static struct device_attribute sys_dmi_##_name##_attr = \ | 17 | struct device_attribute dev_attr; |
| 18 | __ATTR(_name, _mode, _show, NULL); | 18 | int field; |
| 19 | 19 | }; | |
| 20 | #define DEFINE_DMI_ATTR_WITH_SHOW(_name, _mode, _field) \ | 20 | #define to_dmi_dev_attr(_dev_attr) \ |
| 21 | static ssize_t sys_dmi_##_name##_show(struct device *dev, \ | 21 | container_of(_dev_attr, struct dmi_device_attribute, dev_attr) |
| 22 | struct device_attribute *attr, \ | 22 | |
| 23 | char *page) \ | 23 | static ssize_t sys_dmi_field_show(struct device *dev, |
| 24 | { \ | 24 | struct device_attribute *attr, |
| 25 | ssize_t len; \ | 25 | char *page) |
| 26 | len = scnprintf(page, PAGE_SIZE, "%s\n", dmi_get_system_info(_field)); \ | 26 | { |
| 27 | page[len-1] = '\n'; \ | 27 | int field = to_dmi_dev_attr(attr)->field; |
| 28 | return len; \ | 28 | ssize_t len; |
| 29 | } \ | 29 | len = scnprintf(page, PAGE_SIZE, "%s\n", dmi_get_system_info(field)); |
| 30 | DEFINE_DMI_ATTR(_name, _mode, sys_dmi_##_name##_show); | 30 | page[len-1] = '\n'; |
| 31 | return len; | ||
| 32 | } | ||
| 33 | |||
| 34 | #define DMI_ATTR(_name, _mode, _show, _field) \ | ||
| 35 | { .dev_attr = __ATTR(_name, _mode, _show, NULL), \ | ||
| 36 | .field = _field } | ||
| 37 | |||
| 38 | #define DEFINE_DMI_ATTR_WITH_SHOW(_name, _mode, _field) \ | ||
| 39 | static struct dmi_device_attribute sys_dmi_##_name##_attr = \ | ||
| 40 | DMI_ATTR(_name, _mode, sys_dmi_field_show, _field); | ||
| 31 | 41 | ||
| 32 | DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor, 0444, DMI_BIOS_VENDOR); | 42 | DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor, 0444, DMI_BIOS_VENDOR); |
| 33 | DEFINE_DMI_ATTR_WITH_SHOW(bios_version, 0444, DMI_BIOS_VERSION); | 43 | DEFINE_DMI_ATTR_WITH_SHOW(bios_version, 0444, DMI_BIOS_VERSION); |
| @@ -121,7 +131,8 @@ static ssize_t sys_dmi_modalias_show(struct device *dev, | |||
| 121 | return r+1; | 131 | return r+1; |
| 122 | } | 132 | } |
| 123 | 133 | ||
| 124 | DEFINE_DMI_ATTR(modalias, 0444, sys_dmi_modalias_show); | 134 | static struct device_attribute sys_dmi_modalias_attr = |
| 135 | __ATTR(modalias, 0444, sys_dmi_modalias_show, NULL); | ||
| 125 | 136 | ||
| 126 | static struct attribute *sys_dmi_attributes[DMI_STRING_MAX+2]; | 137 | static struct attribute *sys_dmi_attributes[DMI_STRING_MAX+2]; |
| 127 | 138 | ||
| @@ -134,14 +145,17 @@ static struct attribute_group* sys_dmi_attribute_groups[] = { | |||
| 134 | NULL | 145 | NULL |
| 135 | }; | 146 | }; |
| 136 | 147 | ||
| 137 | static int dmi_dev_uevent(struct device *dev, char **envp, | 148 | static int dmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 138 | int num_envp, char *buffer, int buffer_size) | ||
| 139 | { | 149 | { |
| 140 | strcpy(buffer, "MODALIAS="); | 150 | ssize_t len; |
| 141 | get_modalias(buffer+9, buffer_size-9); | 151 | |
| 142 | envp[0] = buffer; | 152 | if (add_uevent_var(env, "MODALIAS=")) |
| 143 | envp[1] = NULL; | 153 | return -ENOMEM; |
| 144 | 154 | len = get_modalias(&env->buf[env->buflen - 1], | |
| 155 | sizeof(env->buf) - env->buflen); | ||
| 156 | if (len >= (sizeof(env->buf) - env->buflen)) | ||
| 157 | return -ENOMEM; | ||
| 158 | env->buflen += len; | ||
| 145 | return 0; | 159 | return 0; |
| 146 | } | 160 | } |
| 147 | 161 | ||
| @@ -157,7 +171,7 @@ static struct device *dmi_dev; | |||
| 157 | 171 | ||
| 158 | #define ADD_DMI_ATTR(_name, _field) \ | 172 | #define ADD_DMI_ATTR(_name, _field) \ |
| 159 | if (dmi_get_system_info(_field)) \ | 173 | if (dmi_get_system_info(_field)) \ |
| 160 | sys_dmi_attributes[i++] = & sys_dmi_##_name##_attr.attr; | 174 | sys_dmi_attributes[i++] = &sys_dmi_##_name##_attr.dev_attr.attr; |
| 161 | 175 | ||
| 162 | extern int dmi_available; | 176 | extern int dmi_available; |
| 163 | 177 | ||
diff --git a/drivers/firmware/edd.c b/drivers/firmware/edd.c index 0fb730ee1da8..6942e065e609 100644 --- a/drivers/firmware/edd.c +++ b/drivers/firmware/edd.c | |||
| @@ -625,13 +625,13 @@ static void edd_release(struct kobject * kobj) | |||
| 625 | kfree(dev); | 625 | kfree(dev); |
| 626 | } | 626 | } |
| 627 | 627 | ||
| 628 | static struct kobj_type ktype_edd = { | 628 | static struct kobj_type edd_ktype = { |
| 629 | .release = edd_release, | 629 | .release = edd_release, |
| 630 | .sysfs_ops = &edd_attr_ops, | 630 | .sysfs_ops = &edd_attr_ops, |
| 631 | .default_attrs = def_attrs, | 631 | .default_attrs = def_attrs, |
| 632 | }; | 632 | }; |
| 633 | 633 | ||
| 634 | static decl_subsys(edd,&ktype_edd,NULL); | 634 | static decl_subsys(edd, &edd_ktype, NULL); |
| 635 | 635 | ||
| 636 | 636 | ||
| 637 | /** | 637 | /** |
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c index bfd2d67df689..858a7b95933b 100644 --- a/drivers/firmware/efivars.c +++ b/drivers/firmware/efivars.c | |||
| @@ -402,7 +402,7 @@ static struct attribute *def_attrs[] = { | |||
| 402 | NULL, | 402 | NULL, |
| 403 | }; | 403 | }; |
| 404 | 404 | ||
| 405 | static struct kobj_type ktype_efivar = { | 405 | static struct kobj_type efivar_ktype = { |
| 406 | .release = efivar_release, | 406 | .release = efivar_release, |
| 407 | .sysfs_ops = &efivar_attr_ops, | 407 | .sysfs_ops = &efivar_attr_ops, |
| 408 | .default_attrs = def_attrs, | 408 | .default_attrs = def_attrs, |
| @@ -583,7 +583,7 @@ static struct subsys_attribute *efi_subsys_attrs[] = { | |||
| 583 | NULL, /* maybe more in the future? */ | 583 | NULL, /* maybe more in the future? */ |
| 584 | }; | 584 | }; |
| 585 | 585 | ||
| 586 | static decl_subsys(vars, &ktype_efivar, NULL); | 586 | static decl_subsys(vars, &efivar_ktype, NULL); |
| 587 | static decl_subsys(efi, NULL, NULL); | 587 | static decl_subsys(efi, NULL, NULL); |
| 588 | 588 | ||
| 589 | /* | 589 | /* |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index d663e6960d93..910a62de190d 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -67,20 +67,16 @@ static int i2c_device_match(struct device *dev, struct device_driver *drv) | |||
| 67 | #ifdef CONFIG_HOTPLUG | 67 | #ifdef CONFIG_HOTPLUG |
| 68 | 68 | ||
| 69 | /* uevent helps with hotplug: modprobe -q $(MODALIAS) */ | 69 | /* uevent helps with hotplug: modprobe -q $(MODALIAS) */ |
| 70 | static int i2c_device_uevent(struct device *dev, char **envp, int num_envp, | 70 | static int i2c_device_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 71 | char *buffer, int buffer_size) | ||
| 72 | { | 71 | { |
| 73 | struct i2c_client *client = to_i2c_client(dev); | 72 | struct i2c_client *client = to_i2c_client(dev); |
| 74 | int i = 0, length = 0; | ||
| 75 | 73 | ||
| 76 | /* by definition, legacy drivers can't hotplug */ | 74 | /* by definition, legacy drivers can't hotplug */ |
| 77 | if (dev->driver || !client->driver_name) | 75 | if (dev->driver || !client->driver_name) |
| 78 | return 0; | 76 | return 0; |
| 79 | 77 | ||
| 80 | if (add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length, | 78 | if (add_uevent_var(env, "MODALIAS=%s", client->driver_name)) |
| 81 | "MODALIAS=%s", client->driver_name)) | ||
| 82 | return -ENOMEM; | 79 | return -ENOMEM; |
| 83 | envp[i] = NULL; | ||
| 84 | dev_dbg(dev, "uevent\n"); | 80 | dev_dbg(dev, "uevent\n"); |
| 85 | return 0; | 81 | return 0; |
| 86 | } | 82 | } |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index e96212ce5729..a96a8b1b3539 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
| @@ -1663,20 +1663,13 @@ static struct device_attribute ide_dev_attrs[] = { | |||
| 1663 | __ATTR_NULL | 1663 | __ATTR_NULL |
| 1664 | }; | 1664 | }; |
| 1665 | 1665 | ||
| 1666 | static int ide_uevent(struct device *dev, char **envp, int num_envp, | 1666 | static int ide_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 1667 | char *buffer, int buffer_size) | ||
| 1668 | { | 1667 | { |
| 1669 | ide_drive_t *drive = to_ide_device(dev); | 1668 | ide_drive_t *drive = to_ide_device(dev); |
| 1670 | int i = 0; | 1669 | |
| 1671 | int length = 0; | 1670 | add_uevent_var(env, "MEDIA=%s", media_string(drive)); |
| 1672 | 1671 | add_uevent_var(env, "DRIVENAME=%s", drive->name); | |
| 1673 | add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length, | 1672 | add_uevent_var(env, "MODALIAS=ide:m-%s", media_string(drive)); |
| 1674 | "MEDIA=%s", media_string(drive)); | ||
| 1675 | add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length, | ||
| 1676 | "DRIVENAME=%s", drive->name); | ||
| 1677 | add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length, | ||
| 1678 | "MODALIAS=ide:m-%s", media_string(drive)); | ||
| 1679 | envp[i] = NULL; | ||
| 1680 | return 0; | 1673 | return 0; |
| 1681 | } | 1674 | } |
| 1682 | 1675 | ||
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 2ffd53461db6..1939fee616ec 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c | |||
| @@ -153,8 +153,7 @@ struct host_info { | |||
| 153 | }; | 153 | }; |
| 154 | 154 | ||
| 155 | static int nodemgr_bus_match(struct device * dev, struct device_driver * drv); | 155 | static int nodemgr_bus_match(struct device * dev, struct device_driver * drv); |
| 156 | static int nodemgr_uevent(struct device *dev, char **envp, int num_envp, | 156 | static int nodemgr_uevent(struct device *dev, struct kobj_uevent_env *env); |
| 157 | char *buffer, int buffer_size); | ||
| 158 | static void nodemgr_resume_ne(struct node_entry *ne); | 157 | static void nodemgr_resume_ne(struct node_entry *ne); |
| 159 | static void nodemgr_remove_ne(struct node_entry *ne); | 158 | static void nodemgr_remove_ne(struct node_entry *ne); |
| 160 | static struct node_entry *find_entry_by_guid(u64 guid); | 159 | static struct node_entry *find_entry_by_guid(u64 guid); |
| @@ -1160,12 +1159,9 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent | |||
| 1160 | 1159 | ||
| 1161 | #ifdef CONFIG_HOTPLUG | 1160 | #ifdef CONFIG_HOTPLUG |
| 1162 | 1161 | ||
| 1163 | static int nodemgr_uevent(struct device *dev, char **envp, int num_envp, | 1162 | static int nodemgr_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 1164 | char *buffer, int buffer_size) | ||
| 1165 | { | 1163 | { |
| 1166 | struct unit_directory *ud; | 1164 | struct unit_directory *ud; |
| 1167 | int i = 0; | ||
| 1168 | int length = 0; | ||
| 1169 | int retval = 0; | 1165 | int retval = 0; |
| 1170 | /* ieee1394:venNmoNspNverN */ | 1166 | /* ieee1394:venNmoNspNverN */ |
| 1171 | char buf[8 + 1 + 3 + 8 + 2 + 8 + 2 + 8 + 3 + 8 + 1]; | 1167 | char buf[8 + 1 + 3 + 8 + 2 + 8 + 2 + 8 + 3 + 8 + 1]; |
| @@ -1180,9 +1176,7 @@ static int nodemgr_uevent(struct device *dev, char **envp, int num_envp, | |||
| 1180 | 1176 | ||
| 1181 | #define PUT_ENVP(fmt,val) \ | 1177 | #define PUT_ENVP(fmt,val) \ |
| 1182 | do { \ | 1178 | do { \ |
| 1183 | retval = add_uevent_var(envp, num_envp, &i, \ | 1179 | retval = add_uevent_var(env, fmt, val); \ |
| 1184 | buffer, buffer_size, &length, \ | ||
| 1185 | fmt, val); \ | ||
| 1186 | if (retval) \ | 1180 | if (retval) \ |
| 1187 | return retval; \ | 1181 | return retval; \ |
| 1188 | } while (0) | 1182 | } while (0) |
| @@ -1201,15 +1195,12 @@ do { \ | |||
| 1201 | 1195 | ||
| 1202 | #undef PUT_ENVP | 1196 | #undef PUT_ENVP |
| 1203 | 1197 | ||
| 1204 | envp[i] = NULL; | ||
| 1205 | |||
| 1206 | return 0; | 1198 | return 0; |
| 1207 | } | 1199 | } |
| 1208 | 1200 | ||
| 1209 | #else | 1201 | #else |
| 1210 | 1202 | ||
| 1211 | static int nodemgr_uevent(struct device *dev, char **envp, int num_envp, | 1203 | static int nodemgr_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 1212 | char *buffer, int buffer_size) | ||
| 1213 | { | 1204 | { |
| 1214 | return -ENODEV; | 1205 | return -ENODEV; |
| 1215 | } | 1206 | } |
diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c index 70b77ae67422..3d4050681325 100644 --- a/drivers/infiniband/core/sysfs.c +++ b/drivers/infiniband/core/sysfs.c | |||
| @@ -434,21 +434,18 @@ static void ib_device_release(struct class_device *cdev) | |||
| 434 | kfree(dev); | 434 | kfree(dev); |
| 435 | } | 435 | } |
| 436 | 436 | ||
| 437 | static int ib_device_uevent(struct class_device *cdev, char **envp, | 437 | static int ib_device_uevent(struct class_device *cdev, |
| 438 | int num_envp, char *buf, int size) | 438 | struct kobj_uevent_env *env) |
| 439 | { | 439 | { |
| 440 | struct ib_device *dev = container_of(cdev, struct ib_device, class_dev); | 440 | struct ib_device *dev = container_of(cdev, struct ib_device, class_dev); |
| 441 | int i = 0, len = 0; | ||
| 442 | 441 | ||
| 443 | if (add_uevent_var(envp, num_envp, &i, buf, size, &len, | 442 | if (add_uevent_var(env, "NAME=%s", dev->name)) |
| 444 | "NAME=%s", dev->name)) | ||
| 445 | return -ENOMEM; | 443 | return -ENOMEM; |
| 446 | 444 | ||
| 447 | /* | 445 | /* |
| 448 | * It would be nice to pass the node GUID with the event... | 446 | * It would be nice to pass the node GUID with the event... |
| 449 | */ | 447 | */ |
| 450 | 448 | ||
| 451 | envp[i] = NULL; | ||
| 452 | return 0; | 449 | return 0; |
| 453 | } | 450 | } |
| 454 | 451 | ||
diff --git a/drivers/input/input.c b/drivers/input/input.c index 5fe755586623..5dc361c954e2 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
| @@ -859,87 +859,66 @@ static void input_dev_release(struct device *device) | |||
| 859 | * Input uevent interface - loading event handlers based on | 859 | * Input uevent interface - loading event handlers based on |
| 860 | * device bitfields. | 860 | * device bitfields. |
| 861 | */ | 861 | */ |
| 862 | static int input_add_uevent_bm_var(char **envp, int num_envp, int *cur_index, | 862 | static int input_add_uevent_bm_var(struct kobj_uevent_env *env, |
| 863 | char *buffer, int buffer_size, int *cur_len, | ||
| 864 | const char *name, unsigned long *bitmap, int max) | 863 | const char *name, unsigned long *bitmap, int max) |
| 865 | { | 864 | { |
| 866 | if (*cur_index >= num_envp - 1) | 865 | int len; |
| 867 | return -ENOMEM; | ||
| 868 | |||
| 869 | envp[*cur_index] = buffer + *cur_len; | ||
| 870 | 866 | ||
| 871 | *cur_len += snprintf(buffer + *cur_len, max(buffer_size - *cur_len, 0), name); | 867 | if (add_uevent_var(env, "%s=", name)) |
| 872 | if (*cur_len >= buffer_size) | ||
| 873 | return -ENOMEM; | 868 | return -ENOMEM; |
| 874 | 869 | ||
| 875 | *cur_len += input_print_bitmap(buffer + *cur_len, | 870 | len = input_print_bitmap(&env->buf[env->buflen - 1], |
| 876 | max(buffer_size - *cur_len, 0), | 871 | sizeof(env->buf) - env->buflen, |
| 877 | bitmap, max, 0) + 1; | 872 | bitmap, max, 0); |
| 878 | if (*cur_len > buffer_size) | 873 | if (len >= (sizeof(env->buf) - env->buflen)) |
| 879 | return -ENOMEM; | 874 | return -ENOMEM; |
| 880 | 875 | ||
| 881 | (*cur_index)++; | 876 | env->buflen += len; |
| 882 | return 0; | 877 | return 0; |
| 883 | } | 878 | } |
| 884 | 879 | ||
| 885 | static int input_add_uevent_modalias_var(char **envp, int num_envp, int *cur_index, | 880 | static int input_add_uevent_modalias_var(struct kobj_uevent_env *env, |
| 886 | char *buffer, int buffer_size, int *cur_len, | ||
| 887 | struct input_dev *dev) | 881 | struct input_dev *dev) |
| 888 | { | 882 | { |
| 889 | if (*cur_index >= num_envp - 1) | 883 | int len; |
| 890 | return -ENOMEM; | ||
| 891 | |||
| 892 | envp[*cur_index] = buffer + *cur_len; | ||
| 893 | 884 | ||
| 894 | *cur_len += snprintf(buffer + *cur_len, max(buffer_size - *cur_len, 0), | 885 | if (add_uevent_var(env, "MODALIAS=")) |
| 895 | "MODALIAS="); | ||
| 896 | if (*cur_len >= buffer_size) | ||
| 897 | return -ENOMEM; | 886 | return -ENOMEM; |
| 898 | 887 | ||
| 899 | *cur_len += input_print_modalias(buffer + *cur_len, | 888 | len = input_print_modalias(&env->buf[env->buflen - 1], |
| 900 | max(buffer_size - *cur_len, 0), | 889 | sizeof(env->buf) - env->buflen, |
| 901 | dev, 0) + 1; | 890 | dev, 0); |
| 902 | if (*cur_len > buffer_size) | 891 | if (len >= (sizeof(env->buf) - env->buflen)) |
| 903 | return -ENOMEM; | 892 | return -ENOMEM; |
| 904 | 893 | ||
| 905 | (*cur_index)++; | 894 | env->buflen += len; |
| 906 | return 0; | 895 | return 0; |
| 907 | } | 896 | } |
| 908 | 897 | ||
| 909 | #define INPUT_ADD_HOTPLUG_VAR(fmt, val...) \ | 898 | #define INPUT_ADD_HOTPLUG_VAR(fmt, val...) \ |
| 910 | do { \ | 899 | do { \ |
| 911 | int err = add_uevent_var(envp, num_envp, &i, \ | 900 | int err = add_uevent_var(env, fmt, val); \ |
| 912 | buffer, buffer_size, &len, \ | ||
| 913 | fmt, val); \ | ||
| 914 | if (err) \ | 901 | if (err) \ |
| 915 | return err; \ | 902 | return err; \ |
| 916 | } while (0) | 903 | } while (0) |
| 917 | 904 | ||
| 918 | #define INPUT_ADD_HOTPLUG_BM_VAR(name, bm, max) \ | 905 | #define INPUT_ADD_HOTPLUG_BM_VAR(name, bm, max) \ |
| 919 | do { \ | 906 | do { \ |
| 920 | int err = input_add_uevent_bm_var(envp, num_envp, &i, \ | 907 | int err = input_add_uevent_bm_var(env, name, bm, max); \ |
| 921 | buffer, buffer_size, &len, \ | ||
| 922 | name, bm, max); \ | ||
| 923 | if (err) \ | 908 | if (err) \ |
| 924 | return err; \ | 909 | return err; \ |
| 925 | } while (0) | 910 | } while (0) |
| 926 | 911 | ||
| 927 | #define INPUT_ADD_HOTPLUG_MODALIAS_VAR(dev) \ | 912 | #define INPUT_ADD_HOTPLUG_MODALIAS_VAR(dev) \ |
| 928 | do { \ | 913 | do { \ |
| 929 | int err = input_add_uevent_modalias_var(envp, \ | 914 | int err = input_add_uevent_modalias_var(env, dev); \ |
| 930 | num_envp, &i, \ | ||
| 931 | buffer, buffer_size, &len, \ | ||
| 932 | dev); \ | ||
| 933 | if (err) \ | 915 | if (err) \ |
| 934 | return err; \ | 916 | return err; \ |
| 935 | } while (0) | 917 | } while (0) |
| 936 | 918 | ||
| 937 | static int input_dev_uevent(struct device *device, char **envp, | 919 | static int input_dev_uevent(struct device *device, struct kobj_uevent_env *env) |
| 938 | int num_envp, char *buffer, int buffer_size) | ||
| 939 | { | 920 | { |
| 940 | struct input_dev *dev = to_input_dev(device); | 921 | struct input_dev *dev = to_input_dev(device); |
| 941 | int i = 0; | ||
| 942 | int len = 0; | ||
| 943 | 922 | ||
| 944 | INPUT_ADD_HOTPLUG_VAR("PRODUCT=%x/%x/%x/%x", | 923 | INPUT_ADD_HOTPLUG_VAR("PRODUCT=%x/%x/%x/%x", |
| 945 | dev->id.bustype, dev->id.vendor, | 924 | dev->id.bustype, dev->id.vendor, |
| @@ -971,7 +950,6 @@ static int input_dev_uevent(struct device *device, char **envp, | |||
| 971 | 950 | ||
| 972 | INPUT_ADD_HOTPLUG_MODALIAS_VAR(dev); | 951 | INPUT_ADD_HOTPLUG_MODALIAS_VAR(dev); |
| 973 | 952 | ||
| 974 | envp[i] = NULL; | ||
| 975 | return 0; | 953 | return 0; |
| 976 | } | 954 | } |
| 977 | 955 | ||
diff --git a/drivers/input/misc/pcspkr.c b/drivers/input/misc/pcspkr.c index 4e2ca6f0ab18..c19f77fbaf2a 100644 --- a/drivers/input/misc/pcspkr.c +++ b/drivers/input/misc/pcspkr.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>"); | 22 | MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>"); |
| 23 | MODULE_DESCRIPTION("PC Speaker beeper driver"); | 23 | MODULE_DESCRIPTION("PC Speaker beeper driver"); |
| 24 | MODULE_LICENSE("GPL"); | 24 | MODULE_LICENSE("GPL"); |
| 25 | MODULE_ALIAS("platform:pcspkr"); | ||
| 25 | 26 | ||
| 26 | #ifdef CONFIG_X86 | 27 | #ifdef CONFIG_X86 |
| 27 | /* Use the global PIT lock ! */ | 28 | /* Use the global PIT lock ! */ |
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index 372ca4931194..b3bc15acd3f5 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c | |||
| @@ -876,18 +876,14 @@ static int serio_bus_match(struct device *dev, struct device_driver *drv) | |||
| 876 | 876 | ||
| 877 | #define SERIO_ADD_UEVENT_VAR(fmt, val...) \ | 877 | #define SERIO_ADD_UEVENT_VAR(fmt, val...) \ |
| 878 | do { \ | 878 | do { \ |
| 879 | int err = add_uevent_var(envp, num_envp, &i, \ | 879 | int err = add_uevent_var(env, fmt, val); \ |
| 880 | buffer, buffer_size, &len, \ | ||
| 881 | fmt, val); \ | ||
| 882 | if (err) \ | 880 | if (err) \ |
| 883 | return err; \ | 881 | return err; \ |
| 884 | } while (0) | 882 | } while (0) |
| 885 | 883 | ||
| 886 | static int serio_uevent(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size) | 884 | static int serio_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 887 | { | 885 | { |
| 888 | struct serio *serio; | 886 | struct serio *serio; |
| 889 | int i = 0; | ||
| 890 | int len = 0; | ||
| 891 | 887 | ||
| 892 | if (!dev) | 888 | if (!dev) |
| 893 | return -ENODEV; | 889 | return -ENODEV; |
| @@ -900,7 +896,6 @@ static int serio_uevent(struct device *dev, char **envp, int num_envp, char *buf | |||
| 900 | SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra); | 896 | SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra); |
| 901 | SERIO_ADD_UEVENT_VAR("MODALIAS=serio:ty%02Xpr%02Xid%02Xex%02X", | 897 | SERIO_ADD_UEVENT_VAR("MODALIAS=serio:ty%02Xpr%02Xid%02Xex%02X", |
| 902 | serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); | 898 | serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); |
| 903 | envp[i] = NULL; | ||
| 904 | 899 | ||
| 905 | return 0; | 900 | return 0; |
| 906 | } | 901 | } |
| @@ -908,7 +903,7 @@ static int serio_uevent(struct device *dev, char **envp, int num_envp, char *buf | |||
| 908 | 903 | ||
| 909 | #else | 904 | #else |
| 910 | 905 | ||
| 911 | static int serio_uevent(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size) | 906 | static int serio_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 912 | { | 907 | { |
| 913 | return -ENODEV; | 908 | return -ENODEV; |
| 914 | } | 909 | } |
diff --git a/drivers/md/md.c b/drivers/md/md.c index e8f102ea9b03..acf1b81b47cb 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -3076,8 +3076,7 @@ static struct kobject *md_probe(dev_t dev, int *part, void *data) | |||
| 3076 | mddev->gendisk = disk; | 3076 | mddev->gendisk = disk; |
| 3077 | mutex_unlock(&disks_mutex); | 3077 | mutex_unlock(&disks_mutex); |
| 3078 | mddev->kobj.parent = &disk->kobj; | 3078 | mddev->kobj.parent = &disk->kobj; |
| 3079 | mddev->kobj.k_name = NULL; | 3079 | kobject_set_name(&mddev->kobj, "%s", "md"); |
| 3080 | snprintf(mddev->kobj.name, KOBJ_NAME_LEN, "%s", "md"); | ||
| 3081 | mddev->kobj.ktype = &md_ktype; | 3080 | mddev->kobj.ktype = &md_ktype; |
| 3082 | if (kobject_register(&mddev->kobj)) | 3081 | if (kobject_register(&mddev->kobj)) |
| 3083 | printk(KERN_WARNING "md: cannot register %s/md - name in use\n", | 3082 | printk(KERN_WARNING "md: cannot register %s/md - name in use\n", |
diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c index 56231d8edc07..18738faecbbc 100644 --- a/drivers/media/dvb/dvb-core/dvbdev.c +++ b/drivers/media/dvb/dvb-core/dvbdev.c | |||
| @@ -103,10 +103,7 @@ static struct file_operations dvb_device_fops = | |||
| 103 | .open = dvb_device_open, | 103 | .open = dvb_device_open, |
| 104 | }; | 104 | }; |
| 105 | 105 | ||
| 106 | static struct cdev dvb_device_cdev = { | 106 | static struct cdev dvb_device_cdev; |
| 107 | .kobj = {.name = "dvb", }, | ||
| 108 | .owner = THIS_MODULE, | ||
| 109 | }; | ||
| 110 | 107 | ||
| 111 | int dvb_generic_open(struct inode *inode, struct file *file) | 108 | int dvb_generic_open(struct inode *inode, struct file *file) |
| 112 | { | 109 | { |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c index 7a78d6b34738..2ee3c3049e8f 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c +++ b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c | |||
| @@ -905,8 +905,8 @@ struct pvr2_sysfs *pvr2_sysfs_create(struct pvr2_context *mp, | |||
| 905 | } | 905 | } |
| 906 | 906 | ||
| 907 | 907 | ||
| 908 | static int pvr2_sysfs_hotplug(struct device *cd,char **envp, | 908 | static int pvr2_sysfs_hotplug(struct device *d, |
| 909 | int numenvp,char *buf,int size) | 909 | struct kobj_uevent_env *env) |
| 910 | { | 910 | { |
| 911 | /* Even though we don't do anything here, we still need this function | 911 | /* Even though we don't do anything here, we still need this function |
| 912 | because sysfs will still try to call it. */ | 912 | because sysfs will still try to call it. */ |
diff --git a/drivers/misc/tifm_core.c b/drivers/misc/tifm_core.c index d195fb088f4a..8f77949f93dd 100644 --- a/drivers/misc/tifm_core.c +++ b/drivers/misc/tifm_core.c | |||
| @@ -57,16 +57,11 @@ static int tifm_bus_match(struct device *dev, struct device_driver *drv) | |||
| 57 | return 0; | 57 | return 0; |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | static int tifm_uevent(struct device *dev, char **envp, int num_envp, | 60 | static int tifm_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 61 | char *buffer, int buffer_size) | ||
| 62 | { | 61 | { |
| 63 | struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev); | 62 | struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev); |
| 64 | int i = 0; | ||
| 65 | int length = 0; | ||
| 66 | 63 | ||
| 67 | if (add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length, | 64 | if (add_uevent_var(env, "TIFM_CARD_TYPE=%s", tifm_media_type_name(sock->type, 1))) |
| 68 | "TIFM_CARD_TYPE=%s", | ||
| 69 | tifm_media_type_name(sock->type, 1))) | ||
| 70 | return -ENOMEM; | 65 | return -ENOMEM; |
| 71 | 66 | ||
| 72 | return 0; | 67 | return 0; |
diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index 8d6f6014870f..b0c22cad9423 100644 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c | |||
| @@ -58,12 +58,11 @@ static int mmc_bus_match(struct device *dev, struct device_driver *drv) | |||
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | static int | 60 | static int |
| 61 | mmc_bus_uevent(struct device *dev, char **envp, int num_envp, char *buf, | 61 | mmc_bus_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 62 | int buf_size) | ||
| 63 | { | 62 | { |
| 64 | struct mmc_card *card = dev_to_mmc_card(dev); | 63 | struct mmc_card *card = dev_to_mmc_card(dev); |
| 65 | const char *type; | 64 | const char *type; |
| 66 | int i = 0, length = 0; | 65 | int retval = 0; |
| 67 | 66 | ||
| 68 | switch (card->type) { | 67 | switch (card->type) { |
| 69 | case MMC_TYPE_MMC: | 68 | case MMC_TYPE_MMC: |
| @@ -80,20 +79,14 @@ mmc_bus_uevent(struct device *dev, char **envp, int num_envp, char *buf, | |||
| 80 | } | 79 | } |
| 81 | 80 | ||
| 82 | if (type) { | 81 | if (type) { |
| 83 | if (add_uevent_var(envp, num_envp, &i, | 82 | retval = add_uevent_var(env, "MMC_TYPE=%s", type); |
| 84 | buf, buf_size, &length, | 83 | if (retval) |
| 85 | "MMC_TYPE=%s", type)) | 84 | return retval; |
| 86 | return -ENOMEM; | ||
| 87 | } | 85 | } |
| 88 | 86 | ||
| 89 | if (add_uevent_var(envp, num_envp, &i, | 87 | retval = add_uevent_var(env, "MMC_NAME=%s", mmc_card_name(card)); |
| 90 | buf, buf_size, &length, | ||
| 91 | "MMC_NAME=%s", mmc_card_name(card))) | ||
| 92 | return -ENOMEM; | ||
| 93 | 88 | ||
| 94 | envp[i] = NULL; | 89 | return retval; |
| 95 | |||
| 96 | return 0; | ||
| 97 | } | 90 | } |
| 98 | 91 | ||
| 99 | static int mmc_bus_probe(struct device *dev) | 92 | static int mmc_bus_probe(struct device *dev) |
diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c index 4ac161e1ca12..7d7758f3ad8c 100644 --- a/drivers/net/ibmveth.c +++ b/drivers/net/ibmveth.c | |||
| @@ -1183,7 +1183,7 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_ | |||
| 1183 | pool_count[i], pool_size[i], | 1183 | pool_count[i], pool_size[i], |
| 1184 | pool_active[i]); | 1184 | pool_active[i]); |
| 1185 | kobj->parent = &dev->dev.kobj; | 1185 | kobj->parent = &dev->dev.kobj; |
| 1186 | sprintf(kobj->name, "pool%d", i); | 1186 | kobject_set_name(kobj, "pool%d", i); |
| 1187 | kobj->ktype = &ktype_veth_pool; | 1187 | kobj->ktype = &ktype_veth_pool; |
| 1188 | kobject_register(kobj); | 1188 | kobject_register(kobj); |
| 1189 | } | 1189 | } |
diff --git a/drivers/pci/hotplug.c b/drivers/pci/hotplug.c index 1c97e7dd130b..2b5352a7dffc 100644 --- a/drivers/pci/hotplug.c +++ b/drivers/pci/hotplug.c | |||
| @@ -3,12 +3,9 @@ | |||
| 3 | #include <linux/module.h> | 3 | #include <linux/module.h> |
| 4 | #include "pci.h" | 4 | #include "pci.h" |
| 5 | 5 | ||
| 6 | int pci_uevent(struct device *dev, char **envp, int num_envp, | 6 | int pci_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 7 | char *buffer, int buffer_size) | ||
| 8 | { | 7 | { |
| 9 | struct pci_dev *pdev; | 8 | struct pci_dev *pdev; |
| 10 | int i = 0; | ||
| 11 | int length = 0; | ||
| 12 | 9 | ||
| 13 | if (!dev) | 10 | if (!dev) |
| 14 | return -ENODEV; | 11 | return -ENODEV; |
| @@ -17,37 +14,24 @@ int pci_uevent(struct device *dev, char **envp, int num_envp, | |||
| 17 | if (!pdev) | 14 | if (!pdev) |
| 18 | return -ENODEV; | 15 | return -ENODEV; |
| 19 | 16 | ||
| 20 | if (add_uevent_var(envp, num_envp, &i, | 17 | if (add_uevent_var(env, "PCI_CLASS=%04X", pdev->class)) |
| 21 | buffer, buffer_size, &length, | ||
| 22 | "PCI_CLASS=%04X", pdev->class)) | ||
| 23 | return -ENOMEM; | 18 | return -ENOMEM; |
| 24 | 19 | ||
| 25 | if (add_uevent_var(envp, num_envp, &i, | 20 | if (add_uevent_var(env, "PCI_ID=%04X:%04X", pdev->vendor, pdev->device)) |
| 26 | buffer, buffer_size, &length, | ||
| 27 | "PCI_ID=%04X:%04X", pdev->vendor, pdev->device)) | ||
| 28 | return -ENOMEM; | 21 | return -ENOMEM; |
| 29 | 22 | ||
| 30 | if (add_uevent_var(envp, num_envp, &i, | 23 | if (add_uevent_var(env, "PCI_SUBSYS_ID=%04X:%04X", pdev->subsystem_vendor, |
| 31 | buffer, buffer_size, &length, | ||
| 32 | "PCI_SUBSYS_ID=%04X:%04X", pdev->subsystem_vendor, | ||
| 33 | pdev->subsystem_device)) | 24 | pdev->subsystem_device)) |
| 34 | return -ENOMEM; | 25 | return -ENOMEM; |
| 35 | 26 | ||
| 36 | if (add_uevent_var(envp, num_envp, &i, | 27 | if (add_uevent_var(env, "PCI_SLOT_NAME=%s", pci_name(pdev))) |
| 37 | buffer, buffer_size, &length, | ||
| 38 | "PCI_SLOT_NAME=%s", pci_name(pdev))) | ||
| 39 | return -ENOMEM; | 28 | return -ENOMEM; |
| 40 | 29 | ||
| 41 | if (add_uevent_var(envp, num_envp, &i, | 30 | if (add_uevent_var(env, "MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x", |
| 42 | buffer, buffer_size, &length, | ||
| 43 | "MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x", | ||
| 44 | pdev->vendor, pdev->device, | 31 | pdev->vendor, pdev->device, |
| 45 | pdev->subsystem_vendor, pdev->subsystem_device, | 32 | pdev->subsystem_vendor, pdev->subsystem_device, |
| 46 | (u8)(pdev->class >> 16), (u8)(pdev->class >> 8), | 33 | (u8)(pdev->class >> 16), (u8)(pdev->class >> 8), |
| 47 | (u8)(pdev->class))) | 34 | (u8)(pdev->class))) |
| 48 | return -ENOMEM; | 35 | return -ENOMEM; |
| 49 | |||
| 50 | envp[i] = NULL; | ||
| 51 | |||
| 52 | return 0; | 36 | return 0; |
| 53 | } | 37 | } |
diff --git a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/pci_hotplug_core.c index bd433ef6bfc6..f0eba534f805 100644 --- a/drivers/pci/hotplug/pci_hotplug_core.c +++ b/drivers/pci/hotplug/pci_hotplug_core.c | |||
| @@ -694,66 +694,6 @@ int __must_check pci_hp_change_slot_info(struct hotplug_slot *slot, | |||
| 694 | if ((slot == NULL) || (info == NULL)) | 694 | if ((slot == NULL) || (info == NULL)) |
| 695 | return -ENODEV; | 695 | return -ENODEV; |
| 696 | 696 | ||
| 697 | /* | ||
| 698 | * check all fields in the info structure, and update timestamps | ||
| 699 | * for the files referring to the fields that have now changed. | ||
| 700 | */ | ||
| 701 | if ((has_power_file(slot) == 0) && | ||
| 702 | (slot->info->power_status != info->power_status)) { | ||
| 703 | retval = sysfs_update_file(&slot->kobj, | ||
| 704 | &hotplug_slot_attr_power.attr); | ||
| 705 | if (retval) | ||
| 706 | return retval; | ||
| 707 | } | ||
| 708 | |||
| 709 | if ((has_attention_file(slot) == 0) && | ||
| 710 | (slot->info->attention_status != info->attention_status)) { | ||
| 711 | retval = sysfs_update_file(&slot->kobj, | ||
| 712 | &hotplug_slot_attr_attention.attr); | ||
| 713 | if (retval) | ||
| 714 | return retval; | ||
| 715 | } | ||
| 716 | |||
| 717 | if ((has_latch_file(slot) == 0) && | ||
| 718 | (slot->info->latch_status != info->latch_status)) { | ||
| 719 | retval = sysfs_update_file(&slot->kobj, | ||
| 720 | &hotplug_slot_attr_latch.attr); | ||
| 721 | if (retval) | ||
| 722 | return retval; | ||
| 723 | } | ||
| 724 | |||
| 725 | if ((has_adapter_file(slot) == 0) && | ||
| 726 | (slot->info->adapter_status != info->adapter_status)) { | ||
| 727 | retval = sysfs_update_file(&slot->kobj, | ||
| 728 | &hotplug_slot_attr_presence.attr); | ||
| 729 | if (retval) | ||
| 730 | return retval; | ||
| 731 | } | ||
| 732 | |||
| 733 | if ((has_address_file(slot) == 0) && | ||
| 734 | (slot->info->address != info->address)) { | ||
| 735 | retval = sysfs_update_file(&slot->kobj, | ||
| 736 | &hotplug_slot_attr_address.attr); | ||
| 737 | if (retval) | ||
| 738 | return retval; | ||
| 739 | } | ||
| 740 | |||
| 741 | if ((has_max_bus_speed_file(slot) == 0) && | ||
| 742 | (slot->info->max_bus_speed != info->max_bus_speed)) { | ||
| 743 | retval = sysfs_update_file(&slot->kobj, | ||
| 744 | &hotplug_slot_attr_max_bus_speed.attr); | ||
| 745 | if (retval) | ||
| 746 | return retval; | ||
| 747 | } | ||
| 748 | |||
| 749 | if ((has_cur_bus_speed_file(slot) == 0) && | ||
| 750 | (slot->info->cur_bus_speed != info->cur_bus_speed)) { | ||
| 751 | retval = sysfs_update_file(&slot->kobj, | ||
| 752 | &hotplug_slot_attr_cur_bus_speed.attr); | ||
| 753 | if (retval) | ||
| 754 | return retval; | ||
| 755 | } | ||
| 756 | |||
| 757 | memcpy (slot->info, info, sizeof (struct hotplug_slot_info)); | 697 | memcpy (slot->info, info, sizeof (struct hotplug_slot_info)); |
| 758 | 698 | ||
| 759 | return 0; | 699 | return 0; |
diff --git a/drivers/pci/hotplug/rpadlpar_sysfs.c b/drivers/pci/hotplug/rpadlpar_sysfs.c index df076064a3e0..a080fedf0332 100644 --- a/drivers/pci/hotplug/rpadlpar_sysfs.c +++ b/drivers/pci/hotplug/rpadlpar_sysfs.c | |||
| @@ -129,17 +129,17 @@ struct kobj_type ktype_dlpar_io = { | |||
| 129 | }; | 129 | }; |
| 130 | 130 | ||
| 131 | struct kset dlpar_io_kset = { | 131 | struct kset dlpar_io_kset = { |
| 132 | .kobj = {.name = DLPAR_KOBJ_NAME, | 132 | .kobj = {.ktype = &ktype_dlpar_io, |
| 133 | .ktype = &ktype_dlpar_io, | ||
| 134 | .parent = &pci_hotplug_slots_subsys.kobj}, | 133 | .parent = &pci_hotplug_slots_subsys.kobj}, |
| 135 | .ktype = &ktype_dlpar_io, | 134 | .ktype = &ktype_dlpar_io, |
| 136 | }; | 135 | }; |
| 137 | 136 | ||
| 138 | int dlpar_sysfs_init(void) | 137 | int dlpar_sysfs_init(void) |
| 139 | { | 138 | { |
| 139 | kobject_set_name(&dlpar_io_kset.kobj, DLPAR_KOBJ_NAME); | ||
| 140 | if (kset_register(&dlpar_io_kset)) { | 140 | if (kset_register(&dlpar_io_kset)) { |
| 141 | printk(KERN_ERR "rpadlpar_io: cannot register kset for %s\n", | 141 | printk(KERN_ERR "rpadlpar_io: cannot register kset for %s\n", |
| 142 | dlpar_io_kset.kobj.name); | 142 | kobject_name(&dlpar_io_kset.kobj)); |
| 143 | return -EINVAL; | 143 | return -EINVAL; |
| 144 | } | 144 | } |
| 145 | 145 | ||
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 004bc2487270..f61be3abfdca 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
| @@ -532,8 +532,7 @@ void pci_dev_put(struct pci_dev *dev) | |||
| 532 | } | 532 | } |
| 533 | 533 | ||
| 534 | #ifndef CONFIG_HOTPLUG | 534 | #ifndef CONFIG_HOTPLUG |
| 535 | int pci_uevent(struct device *dev, char **envp, int num_envp, | 535 | int pci_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 536 | char *buffer, int buffer_size) | ||
| 537 | { | 536 | { |
| 538 | return -ENODEV; | 537 | return -ENODEV; |
| 539 | } | 538 | } |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 4c36e80f6d26..b3a7d5b0f936 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* Functions internal to the PCI core code */ | 1 | /* Functions internal to the PCI core code */ |
| 2 | 2 | ||
| 3 | extern int pci_uevent(struct device *dev, char **envp, int num_envp, | 3 | extern int pci_uevent(struct device *dev, struct kobj_uevent_env *env); |
| 4 | char *buffer, int buffer_size); | ||
| 5 | extern int pci_create_sysfs_dev_files(struct pci_dev *pdev); | 4 | extern int pci_create_sysfs_dev_files(struct pci_dev *pdev); |
| 6 | extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev); | 5 | extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev); |
| 7 | extern void pci_cleanup_rom(struct pci_dev *dev); | 6 | extern void pci_cleanup_rom(struct pci_dev *dev); |
diff --git a/drivers/pci/setup-irq.c b/drivers/pci/setup-irq.c index 568f1877315c..05ca2ed9eb51 100644 --- a/drivers/pci/setup-irq.c +++ b/drivers/pci/setup-irq.c | |||
| @@ -48,7 +48,7 @@ pdev_fixup_irq(struct pci_dev *dev, | |||
| 48 | dev->irq = irq; | 48 | dev->irq = irq; |
| 49 | 49 | ||
| 50 | pr_debug("PCI: fixup irq: (%s) got %d\n", | 50 | pr_debug("PCI: fixup irq: (%s) got %d\n", |
| 51 | dev->dev.kobj.name, dev->irq); | 51 | kobject_name(&dev->dev.kobj), dev->irq); |
| 52 | 52 | ||
| 53 | /* Always tell the device, so the driver knows what is | 53 | /* Always tell the device, so the driver knows what is |
| 54 | the real IRQ to use; the device does not use it. */ | 54 | the real IRQ to use; the device does not use it. */ |
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index f8b13f0270d7..a0aca46ce877 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
| @@ -907,18 +907,14 @@ int pcmcia_insert_card(struct pcmcia_socket *skt) | |||
| 907 | EXPORT_SYMBOL(pcmcia_insert_card); | 907 | EXPORT_SYMBOL(pcmcia_insert_card); |
| 908 | 908 | ||
| 909 | 909 | ||
| 910 | static int pcmcia_socket_uevent(struct device *dev, char **envp, | 910 | static int pcmcia_socket_uevent(struct device *dev, |
| 911 | int num_envp, char *buffer, int buffer_size) | 911 | struct kobj_uevent_env *env) |
| 912 | { | 912 | { |
| 913 | struct pcmcia_socket *s = container_of(dev, struct pcmcia_socket, dev); | 913 | struct pcmcia_socket *s = container_of(dev, struct pcmcia_socket, dev); |
| 914 | int i = 0, length = 0; | ||
| 915 | 914 | ||
| 916 | if (add_uevent_var(envp, num_envp, &i, buffer, buffer_size, | 915 | if (add_uevent_var(env, "SOCKET_NO=%u", s->sock)) |
| 917 | &length, "SOCKET_NO=%u", s->sock)) | ||
| 918 | return -ENOMEM; | 916 | return -ENOMEM; |
| 919 | 917 | ||
| 920 | envp[i] = NULL; | ||
| 921 | |||
| 922 | return 0; | 918 | return 0; |
| 923 | } | 919 | } |
| 924 | 920 | ||
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index a99607142fc8..55baa1f0fcbb 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
| @@ -1064,11 +1064,10 @@ static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) { | |||
| 1064 | 1064 | ||
| 1065 | #ifdef CONFIG_HOTPLUG | 1065 | #ifdef CONFIG_HOTPLUG |
| 1066 | 1066 | ||
| 1067 | static int pcmcia_bus_uevent(struct device *dev, char **envp, int num_envp, | 1067 | static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 1068 | char *buffer, int buffer_size) | ||
| 1069 | { | 1068 | { |
| 1070 | struct pcmcia_device *p_dev; | 1069 | struct pcmcia_device *p_dev; |
| 1071 | int i, length = 0; | 1070 | int i; |
| 1072 | u32 hash[4] = { 0, 0, 0, 0}; | 1071 | u32 hash[4] = { 0, 0, 0, 0}; |
| 1073 | 1072 | ||
| 1074 | if (!dev) | 1073 | if (!dev) |
| @@ -1083,23 +1082,13 @@ static int pcmcia_bus_uevent(struct device *dev, char **envp, int num_envp, | |||
| 1083 | hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i])); | 1082 | hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i])); |
| 1084 | } | 1083 | } |
| 1085 | 1084 | ||
| 1086 | i = 0; | 1085 | if (add_uevent_var(env, "SOCKET_NO=%u", p_dev->socket->sock)) |
| 1087 | |||
| 1088 | if (add_uevent_var(envp, num_envp, &i, | ||
| 1089 | buffer, buffer_size, &length, | ||
| 1090 | "SOCKET_NO=%u", | ||
| 1091 | p_dev->socket->sock)) | ||
| 1092 | return -ENOMEM; | 1086 | return -ENOMEM; |
| 1093 | 1087 | ||
| 1094 | if (add_uevent_var(envp, num_envp, &i, | 1088 | if (add_uevent_var(env, "DEVICE_NO=%02X", p_dev->device_no)) |
| 1095 | buffer, buffer_size, &length, | ||
| 1096 | "DEVICE_NO=%02X", | ||
| 1097 | p_dev->device_no)) | ||
| 1098 | return -ENOMEM; | 1089 | return -ENOMEM; |
| 1099 | 1090 | ||
| 1100 | if (add_uevent_var(envp, num_envp, &i, | 1091 | if (add_uevent_var(env, "MODALIAS=pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X" |
| 1101 | buffer, buffer_size, &length, | ||
| 1102 | "MODALIAS=pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X" | ||
| 1103 | "pa%08Xpb%08Xpc%08Xpd%08X", | 1092 | "pa%08Xpb%08Xpc%08Xpd%08X", |
| 1104 | p_dev->has_manf_id ? p_dev->manf_id : 0, | 1093 | p_dev->has_manf_id ? p_dev->manf_id : 0, |
| 1105 | p_dev->has_card_id ? p_dev->card_id : 0, | 1094 | p_dev->has_card_id ? p_dev->card_id : 0, |
| @@ -1112,15 +1101,12 @@ static int pcmcia_bus_uevent(struct device *dev, char **envp, int num_envp, | |||
| 1112 | hash[3])) | 1101 | hash[3])) |
| 1113 | return -ENOMEM; | 1102 | return -ENOMEM; |
| 1114 | 1103 | ||
| 1115 | envp[i] = NULL; | ||
| 1116 | |||
| 1117 | return 0; | 1104 | return 0; |
| 1118 | } | 1105 | } |
| 1119 | 1106 | ||
| 1120 | #else | 1107 | #else |
| 1121 | 1108 | ||
| 1122 | static int pcmcia_bus_uevent(struct device *dev, char **envp, int num_envp, | 1109 | static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 1123 | char *buffer, int buffer_size) | ||
| 1124 | { | 1110 | { |
| 1125 | return -ENODEV; | 1111 | return -ENODEV; |
| 1126 | } | 1112 | } |
diff --git a/drivers/pcmcia/pxa2xx_mainstone.c b/drivers/pcmcia/pxa2xx_mainstone.c index 383107ba4bd3..f6722ba0dd1e 100644 --- a/drivers/pcmcia/pxa2xx_mainstone.c +++ b/drivers/pcmcia/pxa2xx_mainstone.c | |||
| @@ -175,7 +175,6 @@ static int __init mst_pcmcia_init(void) | |||
| 175 | if (!mst_pcmcia_device) | 175 | if (!mst_pcmcia_device) |
| 176 | return -ENOMEM; | 176 | return -ENOMEM; |
| 177 | 177 | ||
| 178 | mst_pcmcia_device->dev.uevent_suppress = 0; | ||
| 179 | mst_pcmcia_device->dev.platform_data = &mst_pcmcia_ops; | 178 | mst_pcmcia_device->dev.platform_data = &mst_pcmcia_ops; |
| 180 | 179 | ||
| 181 | ret = platform_device_add(mst_pcmcia_device); | 180 | ret = platform_device_add(mst_pcmcia_device); |
| @@ -195,3 +194,4 @@ fs_initcall(mst_pcmcia_init); | |||
| 195 | module_exit(mst_pcmcia_exit); | 194 | module_exit(mst_pcmcia_exit); |
| 196 | 195 | ||
| 197 | MODULE_LICENSE("GPL"); | 196 | MODULE_LICENSE("GPL"); |
| 197 | MODULE_ALIAS("platform:pxa2xx-pcmcia"); | ||
diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx_sharpsl.c index a2daa3f531b2..d5c33bd78d68 100644 --- a/drivers/pcmcia/pxa2xx_sharpsl.c +++ b/drivers/pcmcia/pxa2xx_sharpsl.c | |||
| @@ -261,7 +261,6 @@ static int __init sharpsl_pcmcia_init(void) | |||
| 261 | if (!sharpsl_pcmcia_device) | 261 | if (!sharpsl_pcmcia_device) |
| 262 | return -ENOMEM; | 262 | return -ENOMEM; |
| 263 | 263 | ||
| 264 | sharpsl_pcmcia_device->dev.uevent_suppress = 0; | ||
| 265 | sharpsl_pcmcia_device->dev.platform_data = &sharpsl_pcmcia_ops; | 264 | sharpsl_pcmcia_device->dev.platform_data = &sharpsl_pcmcia_ops; |
| 266 | sharpsl_pcmcia_device->dev.parent = platform_scoop_config->devs[0].dev; | 265 | sharpsl_pcmcia_device->dev.parent = platform_scoop_config->devs[0].dev; |
| 267 | 266 | ||
| @@ -284,3 +283,4 @@ module_exit(sharpsl_pcmcia_exit); | |||
| 284 | 283 | ||
| 285 | MODULE_DESCRIPTION("Sharp SL Series PCMCIA Support"); | 284 | MODULE_DESCRIPTION("Sharp SL Series PCMCIA Support"); |
| 286 | MODULE_LICENSE("GPL"); | 285 | MODULE_LICENSE("GPL"); |
| 286 | MODULE_ALIAS("platform:pxa2xx-pcmcia"); | ||
diff --git a/drivers/power/power_supply.h b/drivers/power/power_supply.h index a9880d468ee4..f38ba482be75 100644 --- a/drivers/power/power_supply.h +++ b/drivers/power/power_supply.h | |||
| @@ -14,8 +14,7 @@ | |||
| 14 | 14 | ||
| 15 | extern int power_supply_create_attrs(struct power_supply *psy); | 15 | extern int power_supply_create_attrs(struct power_supply *psy); |
| 16 | extern void power_supply_remove_attrs(struct power_supply *psy); | 16 | extern void power_supply_remove_attrs(struct power_supply *psy); |
| 17 | extern int power_supply_uevent(struct device *dev, char **envp, int num_envp, | 17 | extern int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env); |
| 18 | char *buffer, int buffer_size); | ||
| 19 | 18 | ||
| 20 | #else | 19 | #else |
| 21 | 20 | ||
diff --git a/drivers/power/power_supply_sysfs.c b/drivers/power/power_supply_sysfs.c index de3155b21285..249f61bae639 100644 --- a/drivers/power/power_supply_sysfs.c +++ b/drivers/power/power_supply_sysfs.c | |||
| @@ -195,11 +195,10 @@ static char *kstruprdup(const char *str, gfp_t gfp) | |||
| 195 | return ret; | 195 | return ret; |
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | int power_supply_uevent(struct device *dev, char **envp, int num_envp, | 198 | int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 199 | char *buffer, int buffer_size) | ||
| 200 | { | 199 | { |
| 201 | struct power_supply *psy = dev_get_drvdata(dev); | 200 | struct power_supply *psy = dev_get_drvdata(dev); |
| 202 | int i = 0, length = 0, ret = 0, j; | 201 | int ret = 0, j; |
| 203 | char *prop_buf; | 202 | char *prop_buf; |
| 204 | char *attrname; | 203 | char *attrname; |
| 205 | 204 | ||
| @@ -212,8 +211,7 @@ int power_supply_uevent(struct device *dev, char **envp, int num_envp, | |||
| 212 | 211 | ||
| 213 | dev_dbg(dev, "POWER_SUPPLY_NAME=%s\n", psy->name); | 212 | dev_dbg(dev, "POWER_SUPPLY_NAME=%s\n", psy->name); |
| 214 | 213 | ||
| 215 | ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, | 214 | ret = add_uevent_var(env, "POWER_SUPPLY_NAME=%s", psy->name); |
| 216 | &length, "POWER_SUPPLY_NAME=%s", psy->name); | ||
| 217 | if (ret) | 215 | if (ret) |
| 218 | return ret; | 216 | return ret; |
| 219 | 217 | ||
| @@ -243,9 +241,7 @@ int power_supply_uevent(struct device *dev, char **envp, int num_envp, | |||
| 243 | 241 | ||
| 244 | dev_dbg(dev, "Static prop %s=%s\n", attrname, prop_buf); | 242 | dev_dbg(dev, "Static prop %s=%s\n", attrname, prop_buf); |
| 245 | 243 | ||
| 246 | ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, | 244 | ret = add_uevent_var(env, "POWER_SUPPLY_%s=%s", attrname, prop_buf); |
| 247 | &length, "POWER_SUPPLY_%s=%s", | ||
| 248 | attrname, prop_buf); | ||
| 249 | kfree(attrname); | 245 | kfree(attrname); |
| 250 | if (ret) | 246 | if (ret) |
| 251 | goto out; | 247 | goto out; |
| @@ -282,14 +278,11 @@ int power_supply_uevent(struct device *dev, char **envp, int num_envp, | |||
| 282 | 278 | ||
| 283 | dev_dbg(dev, "prop %s=%s\n", attrname, prop_buf); | 279 | dev_dbg(dev, "prop %s=%s\n", attrname, prop_buf); |
| 284 | 280 | ||
| 285 | ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, | 281 | ret = add_uevent_var(env, "POWER_SUPPLY_%s=%s", attrname, prop_buf); |
| 286 | &length, "POWER_SUPPLY_%s=%s", | ||
| 287 | attrname, prop_buf); | ||
| 288 | kfree(attrname); | 282 | kfree(attrname); |
| 289 | if (ret) | 283 | if (ret) |
| 290 | goto out; | 284 | goto out; |
| 291 | } | 285 | } |
| 292 | envp[i] = NULL; | ||
| 293 | 286 | ||
| 294 | out: | 287 | out: |
| 295 | free_page((unsigned long)prop_buf); | 288 | free_page((unsigned long)prop_buf); |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index 9c3b9ea1e66f..5baa517c3b66 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
| @@ -44,8 +44,7 @@ ccwgroup_bus_match (struct device * dev, struct device_driver * drv) | |||
| 44 | return 0; | 44 | return 0; |
| 45 | } | 45 | } |
| 46 | static int | 46 | static int |
| 47 | ccwgroup_uevent (struct device *dev, char **envp, int num_envp, char *buffer, | 47 | ccwgroup_uevent (struct device *dev, struct kobj_uevent_env *env) |
| 48 | int buffer_size) | ||
| 49 | { | 48 | { |
| 50 | /* TODO */ | 49 | /* TODO */ |
| 51 | return 0; | 50 | return 0; |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 39f02b48e4c7..7ee57f084a89 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
| @@ -79,49 +79,38 @@ static int snprint_alias(char *buf, size_t size, | |||
| 79 | 79 | ||
| 80 | /* Set up environment variables for ccw device uevent. Return 0 on success, | 80 | /* Set up environment variables for ccw device uevent. Return 0 on success, |
| 81 | * non-zero otherwise. */ | 81 | * non-zero otherwise. */ |
| 82 | static int ccw_uevent(struct device *dev, char **envp, int num_envp, | 82 | static int ccw_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 83 | char *buffer, int buffer_size) | ||
| 84 | { | 83 | { |
| 85 | struct ccw_device *cdev = to_ccwdev(dev); | 84 | struct ccw_device *cdev = to_ccwdev(dev); |
| 86 | struct ccw_device_id *id = &(cdev->id); | 85 | struct ccw_device_id *id = &(cdev->id); |
| 87 | int i = 0; | ||
| 88 | int len = 0; | ||
| 89 | int ret; | 86 | int ret; |
| 90 | char modalias_buf[30]; | 87 | char modalias_buf[30]; |
| 91 | 88 | ||
| 92 | /* CU_TYPE= */ | 89 | /* CU_TYPE= */ |
| 93 | ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, | 90 | ret = add_uevent_var(env, "CU_TYPE=%04X", id->cu_type); |
| 94 | "CU_TYPE=%04X", id->cu_type); | ||
| 95 | if (ret) | 91 | if (ret) |
| 96 | return ret; | 92 | return ret; |
| 97 | 93 | ||
| 98 | /* CU_MODEL= */ | 94 | /* CU_MODEL= */ |
| 99 | ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, | 95 | ret = add_uevent_var(env, "CU_MODEL=%02X", id->cu_model); |
| 100 | "CU_MODEL=%02X", id->cu_model); | ||
| 101 | if (ret) | 96 | if (ret) |
| 102 | return ret; | 97 | return ret; |
| 103 | 98 | ||
| 104 | /* The next two can be zero, that's ok for us */ | 99 | /* The next two can be zero, that's ok for us */ |
| 105 | /* DEV_TYPE= */ | 100 | /* DEV_TYPE= */ |
| 106 | ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, | 101 | ret = add_uevent_var(env, "DEV_TYPE=%04X", id->dev_type); |
| 107 | "DEV_TYPE=%04X", id->dev_type); | ||
| 108 | if (ret) | 102 | if (ret) |
| 109 | return ret; | 103 | return ret; |
| 110 | 104 | ||
| 111 | /* DEV_MODEL= */ | 105 | /* DEV_MODEL= */ |
| 112 | ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, | 106 | ret = add_uevent_var(env, "DEV_MODEL=%02X", id->dev_model); |
| 113 | "DEV_MODEL=%02X", id->dev_model); | ||
| 114 | if (ret) | 107 | if (ret) |
| 115 | return ret; | 108 | return ret; |
| 116 | 109 | ||
| 117 | /* MODALIAS= */ | 110 | /* MODALIAS= */ |
| 118 | snprint_alias(modalias_buf, sizeof(modalias_buf), id, ""); | 111 | snprint_alias(modalias_buf, sizeof(modalias_buf), id, ""); |
| 119 | ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, | 112 | ret = add_uevent_var(env, "MODALIAS=%s", modalias_buf); |
| 120 | "MODALIAS=%s", modalias_buf); | 113 | return ret; |
| 121 | if (ret) | ||
| 122 | return ret; | ||
| 123 | envp[i] = NULL; | ||
| 124 | return 0; | ||
| 125 | } | 114 | } |
| 126 | 115 | ||
| 127 | struct bus_type ccw_bus_type; | 116 | struct bus_type ccw_bus_type; |
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index d334b0f7a1ec..67aaff3e668d 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
| @@ -458,28 +458,22 @@ static int ap_bus_match(struct device *dev, struct device_driver *drv) | |||
| 458 | * uevent function for AP devices. It sets up a single environment | 458 | * uevent function for AP devices. It sets up a single environment |
| 459 | * variable DEV_TYPE which contains the hardware device type. | 459 | * variable DEV_TYPE which contains the hardware device type. |
| 460 | */ | 460 | */ |
| 461 | static int ap_uevent (struct device *dev, char **envp, int num_envp, | 461 | static int ap_uevent (struct device *dev, struct kobj_uevent_env *env) |
| 462 | char *buffer, int buffer_size) | ||
| 463 | { | 462 | { |
| 464 | struct ap_device *ap_dev = to_ap_dev(dev); | 463 | struct ap_device *ap_dev = to_ap_dev(dev); |
| 465 | int retval = 0, length = 0, i = 0; | 464 | int retval = 0; |
| 466 | 465 | ||
| 467 | if (!ap_dev) | 466 | if (!ap_dev) |
| 468 | return -ENODEV; | 467 | return -ENODEV; |
| 469 | 468 | ||
| 470 | /* Set up DEV_TYPE environment variable. */ | 469 | /* Set up DEV_TYPE environment variable. */ |
| 471 | retval = add_uevent_var(envp, num_envp, &i, | 470 | retval = add_uevent_var(env, "DEV_TYPE=%04X", ap_dev->device_type); |
| 472 | buffer, buffer_size, &length, | ||
| 473 | "DEV_TYPE=%04X", ap_dev->device_type); | ||
| 474 | if (retval) | 471 | if (retval) |
| 475 | return retval; | 472 | return retval; |
| 476 | 473 | ||
| 477 | /* Add MODALIAS= */ | 474 | /* Add MODALIAS= */ |
| 478 | retval = add_uevent_var(envp, num_envp, &i, | 475 | retval = add_uevent_var(env, "MODALIAS=ap:t%02X", ap_dev->device_type); |
| 479 | buffer, buffer_size, &length, | ||
| 480 | "MODALIAS=ap:t%02X", ap_dev->device_type); | ||
| 481 | 476 | ||
| 482 | envp[i] = NULL; | ||
| 483 | return retval; | 477 | return retval; |
| 484 | } | 478 | } |
| 485 | 479 | ||
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 34cdce6738a6..ede9986d349a 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
| @@ -277,16 +277,11 @@ static int scsi_bus_match(struct device *dev, struct device_driver *gendrv) | |||
| 277 | return (sdp->inq_periph_qual == SCSI_INQ_PQ_CON)? 1: 0; | 277 | return (sdp->inq_periph_qual == SCSI_INQ_PQ_CON)? 1: 0; |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | static int scsi_bus_uevent(struct device *dev, char **envp, int num_envp, | 280 | static int scsi_bus_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 281 | char *buffer, int buffer_size) | ||
| 282 | { | 281 | { |
| 283 | struct scsi_device *sdev = to_scsi_device(dev); | 282 | struct scsi_device *sdev = to_scsi_device(dev); |
| 284 | int i = 0; | ||
| 285 | int length = 0; | ||
| 286 | 283 | ||
| 287 | add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length, | 284 | add_uevent_var(env, "MODALIAS=" SCSI_DEVICE_MODALIAS_FMT, sdev->type); |
| 288 | "MODALIAS=" SCSI_DEVICE_MODALIAS_FMT, sdev->type); | ||
| 289 | envp[i] = NULL; | ||
| 290 | return 0; | 285 | return 0; |
| 291 | } | 286 | } |
| 292 | 287 | ||
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index e84d21597943..bcb8dd5fb0b4 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
| @@ -67,14 +67,11 @@ static int spi_match_device(struct device *dev, struct device_driver *drv) | |||
| 67 | return strncmp(spi->modalias, drv->name, BUS_ID_SIZE) == 0; | 67 | return strncmp(spi->modalias, drv->name, BUS_ID_SIZE) == 0; |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | static int spi_uevent(struct device *dev, char **envp, int num_envp, | 70 | static int spi_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 71 | char *buffer, int buffer_size) | ||
| 72 | { | 71 | { |
| 73 | const struct spi_device *spi = to_spi_device(dev); | 72 | const struct spi_device *spi = to_spi_device(dev); |
| 74 | 73 | ||
| 75 | envp[0] = buffer; | 74 | add_uevent_var(env, "MODALIAS=%s", spi->modalias); |
| 76 | snprintf(buffer, buffer_size, "MODALIAS=%s", spi->modalias); | ||
| 77 | envp[1] = NULL; | ||
| 78 | return 0; | 75 | return 0; |
| 79 | } | 76 | } |
| 80 | 77 | ||
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index e5ad76b4a738..f013b4012c9a 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
| @@ -1591,6 +1591,7 @@ static unsigned int usbdev_poll(struct file *file, struct poll_table_struct *wai | |||
| 1591 | } | 1591 | } |
| 1592 | 1592 | ||
| 1593 | const struct file_operations usbdev_file_operations = { | 1593 | const struct file_operations usbdev_file_operations = { |
| 1594 | .owner = THIS_MODULE, | ||
| 1594 | .llseek = usbdev_lseek, | 1595 | .llseek = usbdev_lseek, |
| 1595 | .read = usbdev_read, | 1596 | .read = usbdev_read, |
| 1596 | .poll = usbdev_poll, | 1597 | .poll = usbdev_poll, |
| @@ -1640,10 +1641,7 @@ static struct notifier_block usbdev_nb = { | |||
| 1640 | }; | 1641 | }; |
| 1641 | #endif | 1642 | #endif |
| 1642 | 1643 | ||
| 1643 | static struct cdev usb_device_cdev = { | 1644 | static struct cdev usb_device_cdev; |
| 1644 | .kobj = {.name = "usb_device", }, | ||
| 1645 | .owner = THIS_MODULE, | ||
| 1646 | }; | ||
| 1647 | 1645 | ||
| 1648 | int __init usb_devio_init(void) | 1646 | int __init usb_devio_init(void) |
| 1649 | { | 1647 | { |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index c27bc080d84e..8586817698ad 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
| @@ -581,12 +581,9 @@ static int usb_device_match(struct device *dev, struct device_driver *drv) | |||
| 581 | } | 581 | } |
| 582 | 582 | ||
| 583 | #ifdef CONFIG_HOTPLUG | 583 | #ifdef CONFIG_HOTPLUG |
| 584 | static int usb_uevent(struct device *dev, char **envp, int num_envp, | 584 | static int usb_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 585 | char *buffer, int buffer_size) | ||
| 586 | { | 585 | { |
| 587 | struct usb_device *usb_dev; | 586 | struct usb_device *usb_dev; |
| 588 | int i = 0; | ||
| 589 | int length = 0; | ||
| 590 | 587 | ||
| 591 | if (!dev) | 588 | if (!dev) |
| 592 | return -ENODEV; | 589 | return -ENODEV; |
| @@ -615,51 +612,39 @@ static int usb_uevent(struct device *dev, char **envp, int num_envp, | |||
| 615 | * all the device descriptors we don't tell them about. Or | 612 | * all the device descriptors we don't tell them about. Or |
| 616 | * act as usermode drivers. | 613 | * act as usermode drivers. |
| 617 | */ | 614 | */ |
| 618 | if (add_uevent_var(envp, num_envp, &i, | 615 | if (add_uevent_var(env, "DEVICE=/proc/bus/usb/%03d/%03d", |
| 619 | buffer, buffer_size, &length, | ||
| 620 | "DEVICE=/proc/bus/usb/%03d/%03d", | ||
| 621 | usb_dev->bus->busnum, usb_dev->devnum)) | 616 | usb_dev->bus->busnum, usb_dev->devnum)) |
| 622 | return -ENOMEM; | 617 | return -ENOMEM; |
| 623 | #endif | 618 | #endif |
| 624 | 619 | ||
| 625 | /* per-device configurations are common */ | 620 | /* per-device configurations are common */ |
| 626 | if (add_uevent_var(envp, num_envp, &i, | 621 | if (add_uevent_var(env, "PRODUCT=%x/%x/%x", |
| 627 | buffer, buffer_size, &length, | ||
| 628 | "PRODUCT=%x/%x/%x", | ||
| 629 | le16_to_cpu(usb_dev->descriptor.idVendor), | 622 | le16_to_cpu(usb_dev->descriptor.idVendor), |
| 630 | le16_to_cpu(usb_dev->descriptor.idProduct), | 623 | le16_to_cpu(usb_dev->descriptor.idProduct), |
| 631 | le16_to_cpu(usb_dev->descriptor.bcdDevice))) | 624 | le16_to_cpu(usb_dev->descriptor.bcdDevice))) |
| 632 | return -ENOMEM; | 625 | return -ENOMEM; |
| 633 | 626 | ||
| 634 | /* class-based driver binding models */ | 627 | /* class-based driver binding models */ |
| 635 | if (add_uevent_var(envp, num_envp, &i, | 628 | if (add_uevent_var(env, "TYPE=%d/%d/%d", |
| 636 | buffer, buffer_size, &length, | ||
| 637 | "TYPE=%d/%d/%d", | ||
| 638 | usb_dev->descriptor.bDeviceClass, | 629 | usb_dev->descriptor.bDeviceClass, |
| 639 | usb_dev->descriptor.bDeviceSubClass, | 630 | usb_dev->descriptor.bDeviceSubClass, |
| 640 | usb_dev->descriptor.bDeviceProtocol)) | 631 | usb_dev->descriptor.bDeviceProtocol)) |
| 641 | return -ENOMEM; | 632 | return -ENOMEM; |
| 642 | 633 | ||
| 643 | if (add_uevent_var(envp, num_envp, &i, | 634 | if (add_uevent_var(env, "BUSNUM=%03d", |
| 644 | buffer, buffer_size, &length, | ||
| 645 | "BUSNUM=%03d", | ||
| 646 | usb_dev->bus->busnum)) | 635 | usb_dev->bus->busnum)) |
| 647 | return -ENOMEM; | 636 | return -ENOMEM; |
| 648 | 637 | ||
| 649 | if (add_uevent_var(envp, num_envp, &i, | 638 | if (add_uevent_var(env, "DEVNUM=%03d", |
| 650 | buffer, buffer_size, &length, | ||
| 651 | "DEVNUM=%03d", | ||
| 652 | usb_dev->devnum)) | 639 | usb_dev->devnum)) |
| 653 | return -ENOMEM; | 640 | return -ENOMEM; |
| 654 | 641 | ||
| 655 | envp[i] = NULL; | ||
| 656 | return 0; | 642 | return 0; |
| 657 | } | 643 | } |
| 658 | 644 | ||
| 659 | #else | 645 | #else |
| 660 | 646 | ||
| 661 | static int usb_uevent(struct device *dev, char **envp, | 647 | static int usb_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 662 | int num_envp, char *buffer, int buffer_size) | ||
| 663 | { | 648 | { |
| 664 | return -ENODEV; | 649 | return -ENODEV; |
| 665 | } | 650 | } |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 98fcddba6908..c021af390372 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
| @@ -1344,14 +1344,11 @@ static void usb_release_interface(struct device *dev) | |||
| 1344 | } | 1344 | } |
| 1345 | 1345 | ||
| 1346 | #ifdef CONFIG_HOTPLUG | 1346 | #ifdef CONFIG_HOTPLUG |
| 1347 | static int usb_if_uevent(struct device *dev, char **envp, int num_envp, | 1347 | static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 1348 | char *buffer, int buffer_size) | ||
| 1349 | { | 1348 | { |
| 1350 | struct usb_device *usb_dev; | 1349 | struct usb_device *usb_dev; |
| 1351 | struct usb_interface *intf; | 1350 | struct usb_interface *intf; |
| 1352 | struct usb_host_interface *alt; | 1351 | struct usb_host_interface *alt; |
| 1353 | int i = 0; | ||
| 1354 | int length = 0; | ||
| 1355 | 1352 | ||
| 1356 | if (!dev) | 1353 | if (!dev) |
| 1357 | return -ENODEV; | 1354 | return -ENODEV; |
| @@ -1364,39 +1361,30 @@ static int usb_if_uevent(struct device *dev, char **envp, int num_envp, | |||
| 1364 | alt = intf->cur_altsetting; | 1361 | alt = intf->cur_altsetting; |
| 1365 | 1362 | ||
| 1366 | #ifdef CONFIG_USB_DEVICEFS | 1363 | #ifdef CONFIG_USB_DEVICEFS |
| 1367 | if (add_uevent_var(envp, num_envp, &i, | 1364 | if (add_uevent_var(env, "DEVICE=/proc/bus/usb/%03d/%03d", |
| 1368 | buffer, buffer_size, &length, | ||
| 1369 | "DEVICE=/proc/bus/usb/%03d/%03d", | ||
| 1370 | usb_dev->bus->busnum, usb_dev->devnum)) | 1365 | usb_dev->bus->busnum, usb_dev->devnum)) |
| 1371 | return -ENOMEM; | 1366 | return -ENOMEM; |
| 1372 | #endif | 1367 | #endif |
| 1373 | 1368 | ||
| 1374 | if (add_uevent_var(envp, num_envp, &i, | 1369 | if (add_uevent_var(env, "PRODUCT=%x/%x/%x", |
| 1375 | buffer, buffer_size, &length, | ||
| 1376 | "PRODUCT=%x/%x/%x", | ||
| 1377 | le16_to_cpu(usb_dev->descriptor.idVendor), | 1370 | le16_to_cpu(usb_dev->descriptor.idVendor), |
| 1378 | le16_to_cpu(usb_dev->descriptor.idProduct), | 1371 | le16_to_cpu(usb_dev->descriptor.idProduct), |
| 1379 | le16_to_cpu(usb_dev->descriptor.bcdDevice))) | 1372 | le16_to_cpu(usb_dev->descriptor.bcdDevice))) |
| 1380 | return -ENOMEM; | 1373 | return -ENOMEM; |
| 1381 | 1374 | ||
| 1382 | if (add_uevent_var(envp, num_envp, &i, | 1375 | if (add_uevent_var(env, "TYPE=%d/%d/%d", |
| 1383 | buffer, buffer_size, &length, | ||
| 1384 | "TYPE=%d/%d/%d", | ||
| 1385 | usb_dev->descriptor.bDeviceClass, | 1376 | usb_dev->descriptor.bDeviceClass, |
| 1386 | usb_dev->descriptor.bDeviceSubClass, | 1377 | usb_dev->descriptor.bDeviceSubClass, |
| 1387 | usb_dev->descriptor.bDeviceProtocol)) | 1378 | usb_dev->descriptor.bDeviceProtocol)) |
| 1388 | return -ENOMEM; | 1379 | return -ENOMEM; |
| 1389 | 1380 | ||
| 1390 | if (add_uevent_var(envp, num_envp, &i, | 1381 | if (add_uevent_var(env, "INTERFACE=%d/%d/%d", |
| 1391 | buffer, buffer_size, &length, | ||
| 1392 | "INTERFACE=%d/%d/%d", | ||
| 1393 | alt->desc.bInterfaceClass, | 1382 | alt->desc.bInterfaceClass, |
| 1394 | alt->desc.bInterfaceSubClass, | 1383 | alt->desc.bInterfaceSubClass, |
| 1395 | alt->desc.bInterfaceProtocol)) | 1384 | alt->desc.bInterfaceProtocol)) |
| 1396 | return -ENOMEM; | 1385 | return -ENOMEM; |
| 1397 | 1386 | ||
| 1398 | if (add_uevent_var(envp, num_envp, &i, | 1387 | if (add_uevent_var(env, |
| 1399 | buffer, buffer_size, &length, | ||
| 1400 | "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X", | 1388 | "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X", |
| 1401 | le16_to_cpu(usb_dev->descriptor.idVendor), | 1389 | le16_to_cpu(usb_dev->descriptor.idVendor), |
| 1402 | le16_to_cpu(usb_dev->descriptor.idProduct), | 1390 | le16_to_cpu(usb_dev->descriptor.idProduct), |
| @@ -1409,14 +1397,12 @@ static int usb_if_uevent(struct device *dev, char **envp, int num_envp, | |||
| 1409 | alt->desc.bInterfaceProtocol)) | 1397 | alt->desc.bInterfaceProtocol)) |
| 1410 | return -ENOMEM; | 1398 | return -ENOMEM; |
| 1411 | 1399 | ||
| 1412 | envp[i] = NULL; | ||
| 1413 | return 0; | 1400 | return 0; |
| 1414 | } | 1401 | } |
| 1415 | 1402 | ||
| 1416 | #else | 1403 | #else |
| 1417 | 1404 | ||
| 1418 | static int usb_if_uevent(struct device *dev, char **envp, | 1405 | static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 1419 | int num_envp, char *buffer, int buffer_size) | ||
| 1420 | { | 1406 | { |
| 1421 | return -ENODEV; | 1407 | return -ENODEV; |
| 1422 | } | 1408 | } |
diff --git a/drivers/video/output.c b/drivers/video/output.c index 1473f2c892d2..f2df5519c9c4 100644 --- a/drivers/video/output.c +++ b/drivers/video/output.c | |||
| @@ -31,7 +31,8 @@ MODULE_DESCRIPTION("Display Output Switcher Lowlevel Control Abstraction"); | |||
| 31 | MODULE_LICENSE("GPL"); | 31 | MODULE_LICENSE("GPL"); |
| 32 | MODULE_AUTHOR("Luming Yu <luming.yu@intel.com>"); | 32 | MODULE_AUTHOR("Luming Yu <luming.yu@intel.com>"); |
| 33 | 33 | ||
| 34 | static ssize_t video_output_show_state(struct class_device *dev,char *buf) | 34 | static ssize_t video_output_show_state(struct device *dev, |
| 35 | struct device_attribute *attr, char *buf) | ||
| 35 | { | 36 | { |
| 36 | ssize_t ret_size = 0; | 37 | ssize_t ret_size = 0; |
| 37 | struct output_device *od = to_output_device(dev); | 38 | struct output_device *od = to_output_device(dev); |
| @@ -40,8 +41,9 @@ static ssize_t video_output_show_state(struct class_device *dev,char *buf) | |||
| 40 | return ret_size; | 41 | return ret_size; |
| 41 | } | 42 | } |
| 42 | 43 | ||
| 43 | static ssize_t video_output_store_state(struct class_device *dev, | 44 | static ssize_t video_output_store_state(struct device *dev, |
| 44 | const char *buf,size_t count) | 45 | struct device_attribute *attr, |
| 46 | const char *buf,size_t count) | ||
| 45 | { | 47 | { |
| 46 | char *endp; | 48 | char *endp; |
| 47 | struct output_device *od = to_output_device(dev); | 49 | struct output_device *od = to_output_device(dev); |
| @@ -60,21 +62,22 @@ static ssize_t video_output_store_state(struct class_device *dev, | |||
| 60 | return count; | 62 | return count; |
| 61 | } | 63 | } |
| 62 | 64 | ||
| 63 | static void video_output_class_release(struct class_device *dev) | 65 | static void video_output_release(struct device *dev) |
| 64 | { | 66 | { |
| 65 | struct output_device *od = to_output_device(dev); | 67 | struct output_device *od = to_output_device(dev); |
| 66 | kfree(od); | 68 | kfree(od); |
| 67 | } | 69 | } |
| 68 | 70 | ||
| 69 | static struct class_device_attribute video_output_attributes[] = { | 71 | static struct device_attribute video_output_attributes[] = { |
| 70 | __ATTR(state, 0644, video_output_show_state, video_output_store_state), | 72 | __ATTR(state, 0644, video_output_show_state, video_output_store_state), |
| 71 | __ATTR_NULL, | 73 | __ATTR_NULL, |
| 72 | }; | 74 | }; |
| 73 | 75 | ||
| 76 | |||
| 74 | static struct class video_output_class = { | 77 | static struct class video_output_class = { |
| 75 | .name = "video_output", | 78 | .name = "video_output", |
| 76 | .release = video_output_class_release, | 79 | .dev_release = video_output_release, |
| 77 | .class_dev_attrs = video_output_attributes, | 80 | .dev_attrs = video_output_attributes, |
| 78 | }; | 81 | }; |
| 79 | 82 | ||
| 80 | struct output_device *video_output_register(const char *name, | 83 | struct output_device *video_output_register(const char *name, |
| @@ -91,11 +94,11 @@ struct output_device *video_output_register(const char *name, | |||
| 91 | goto error_return; | 94 | goto error_return; |
| 92 | } | 95 | } |
| 93 | new_dev->props = op; | 96 | new_dev->props = op; |
| 94 | new_dev->class_dev.class = &video_output_class; | 97 | new_dev->dev.class = &video_output_class; |
| 95 | new_dev->class_dev.dev = dev; | 98 | new_dev->dev.parent = dev; |
| 96 | strlcpy(new_dev->class_dev.class_id,name,KOBJ_NAME_LEN); | 99 | strlcpy(new_dev->dev.bus_id,name, BUS_ID_SIZE); |
| 97 | class_set_devdata(&new_dev->class_dev,devdata); | 100 | dev_set_drvdata(&new_dev->dev, devdata); |
| 98 | ret_code = class_device_register(&new_dev->class_dev); | 101 | ret_code = device_register(&new_dev->dev); |
| 99 | if (ret_code) { | 102 | if (ret_code) { |
| 100 | kfree(new_dev); | 103 | kfree(new_dev); |
| 101 | goto error_return; | 104 | goto error_return; |
| @@ -111,7 +114,7 @@ void video_output_unregister(struct output_device *dev) | |||
| 111 | { | 114 | { |
| 112 | if (!dev) | 115 | if (!dev) |
| 113 | return; | 116 | return; |
| 114 | class_device_unregister(&dev->class_dev); | 117 | device_unregister(&dev->dev); |
| 115 | } | 118 | } |
| 116 | EXPORT_SYMBOL(video_output_unregister); | 119 | EXPORT_SYMBOL(video_output_unregister); |
| 117 | 120 | ||
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index a593f900eff4..070217322c9f 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c | |||
| @@ -197,7 +197,7 @@ static struct w1_family w1_default_family = { | |||
| 197 | .fops = &w1_default_fops, | 197 | .fops = &w1_default_fops, |
| 198 | }; | 198 | }; |
| 199 | 199 | ||
| 200 | static int w1_uevent(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size); | 200 | static int w1_uevent(struct device *dev, struct kobj_uevent_env *env); |
| 201 | 201 | ||
| 202 | static struct bus_type w1_bus_type = { | 202 | static struct bus_type w1_bus_type = { |
| 203 | .name = "w1", | 203 | .name = "w1", |
| @@ -396,13 +396,12 @@ static void w1_destroy_master_attributes(struct w1_master *master) | |||
| 396 | } | 396 | } |
| 397 | 397 | ||
| 398 | #ifdef CONFIG_HOTPLUG | 398 | #ifdef CONFIG_HOTPLUG |
| 399 | static int w1_uevent(struct device *dev, char **envp, int num_envp, | 399 | static int w1_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 400 | char *buffer, int buffer_size) | ||
| 401 | { | 400 | { |
| 402 | struct w1_master *md = NULL; | 401 | struct w1_master *md = NULL; |
| 403 | struct w1_slave *sl = NULL; | 402 | struct w1_slave *sl = NULL; |
| 404 | char *event_owner, *name; | 403 | char *event_owner, *name; |
| 405 | int err, cur_index=0, cur_len=0; | 404 | int err; |
| 406 | 405 | ||
| 407 | if (dev->driver == &w1_master_driver) { | 406 | if (dev->driver == &w1_master_driver) { |
| 408 | md = container_of(dev, struct w1_master, dev); | 407 | md = container_of(dev, struct w1_master, dev); |
| @@ -423,23 +422,19 @@ static int w1_uevent(struct device *dev, char **envp, int num_envp, | |||
| 423 | if (dev->driver != &w1_slave_driver || !sl) | 422 | if (dev->driver != &w1_slave_driver || !sl) |
| 424 | return 0; | 423 | return 0; |
| 425 | 424 | ||
| 426 | err = add_uevent_var(envp, num_envp, &cur_index, buffer, buffer_size, | 425 | err = add_uevent_var(env, "W1_FID=%02X", sl->reg_num.family); |
| 427 | &cur_len, "W1_FID=%02X", sl->reg_num.family); | ||
| 428 | if (err) | 426 | if (err) |
| 429 | return err; | 427 | return err; |
| 430 | 428 | ||
| 431 | err = add_uevent_var(envp, num_envp, &cur_index, buffer, buffer_size, | 429 | err = add_uevent_var(env, "W1_SLAVE_ID=%024LX", |
| 432 | &cur_len, "W1_SLAVE_ID=%024LX", | 430 | (unsigned long long)sl->reg_num.id); |
| 433 | (unsigned long long)sl->reg_num.id); | ||
| 434 | envp[cur_index] = NULL; | ||
| 435 | if (err) | 431 | if (err) |
| 436 | return err; | 432 | return err; |
| 437 | 433 | ||
| 438 | return 0; | 434 | return 0; |
| 439 | }; | 435 | }; |
| 440 | #else | 436 | #else |
| 441 | static int w1_uevent(struct device *dev, char **envp, int num_envp, | 437 | static int w1_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 442 | char *buffer, int buffer_size) | ||
| 443 | { | 438 | { |
| 444 | return 0; | 439 | return 0; |
| 445 | } | 440 | } |
