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