Automatic merge of rsync://rsync.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6.git/

+36 -121
+1 -3
Documentation/filesystems/sysfs-pci.txt
··· 7 |-- 0000:17:00.0 8 | |-- class 9 | |-- config 10 - | |-- detach_state 11 | |-- device 12 | |-- irq 13 | |-- local_cpus ··· 18 | |-- subsystem_device 19 | |-- subsystem_vendor 20 | `-- vendor 21 - `-- detach_state 22 23 The topmost element describes the PCI domain and bus number. In this case, 24 the domain number is 0000 and the bus number is 17 (both values are in hex). ··· 30 ---- -------- 31 class PCI class (ascii, ro) 32 config PCI config space (binary, rw) 33 - detach_state connection status (bool, rw) 34 device PCI device (ascii, ro) 35 irq IRQ number (ascii, ro) 36 local_cpus nearby CPU mask (cpumask, ro)
··· 7 |-- 0000:17:00.0 8 | |-- class 9 | |-- config 10 | |-- device 11 | |-- irq 12 | |-- local_cpus ··· 19 | |-- subsystem_device 20 | |-- subsystem_vendor 21 | `-- vendor 22 + `-- ... 23 24 The topmost element describes the PCI domain and bus number. In this case, 25 the domain number is 0000 and the bus number is 17 (both values are in hex). ··· 31 ---- -------- 32 class PCI class (ascii, ro) 33 config PCI config space (binary, rw) 34 device PCI device (ascii, ro) 35 irq IRQ number (ascii, ro) 36 local_cpus nearby CPU mask (cpumask, ro)
-21
Documentation/power/devices.txt
··· 207 #READY_AFTER_RESUME 208 # 209 210 - Driver Detach Power Management 211 - 212 - The kernel now supports the ability to place a device in a low-power 213 - state when it is detached from its driver, which happens when its 214 - module is removed. 215 - 216 - Each device contains a 'detach_state' file in its sysfs directory 217 - which can be used to control this state. Reading from this file 218 - displays what the current detach state is set to. This is 0 (On) by 219 - default. A user may write a positive integer value to this file in the 220 - range of 1-4 inclusive. 221 - 222 - A value of 1-3 will indicate the device should be placed in that 223 - low-power state, which will cause ->suspend() to be called for that 224 - device. A value of 4 indicates that the device should be shutdown, so 225 - ->shutdown() will be called for that device. 226 - 227 - The driver is responsible for reinitializing the device when the 228 - module is re-inserted during it's ->probe() (or equivalent) method. 229 - The driver core will not call any extra functions when binding the 230 - device to the driver. 231 232 pm_message_t meaning 233
··· 207 #READY_AFTER_RESUME 208 # 209 210 211 pm_message_t meaning 212
+2 -2
Documentation/powerpc/hvcs.txt
··· 347 looks like the following: 348 349 Pow5:/sys/bus/vio/drivers/hvcs/30000004 # ls 350 - . current_vty devspec name partner_vtys 351 - .. detach_state index partner_clcs vterm_state 352 353 Each entry is provided, by default with a "name" attribute. Reading the 354 "name" attribute will reveal the device type as shown in the following
··· 347 looks like the following: 348 349 Pow5:/sys/bus/vio/drivers/hvcs/30000004 # ls 350 + . current_vty devspec name partner_vtys 351 + .. index partner_clcs vterm_state 352 353 Each entry is provided, by default with a "name" attribute. Reading the 354 "name" attribute will reveal the device type as shown in the following
+1 -1
drivers/base/Makefile
··· 1 # Makefile for the Linux device tree 2 3 - obj-y := core.o sys.o interface.o bus.o \ 4 driver.o class.o class_simple.o platform.o \ 5 cpu.o firmware.o init.o map.o dmapool.o \ 6 attribute_container.o transport_class.o
··· 1 # Makefile for the Linux device tree 2 3 + obj-y := core.o sys.o bus.o \ 4 driver.o class.o class_simple.o platform.o \ 5 cpu.o firmware.o init.o map.o dmapool.o \ 6 attribute_container.o transport_class.o
-1
drivers/base/bus.c
··· 390 sysfs_remove_link(&drv->kobj, kobject_name(&dev->kobj)); 391 sysfs_remove_link(&dev->kobj, "driver"); 392 list_del_init(&dev->driver_list); 393 - device_detach_shutdown(dev); 394 if (drv->remove) 395 drv->remove(dev); 396 dev->driver = NULL;
··· 390 sysfs_remove_link(&drv->kobj, kobject_name(&dev->kobj)); 391 sysfs_remove_link(&dev->kobj, "driver"); 392 list_del_init(&dev->driver_list); 393 if (drv->remove) 394 drv->remove(dev); 395 dev->driver = NULL;
-3
drivers/base/core.c
··· 31 #define to_dev(obj) container_of(obj, struct device, kobj) 32 #define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr) 33 34 - extern struct attribute * dev_default_attrs[]; 35 - 36 static ssize_t 37 dev_attr_show(struct kobject * kobj, struct attribute * attr, char * buf) 38 { ··· 87 static struct kobj_type ktype_device = { 88 .release = device_release, 89 .sysfs_ops = &dev_sysfs_ops, 90 - .default_attrs = dev_default_attrs, 91 }; 92 93
··· 31 #define to_dev(obj) container_of(obj, struct device, kobj) 32 #define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr) 33 34 static ssize_t 35 dev_attr_show(struct kobject * kobj, struct attribute * attr, char * buf) 36 { ··· 89 static struct kobj_type ktype_device = { 90 .release = device_release, 91 .sysfs_ops = &dev_sysfs_ops, 92 }; 93 94
-51
drivers/base/interface.c
··· 1 - /* 2 - * drivers/base/interface.c - common driverfs interface that's exported to 3 - * the world for all devices. 4 - * 5 - * Copyright (c) 2002-3 Patrick Mochel 6 - * Copyright (c) 2002-3 Open Source Development Labs 7 - * 8 - * This file is released under the GPLv2 9 - * 10 - */ 11 - 12 - #include <linux/device.h> 13 - #include <linux/err.h> 14 - #include <linux/stat.h> 15 - #include <linux/string.h> 16 - 17 - /** 18 - * detach_state - control the default power state for the device. 19 - * 20 - * This is the state the device enters when it's driver module is 21 - * unloaded. The value is an unsigned integer, in the range of 0-4. 22 - * '0' indicates 'On', so no action will be taken when the driver is 23 - * unloaded. This is the default behavior. 24 - * '4' indicates 'Off', meaning the driver core will call the driver's 25 - * shutdown method to quiesce the device. 26 - * 1-3 indicate a low-power state for the device to enter via the 27 - * driver's suspend method. 28 - */ 29 - 30 - static ssize_t detach_show(struct device * dev, char * buf) 31 - { 32 - return sprintf(buf, "%u\n", dev->detach_state); 33 - } 34 - 35 - static ssize_t detach_store(struct device * dev, const char * buf, size_t n) 36 - { 37 - u32 state; 38 - state = simple_strtoul(buf, NULL, 10); 39 - if (state > 4) 40 - return -EINVAL; 41 - dev->detach_state = state; 42 - return n; 43 - } 44 - 45 - static DEVICE_ATTR(detach_state, 0644, detach_show, detach_store); 46 - 47 - 48 - struct attribute * dev_default_attrs[] = { 49 - &dev_attr_detach_state.attr, 50 - NULL, 51 - };
···
-11
drivers/base/power/power.h
··· 1 - 2 - 3 - enum { 4 - DEVICE_PM_ON, 5 - DEVICE_PM1, 6 - DEVICE_PM2, 7 - DEVICE_PM3, 8 - DEVICE_PM_OFF, 9 - }; 10 - 11 /* 12 * shutdown.c 13 */ 14 15 - extern int device_detach_shutdown(struct device *); 16 extern void device_shutdown(void); 17 18
··· 1 /* 2 * shutdown.c 3 */ 4 5 extern void device_shutdown(void); 6 7
+10 -1
drivers/base/power/resume.c
··· 22 23 int resume_device(struct device * dev) 24 { 25 - if (dev->bus && dev->bus->resume) 26 return dev->bus->resume(dev); 27 return 0; 28 } 29
··· 22 23 int resume_device(struct device * dev) 24 { 25 + if (dev->power.pm_parent 26 + && dev->power.pm_parent->power.power_state) { 27 + dev_err(dev, "PM: resume from %d, parent %s still %d\n", 28 + dev->power.power_state, 29 + dev->power.pm_parent->bus_id, 30 + dev->power.pm_parent->power.power_state); 31 + } 32 + if (dev->bus && dev->bus->resume) { 33 + dev_dbg(dev,"resuming\n"); 34 return dev->bus->resume(dev); 35 + } 36 return 0; 37 } 38
+4 -19
drivers/base/power/shutdown.c
··· 19 extern struct subsystem devices_subsys; 20 21 22 - int device_detach_shutdown(struct device * dev) 23 - { 24 - if (!dev->detach_state) 25 - return 0; 26 - 27 - if (dev->detach_state == DEVICE_PM_OFF) { 28 - if (dev->driver && dev->driver->shutdown) 29 - dev->driver->shutdown(dev); 30 - return 0; 31 - } 32 - return dpm_runtime_suspend(dev, dev->detach_state); 33 - } 34 - 35 - 36 /** 37 * We handle system devices differently - we suspend and shut them 38 * down last and resume them first. That way, we don't do anything stupid like ··· 38 struct device * dev; 39 40 down_write(&devices_subsys.rwsem); 41 - list_for_each_entry_reverse(dev, &devices_subsys.kset.list, kobj.entry) { 42 - pr_debug("shutting down %s: ", dev->bus_id); 43 if (dev->driver && dev->driver->shutdown) { 44 - pr_debug("Ok\n"); 45 dev->driver->shutdown(dev); 46 - } else 47 - pr_debug("Ignored.\n"); 48 } 49 up_write(&devices_subsys.rwsem); 50
··· 19 extern struct subsystem devices_subsys; 20 21 22 /** 23 * We handle system devices differently - we suspend and shut them 24 * down last and resume them first. That way, we don't do anything stupid like ··· 52 struct device * dev; 53 54 down_write(&devices_subsys.rwsem); 55 + list_for_each_entry_reverse(dev, &devices_subsys.kset.list, 56 + kobj.entry) { 57 if (dev->driver && dev->driver->shutdown) { 58 + dev_dbg(dev, "shutdown\n"); 59 dev->driver->shutdown(dev); 60 + } 61 } 62 up_write(&devices_subsys.rwsem); 63
+15 -2
drivers/base/power/suspend.c
··· 39 { 40 int error = 0; 41 42 - dev_dbg(dev, "suspending\n"); 43 44 dev->power.prev_state = dev->power.power_state; 45 46 - if (dev->bus && dev->bus->suspend && !dev->power.power_state) 47 error = dev->bus->suspend(dev, state); 48 49 return error; 50 }
··· 39 { 40 int error = 0; 41 42 + if (dev->power.power_state) { 43 + dev_dbg(dev, "PM: suspend %d-->%d\n", 44 + dev->power.power_state, state); 45 + } 46 + if (dev->power.pm_parent 47 + && dev->power.pm_parent->power.power_state) { 48 + dev_err(dev, 49 + "PM: suspend %d->%d, parent %s already %d\n", 50 + dev->power.power_state, state, 51 + dev->power.pm_parent->bus_id, 52 + dev->power.pm_parent->power.power_state); 53 + } 54 55 dev->power.prev_state = dev->power.power_state; 56 57 + if (dev->bus && dev->bus->suspend && !dev->power.power_state) { 58 + dev_dbg(dev, "suspending\n"); 59 error = dev->bus->suspend(dev, state); 60 + } 61 62 return error; 63 }
-3
include/linux/device.h
··· 273 BIOS data relevant to device) */ 274 struct dev_pm_info power; 275 276 - u32 detach_state; /* State to enter when device is 277 - detached from its driver. */ 278 - 279 u64 *dma_mask; /* dma mask (if dma'able device) */ 280 u64 coherent_dma_mask;/* Like dma_mask, but for 281 alloc_coherent mappings as
··· 273 BIOS data relevant to device) */ 274 struct dev_pm_info power; 275 276 u64 *dma_mask; /* dma mask (if dma'able device) */ 277 u64 coherent_dma_mask;/* Like dma_mask, but for 278 alloc_coherent mappings as
+3 -3
kernel/power/main.c
··· 156 goto Unlock; 157 } 158 159 - pr_debug("PM: Preparing system for suspend\n"); 160 if ((error = suspend_prepare(state))) 161 goto Unlock; 162 163 - pr_debug("PM: Entering state.\n"); 164 error = suspend_enter(state); 165 166 - pr_debug("PM: Finishing up.\n"); 167 suspend_finish(state); 168 Unlock: 169 up(&pm_sem);
··· 156 goto Unlock; 157 } 158 159 + pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); 160 if ((error = suspend_prepare(state))) 161 goto Unlock; 162 163 + pr_debug("PM: Entering %s sleep\n", pm_states[state]); 164 error = suspend_enter(state); 165 166 + pr_debug("PM: Finishing wakeup.\n"); 167 suspend_finish(state); 168 Unlock: 169 up(&pm_sem);