xref: /openbmc/linux/include/acpi/acpi_bus.h (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1 /*
2  *  acpi_bus.h - ACPI Bus Driver ($Revision: 22 $)
3  *
4  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
5  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
6  *
7  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or (at
12  *  your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful, but
15  *  WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  *  General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License along
20  *  with this program; if not, write to the Free Software Foundation, Inc.,
21  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
22  *
23  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24  */
25 
26 #ifndef __ACPI_BUS_H__
27 #define __ACPI_BUS_H__
28 
29 #include <linux/kobject.h>
30 
31 #include <acpi/acpi.h>
32 
33 #define PREFIX			"ACPI: "
34 
35 /* TBD: Make dynamic */
36 #define ACPI_MAX_HANDLES	10
37 struct acpi_handle_list {
38 	u32			count;
39 	acpi_handle		handles[ACPI_MAX_HANDLES];
40 };
41 
42 
43 /* acpi_utils.h */
44 acpi_status
45 acpi_extract_package (
46 	union acpi_object       *package,
47 	struct acpi_buffer      *format,
48 	struct acpi_buffer      *buffer);
49 acpi_status
50 acpi_evaluate_integer (
51 	acpi_handle             handle,
52 	acpi_string             pathname,
53 	struct acpi_object_list *arguments,
54 	unsigned long           *data);
55 acpi_status
56 acpi_evaluate_reference (
57 	acpi_handle             handle,
58 	acpi_string             pathname,
59 	struct acpi_object_list *arguments,
60 	struct acpi_handle_list *list);
61 
62 
63 #ifdef CONFIG_ACPI_BUS
64 
65 #include <linux/proc_fs.h>
66 
67 #define ACPI_BUS_FILE_ROOT	"acpi"
68 extern struct proc_dir_entry	*acpi_root_dir;
69 extern FADT_DESCRIPTOR		acpi_fadt;
70 
71 enum acpi_bus_removal_type {
72 	ACPI_BUS_REMOVAL_NORMAL	= 0,
73 	ACPI_BUS_REMOVAL_EJECT,
74 	ACPI_BUS_REMOVAL_SUPRISE,
75 	ACPI_BUS_REMOVAL_TYPE_COUNT
76 };
77 
78 enum acpi_bus_device_type {
79 	ACPI_BUS_TYPE_DEVICE	= 0,
80 	ACPI_BUS_TYPE_POWER,
81 	ACPI_BUS_TYPE_PROCESSOR,
82 	ACPI_BUS_TYPE_THERMAL,
83 	ACPI_BUS_TYPE_SYSTEM,
84 	ACPI_BUS_TYPE_POWER_BUTTON,
85 	ACPI_BUS_TYPE_SLEEP_BUTTON,
86 	ACPI_BUS_DEVICE_TYPE_COUNT
87 };
88 
89 struct acpi_driver;
90 struct acpi_device;
91 
92 
93 /*
94  * ACPI Driver
95  * -----------
96  */
97 
98 typedef int (*acpi_op_add)	(struct acpi_device *device);
99 typedef int (*acpi_op_remove)	(struct acpi_device *device, int type);
100 typedef int (*acpi_op_lock)	(struct acpi_device *device, int type);
101 typedef int (*acpi_op_start)	(struct acpi_device *device);
102 typedef int (*acpi_op_stop)	(struct acpi_device *device, int type);
103 typedef int (*acpi_op_suspend)	(struct acpi_device *device, int state);
104 typedef int (*acpi_op_resume)	(struct acpi_device *device, int state);
105 typedef int (*acpi_op_scan)	(struct acpi_device *device);
106 typedef int (*acpi_op_bind)	(struct acpi_device *device);
107 typedef int (*acpi_op_unbind)	(struct acpi_device *device);
108 typedef int (*acpi_op_match)	(struct acpi_device *device,
109 				 struct acpi_driver *driver);
110 
111 struct acpi_device_ops {
112 	acpi_op_add		add;
113 	acpi_op_remove		remove;
114 	acpi_op_lock		lock;
115 	acpi_op_start		start;
116 	acpi_op_stop		stop;
117 	acpi_op_suspend		suspend;
118 	acpi_op_resume		resume;
119 	acpi_op_scan		scan;
120 	acpi_op_bind		bind;
121 	acpi_op_unbind		unbind;
122 	acpi_op_match		match;
123 };
124 
125 struct acpi_driver {
126 	struct list_head	node;
127 	char			name[80];
128 	char			class[80];
129 	atomic_t		references;
130 	char			*ids;		/* Supported Hardware IDs */
131 	struct acpi_device_ops	ops;
132 };
133 
134 /*
135  * ACPI Device
136  * -----------
137  */
138 
139 /* Status (_STA) */
140 
141 struct acpi_device_status {
142 	u32			present:1;
143 	u32			enabled:1;
144 	u32			show_in_ui:1;
145 	u32			functional:1;
146 	u32			battery_present:1;
147 	u32			reserved:27;
148 };
149 
150 
151 /* Flags */
152 
153 struct acpi_device_flags {
154 	u32			dynamic_status:1;
155 	u32			hardware_id:1;
156 	u32			compatible_ids:1;
157 	u32			bus_address:1;
158 	u32			unique_id:1;
159 	u32			removable:1;
160 	u32			ejectable:1;
161 	u32			lockable:1;
162 	u32			suprise_removal_ok:1;
163 	u32			power_manageable:1;
164 	u32			performance_manageable:1;
165 	u32			wake_capable:1; /* Wakeup(_PRW) supported? */
166 	u32			reserved:20;
167 };
168 
169 
170 /* File System */
171 
172 struct acpi_device_dir {
173 	struct proc_dir_entry	*entry;
174 };
175 
176 #define acpi_device_dir(d)	((d)->dir.entry)
177 
178 
179 /* Plug and Play */
180 
181 typedef char			acpi_bus_id[5];
182 typedef unsigned long		acpi_bus_address;
183 typedef char			acpi_hardware_id[9];
184 typedef char			acpi_unique_id[9];
185 typedef char			acpi_device_name[40];
186 typedef char			acpi_device_class[20];
187 
188 struct acpi_device_pnp {
189 	acpi_bus_id		bus_id;		               /* Object name */
190 	acpi_bus_address	bus_address;	                      /* _ADR */
191 	acpi_hardware_id	hardware_id;	                      /* _HID */
192 	struct acpi_compatible_id_list *cid_list;		     /* _CIDs */
193 	acpi_unique_id		unique_id;	                      /* _UID */
194 	acpi_device_name	device_name;	         /* Driver-determined */
195 	acpi_device_class	device_class;	         /*        "          */
196 };
197 
198 #define acpi_device_bid(d)	((d)->pnp.bus_id)
199 #define acpi_device_adr(d)	((d)->pnp.bus_address)
200 #define acpi_device_hid(d)	((d)->pnp.hardware_id)
201 #define acpi_device_uid(d)	((d)->pnp.unique_id)
202 #define acpi_device_name(d)	((d)->pnp.device_name)
203 #define acpi_device_class(d)	((d)->pnp.device_class)
204 
205 
206 /* Power Management */
207 
208 struct acpi_device_power_flags {
209 	u32			explicit_get:1;		     /* _PSC present? */
210 	u32			power_resources:1;	   /* Power resources */
211 	u32			inrush_current:1;	  /* Serialize Dx->D0 */
212 	u32			power_removed:1;	   /* Optimize Dx->D0 */
213 	u32			reserved:28;
214 };
215 
216 struct acpi_device_power_state {
217 	struct {
218 		u8			valid:1;
219 		u8			explicit_set:1;	     /* _PSx present? */
220 		u8			reserved:6;
221 	}			flags;
222 	int			power;		  /* % Power (compared to D0) */
223 	int			latency;	/* Dx->D0 time (microseconds) */
224 	struct acpi_handle_list	resources;	/* Power resources referenced */
225 };
226 
227 struct acpi_device_power {
228 	int			state;		             /* Current state */
229 	struct acpi_device_power_flags flags;
230 	struct acpi_device_power_state states[4];     /* Power states (D0-D3) */
231 };
232 
233 
234 /* Performance Management */
235 
236 struct acpi_device_perf_flags {
237 	u8			reserved:8;
238 };
239 
240 struct acpi_device_perf_state {
241 	struct {
242 		u8			valid:1;
243 		u8			reserved:7;
244 	}			flags;
245 	u8			power;		  /* % Power (compared to P0) */
246 	u8			performance;	  /* % Performance (    "   ) */
247 	int			latency;	/* Px->P0 time (microseconds) */
248 };
249 
250 struct acpi_device_perf {
251 	int			state;
252 	struct acpi_device_perf_flags flags;
253 	int			state_count;
254 	struct acpi_device_perf_state *states;
255 };
256 
257 /* Wakeup Management */
258 struct acpi_device_wakeup_flags {
259 	u8	valid:1; /* Can successfully enable wakeup? */
260 	u8	run_wake:1; /* Run-Wake GPE devices */
261 };
262 
263 struct acpi_device_wakeup_state {
264 	u8	enabled:1;
265 	u8	active:1;
266 };
267 
268 struct acpi_device_wakeup {
269 	acpi_handle		gpe_device;
270 	acpi_integer		gpe_number;;
271 	acpi_integer		sleep_state;
272 	struct acpi_handle_list	resources;
273 	struct acpi_device_wakeup_state	state;
274 	struct acpi_device_wakeup_flags	flags;
275 };
276 
277 /* Device */
278 
279 struct acpi_device {
280 	acpi_handle		handle;
281 	struct acpi_device	*parent;
282 	struct list_head	children;
283 	struct list_head	node;
284 	struct list_head	wakeup_list;
285 	struct list_head	g_list;
286 	struct acpi_device_status status;
287 	struct acpi_device_flags flags;
288 	struct acpi_device_pnp	pnp;
289 	struct acpi_device_power power;
290 	struct acpi_device_wakeup wakeup;
291 	struct acpi_device_perf	performance;
292 	struct acpi_device_dir	dir;
293 	struct acpi_device_ops	ops;
294 	struct acpi_driver	*driver;
295 	void			*driver_data;
296 	struct kobject		kobj;
297 };
298 
299 #define acpi_driver_data(d)	((d)->driver_data)
300 
301 
302 /*
303  * Events
304  * ------
305  */
306 
307 struct acpi_bus_event {
308 	struct list_head	node;
309 	acpi_device_class	device_class;
310 	acpi_bus_id		bus_id;
311 	u32			type;
312 	u32			data;
313 };
314 
315 extern struct subsystem acpi_subsys;
316 
317 /*
318  * External Functions
319  */
320 
321 int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device);
322 void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context);
323 int acpi_bus_get_status (struct acpi_device *device);
324 int acpi_bus_get_power (acpi_handle handle, int *state);
325 int acpi_bus_set_power (acpi_handle handle, int state);
326 int acpi_bus_generate_event (struct acpi_device *device, u8 type, int data);
327 int acpi_bus_receive_event (struct acpi_bus_event *event);
328 int acpi_bus_register_driver (struct acpi_driver *driver);
329 int acpi_bus_unregister_driver (struct acpi_driver *driver);
330 int acpi_bus_scan (struct acpi_device *start);
331 int acpi_bus_add (struct acpi_device **child, struct acpi_device *parent,
332 		acpi_handle handle, int type);
333 
334 
335 int acpi_match_ids (struct acpi_device	*device, char	*ids);
336 int acpi_create_dir(struct acpi_device *);
337 void acpi_remove_dir(struct acpi_device *);
338 
339 #endif /*CONFIG_ACPI_BUS*/
340 
341 #endif /*__ACPI_BUS_H__*/
342