aboutsummaryrefslogtreecommitdiffstats
ModeNameSize
-rw-r--r--.gitignore952logstatsplainblame
-rw-r--r--.mailmap4021logstatsplainblame
-rw-r--r--COPYING18693logstatsplainblame
-rw-r--r--CREDITS94031logstatsplainblame
d---------Documentation8161logstatsplain
-rw-r--r--Kbuild2430logstatsplainblame
-rw-r--r--MAINTAINERS159757logstatsplainblame
-rw-r--r--Makefile55187logstatsplainblame
-rw-r--r--README17459logstatsplainblame
-rw-r--r--REPORTING-BUGS3371logstatsplainblame
d---------arch809logstatsplain
d---------block1052logstatsplain
d---------crypto2981logstatsplain
d---------drivers2829logstatsplain
d---------firmware1906logstatsplain
d---------fs4823logstatsplain
d---------include609logstatsplain
d---------init469logstatsplain
d---------ipc513logstatsplain
d---------kernel4947logstatsplain
d---------lib4733logstatsplain
d---------mm2696logstatsplain
d---------net1732logstatsplain
d---------samples216logstatsplain
d---------scripts2815logstatsplain
d---------security548logstatsplain
d---------sound814logstatsplain
d---------tools / perf31logstatsplain
d---------usr340logstatsplain
d---------virt / kvm30logstatsplain
da177e4c3f4
9090589d8750
1da177e4c3f4
4be44fcd3bf6

1da177e4c3f4



f2b56bc808ad





1da177e4c3f4


9090589d8750
1da177e4c3f4





4be44fcd3bf6
d9dda78bad87
1da177e4c3f4

d75080328aff
cf7acfab032f
4be44fcd3bf6




1da177e4c3f4

9cee43e07940
1da177e4c3f4
c65ade4dc8b4
cf7acfab032f

1da177e4c3f4
1da177e4c3f4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154

                           
                         

                          
                       

                        
                  
                     
 
                                                     


                                  


                    
                         
 


                                                                      
                                      
 
                                                                    
 
                                      
                                                                  

                                                                        
                                                        


                                             
 
                                              
                                           

                                                          

                                                     
                                                
                                                   



                                                                       













                                                                               
                                                                  





                                                                     

                                                       
         
                                        


                 

                                                                   
                                                
 

                                              





                                                                     

                                                

 
              


                                                            
 


                                      
 

                          
 
                                                  
                               
                             

                                  
                                      
                                                                  

                                                                        



                                                        





                                                                            


                              
                                        





                                                                         
                                                                    
                                            

 
                                                                      
                             




                                                  

  
                                     
 
                                   

                                                                    
 

                 
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/export.h>
#include <linux/suspend.h>
#include <linux/bcd.h>
#include <linux/acpi.h>
#include <asm/uaccess.h>

#include "sleep.h"
#include "internal.h"

#define _COMPONENT		ACPI_SYSTEM_COMPONENT

/*
 * this file provides support for:
 * /proc/acpi/wakeup
 */

ACPI_MODULE_NAME("sleep")

static int
acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
{
	struct list_head *node, *next;

	seq_printf(seq, "Device\tS-state\t  Status   Sysfs node\n");

	mutex_lock(&acpi_device_lock);
	list_for_each_safe(node, next, &acpi_wakeup_device_list) {
		struct acpi_device *dev =
		    container_of(node, struct acpi_device, wakeup_list);
		struct acpi_device_physical_node *entry;

		if (!dev->wakeup.flags.valid)
			continue;

		seq_printf(seq, "%s\t  S%d\t",
			   dev->pnp.bus_id,
			   (u32) dev->wakeup.sleep_state);

		mutex_lock(&dev->physical_node_lock);

		if (!dev->physical_node_count) {
			seq_printf(seq, "%c%-8s\n",
				dev->wakeup.flags.run_wake ? '*' : ' ',
				device_may_wakeup(&dev->dev) ?
					"enabled" : "disabled");
		} else {
			struct device *ldev;
			list_for_each_entry(entry, &dev->physical_node_list,
					node) {
				ldev = get_device(entry->dev);
				if (!ldev)
					continue;

				if (&entry->node !=
						dev->physical_node_list.next)
					seq_printf(seq, "\t\t");

				seq_printf(seq, "%c%-8s  %s:%s\n",
					dev->wakeup.flags.run_wake ? '*' : ' ',
					(device_may_wakeup(&dev->dev) ||
					device_may_wakeup(ldev)) ?
					"enabled" : "disabled",
					ldev->bus ? ldev->bus->name :
					"no-bus", dev_name(ldev));
				put_device(ldev);
			}
		}

		mutex_unlock(&dev->physical_node_lock);
	}
	mutex_unlock(&acpi_device_lock);
	return 0;
}

static void physical_device_enable_wakeup(struct acpi_device *adev)
{
	struct acpi_device_physical_node *entry;

	mutex_lock(&adev->physical_node_lock);

	list_for_each_entry(entry,
		&adev->physical_node_list, node)
		if (entry->dev && device_can_wakeup(entry->dev)) {
			bool enable = !device_may_wakeup(entry->dev);
			device_set_wakeup_enable(entry->dev, enable);
		}

	mutex_unlock(&adev->physical_node_lock);
}

static ssize_t
acpi_system_write_wakeup_device(struct file *file,
				const char __user * buffer,
				size_t count, loff_t * ppos)
{
	struct list_head *node, *next;
	char strbuf[5];
	char str[5] = "";

	if (count > 4)
		count = 4;

	if (copy_from_user(strbuf, buffer, count))
		return -EFAULT;
	strbuf[count] = '\0';
	sscanf(strbuf, "%s", str);

	mutex_lock(&acpi_device_lock);
	list_for_each_safe(node, next, &acpi_wakeup_device_list) {
		struct acpi_device *dev =
		    container_of(node, struct acpi_device, wakeup_list);
		if (!dev->wakeup.flags.valid)
			continue;

		if (!strncmp(dev->pnp.bus_id, str, 4)) {
			if (device_can_wakeup(&dev->dev)) {
				bool enable = !device_may_wakeup(&dev->dev);
				device_set_wakeup_enable(&dev->dev, enable);
			} else {
				physical_device_enable_wakeup(dev);
			}
			break;
		}
	}
	mutex_unlock(&acpi_device_lock);
	return count;
}

static int
acpi_system_wakeup_device_open_fs(struct inode *inode, struct file *file)
{
	return single_open(file, acpi_system_wakeup_device_seq_show,
			   PDE_DATA(inode));
}

static const struct file_operations acpi_system_wakeup_device_fops = {
	.owner = THIS_MODULE,
	.open = acpi_system_wakeup_device_open_fs,
	.read = seq_read,
	.write = acpi_system_write_wakeup_device,
	.llseek = seq_lseek,
	.release = single_release,
};

int __init acpi_sleep_proc_init(void)
{
	/* 'wakeup device' [R/W] */
	proc_create("wakeup", S_IFREG | S_IRUGO | S_IWUSR,
		    acpi_root_dir, &acpi_system_wakeup_device_fops);

	return 0;
}