Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b405a0f authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman
Browse files

[PATCH] Driver Core: remove driver model detach_state



The driver model has a "detach_state" mechanism that:

 - Has never been used by any in-kernel drive;
 - Is superfluous, since driver remove() methods can do the same thing;
 - Became buggy when the suspend() parameter changed semantics and type;
 - Could self-deadlock when called from certain suspend contexts;
 - Is effectively wasted documentation, object code, and headspace.

This removes that "detach_state" mechanism; net code shrink, as well
as a per-device saving in the driver model and sysfs.

Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 82428b62
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -7,7 +7,6 @@ that support it. For example, a given bus might look like this:
     |-- 0000:17:00.0
     |   |-- class
     |   |-- config
     |   |-- detach_state
     |   |-- device
     |   |-- irq
     |   |-- local_cpus
@@ -19,7 +18,7 @@ that support it. For example, a given bus might look like this:
     |   |-- subsystem_device
     |   |-- subsystem_vendor
     |   `-- vendor
     `-- detach_state
     `-- ...

The topmost element describes the PCI domain and bus number.  In this case,
the domain number is 0000 and the bus number is 17 (both values are in hex).
@@ -31,7 +30,6 @@ files, each with their own function.
       ----		   --------
       class		   PCI class (ascii, ro)
       config		   PCI config space (binary, rw)
       detach_state	   connection status (bool, rw)
       device		   PCI device (ascii, ro)
       irq		   IRQ number (ascii, ro)
       local_cpus	   nearby CPU mask (cpumask, ro)
+0 −21
Original line number Diff line number Diff line
@@ -207,27 +207,6 @@ SYSTEM_SHUTDOWN, I do not understand this one too much. probably event
#READY_AFTER_RESUME
#

Driver Detach Power Management

The kernel now supports the ability to place a device in a low-power
state when it is detached from its driver, which happens when its
module is removed. 

Each device contains a 'detach_state' file in its sysfs directory
which can be used to control this state. Reading from this file
displays what the current detach state is set to. This is 0 (On) by
default. A user may write a positive integer value to this file in the
range of 1-4 inclusive. 

A value of 1-3 will indicate the device should be placed in that
low-power state, which will cause ->suspend() to be called for that
device. A value of 4 indicates that the device should be shutdown, so
->shutdown() will be called for that device. 

The driver is responsible for reinitializing the device when the
module is re-inserted during it's ->probe() (or equivalent) method. 
The driver core will not call any extra functions when binding the
device to the driver. 

pm_message_t meaning

+2 −2
Original line number Diff line number Diff line
@@ -348,7 +348,7 @@ looks like the following:

	Pow5:/sys/bus/vio/drivers/hvcs/30000004 # ls
	.   current_vty   devspec       name          partner_vtys
	..  detach_state  index    partner_clcs  vterm_state
	..  index         partner_clcs  vterm_state

Each entry is provided, by default with a "name" attribute.  Reading the
"name" attribute will reveal the device type as shown in the following
+1 −1
Original line number Diff line number Diff line
# Makefile for the Linux device tree

obj-y			:= core.o sys.o interface.o bus.o \
obj-y			:= core.o sys.o bus.o \
			   driver.o class.o class_simple.o platform.o \
			   cpu.o firmware.o init.o map.o dmapool.o \
			   attribute_container.o transport_class.o
+0 −1
Original line number Diff line number Diff line
@@ -390,7 +390,6 @@ void device_release_driver(struct device * dev)
		sysfs_remove_link(&drv->kobj, kobject_name(&dev->kobj));
		sysfs_remove_link(&dev->kobj, "driver");
		list_del_init(&dev->driver_list);
		device_detach_shutdown(dev);
		if (drv->remove)
			drv->remove(dev);
		dev->driver = NULL;
Loading