acpi_bus.h 12.8 KB
Newer Older
L
Linus Torvalds 已提交
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
/*
 *  acpi_bus.h - ACPI Bus Driver ($Revision: 22 $)
 *
 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or (at
 *  your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

#ifndef __ACPI_BUS_H__
#define __ACPI_BUS_H__

29
#include <linux/device.h>
L
Linus Torvalds 已提交
30 31 32 33 34 35

#include <acpi/acpi.h>

/* TBD: Make dynamic */
#define ACPI_MAX_HANDLES	10
struct acpi_handle_list {
L
Len Brown 已提交
36 37
	u32 count;
	acpi_handle handles[ACPI_MAX_HANDLES];
L
Linus Torvalds 已提交
38 39 40 41
};

/* acpi_utils.h */
acpi_status
L
Len Brown 已提交
42 43
acpi_extract_package(union acpi_object *package,
		     struct acpi_buffer *format, struct acpi_buffer *buffer);
L
Linus Torvalds 已提交
44
acpi_status
L
Len Brown 已提交
45 46
acpi_evaluate_integer(acpi_handle handle,
		      acpi_string pathname,
47
		      struct acpi_object_list *arguments, unsigned long long *data);
L
Linus Torvalds 已提交
48
acpi_status
L
Len Brown 已提交
49 50 51 52
acpi_evaluate_reference(acpi_handle handle,
			acpi_string pathname,
			struct acpi_object_list *arguments,
			struct acpi_handle_list *list);
53 54 55
acpi_status
acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event,
			u32 status_code, struct acpi_buffer *status_buf);
L
Linus Torvalds 已提交
56

M
Matthew Garrett 已提交
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
struct acpi_pld {
	unsigned int revision:7; /* 0 */
	unsigned int ignore_colour:1; /* 7 */
	unsigned int colour:24; /* 8 */
	unsigned int width:16; /* 32 */
	unsigned int height:16; /* 48 */
	unsigned int user_visible:1; /* 64 */
	unsigned int dock:1; /* 65 */
	unsigned int lid:1; /* 66 */
	unsigned int panel:3; /* 67 */
	unsigned int vertical_pos:2; /* 70 */
	unsigned int horizontal_pos:2; /* 72 */
	unsigned int shape:4; /* 74 */
	unsigned int group_orientation:1; /* 78 */
	unsigned int group_token:8; /* 79 */
	unsigned int group_position:8; /* 87 */
	unsigned int bay:1; /* 95 */
	unsigned int ejectable:1; /* 96 */
	unsigned int ospm_eject_required:1; /* 97 */
	unsigned int cabinet_number:8; /* 98 */
	unsigned int card_cage_number:8; /* 106 */
	unsigned int reference:1; /* 114 */
	unsigned int rotation:4; /* 115 */
	unsigned int order:5; /* 119 */
	unsigned int reserved:4; /* 124 */
	unsigned int vertical_offset:16; /* 128 */
	unsigned int horizontal_offset:16; /* 144 */
} __attribute__((__packed__));

acpi_status
acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld);
L
Len Brown 已提交
88
#ifdef CONFIG_ACPI
L
Linus Torvalds 已提交
89 90 91 92

#include <linux/proc_fs.h>

#define ACPI_BUS_FILE_ROOT	"acpi"
L
Len Brown 已提交
93
extern struct proc_dir_entry *acpi_root_dir;
L
Linus Torvalds 已提交
94 95

enum acpi_bus_removal_type {
L
Len Brown 已提交
96
	ACPI_BUS_REMOVAL_NORMAL = 0,
L
Linus Torvalds 已提交
97 98 99 100 101 102
	ACPI_BUS_REMOVAL_EJECT,
	ACPI_BUS_REMOVAL_SUPRISE,
	ACPI_BUS_REMOVAL_TYPE_COUNT
};

enum acpi_bus_device_type {
L
Len Brown 已提交
103
	ACPI_BUS_TYPE_DEVICE = 0,
L
Linus Torvalds 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
	ACPI_BUS_TYPE_POWER,
	ACPI_BUS_TYPE_PROCESSOR,
	ACPI_BUS_TYPE_THERMAL,
	ACPI_BUS_TYPE_POWER_BUTTON,
	ACPI_BUS_TYPE_SLEEP_BUTTON,
	ACPI_BUS_DEVICE_TYPE_COUNT
};

struct acpi_driver;
struct acpi_device;

/*
 * ACPI Driver
 * -----------
 */

L
Len Brown 已提交
120 121 122
typedef int (*acpi_op_add) (struct acpi_device * device);
typedef int (*acpi_op_remove) (struct acpi_device * device, int type);
typedef int (*acpi_op_start) (struct acpi_device * device);
L
Len Brown 已提交
123 124
typedef int (*acpi_op_suspend) (struct acpi_device * device,
				pm_message_t state);
125
typedef int (*acpi_op_resume) (struct acpi_device * device);
L
Len Brown 已提交
126 127
typedef int (*acpi_op_bind) (struct acpi_device * device);
typedef int (*acpi_op_unbind) (struct acpi_device * device);
128
typedef void (*acpi_op_notify) (struct acpi_device * device, u32 event);
L
Linus Torvalds 已提交
129

130
struct acpi_bus_ops {
L
Len Brown 已提交
131 132
	u32 acpi_op_add:1;
	u32 acpi_op_start:1;
133 134
};

L
Linus Torvalds 已提交
135
struct acpi_device_ops {
L
Len Brown 已提交
136 137 138 139 140 141 142
	acpi_op_add add;
	acpi_op_remove remove;
	acpi_op_start start;
	acpi_op_suspend suspend;
	acpi_op_resume resume;
	acpi_op_bind bind;
	acpi_op_unbind unbind;
143
	acpi_op_notify notify;
L
Linus Torvalds 已提交
144 145
};

146 147
#define ACPI_DRIVER_ALL_NOTIFY_EVENTS	0x1	/* system AND device events */

L
Linus Torvalds 已提交
148
struct acpi_driver {
L
Len Brown 已提交
149 150
	char name[80];
	char class[80];
151
	const struct acpi_device_id *ids; /* Supported Hardware IDs */
152
	unsigned int flags;
L
Len Brown 已提交
153
	struct acpi_device_ops ops;
154
	struct device_driver drv;
155
	struct module *owner;
L
Linus Torvalds 已提交
156 157 158 159 160 161 162 163 164 165
};

/*
 * ACPI Device
 * -----------
 */

/* Status (_STA) */

struct acpi_device_status {
L
Len Brown 已提交
166 167 168 169 170 171
	u32 present:1;
	u32 enabled:1;
	u32 show_in_ui:1;
	u32 functional:1;
	u32 battery_present:1;
	u32 reserved:27;
L
Linus Torvalds 已提交
172 173 174 175 176
};

/* Flags */

struct acpi_device_flags {
L
Len Brown 已提交
177 178 179 180 181 182 183 184
	u32 dynamic_status:1;
	u32 bus_address:1;
	u32 removable:1;
	u32 ejectable:1;
	u32 lockable:1;
	u32 suprise_removal_ok:1;
	u32 power_manageable:1;
	u32 performance_manageable:1;
185
	u32 reserved:24;
L
Linus Torvalds 已提交
186 187 188 189 190
};

/* File System */

struct acpi_device_dir {
L
Len Brown 已提交
191
	struct proc_dir_entry *entry;
L
Linus Torvalds 已提交
192 193 194 195 196 197
};

#define acpi_device_dir(d)	((d)->dir.entry)

/* Plug and Play */

198
typedef char acpi_bus_id[8];
L
Len Brown 已提交
199 200 201
typedef unsigned long acpi_bus_address;
typedef char acpi_device_name[40];
typedef char acpi_device_class[20];
L
Linus Torvalds 已提交
202

203 204 205 206 207
struct acpi_hardware_id {
	struct list_head list;
	char *id;
};

L
Linus Torvalds 已提交
208
struct acpi_device_pnp {
L
Len Brown 已提交
209 210
	acpi_bus_id bus_id;	/* Object name */
	acpi_bus_address bus_address;	/* _ADR */
211
	char *unique_id;	/* _UID */
212
	struct list_head ids;		/* _HID and _CIDs */
L
Len Brown 已提交
213 214
	acpi_device_name device_name;	/* Driver-determined */
	acpi_device_class device_class;	/*        "          */
L
Linus Torvalds 已提交
215 216 217 218
};

#define acpi_device_bid(d)	((d)->pnp.bus_id)
#define acpi_device_adr(d)	((d)->pnp.bus_address)
219
const char *acpi_device_hid(struct acpi_device *device);
L
Linus Torvalds 已提交
220 221 222 223 224 225
#define acpi_device_name(d)	((d)->pnp.device_name)
#define acpi_device_class(d)	((d)->pnp.device_class)

/* Power Management */

struct acpi_device_power_flags {
L
Len Brown 已提交
226 227 228 229 230
	u32 explicit_get:1;	/* _PSC present? */
	u32 power_resources:1;	/* Power resources */
	u32 inrush_current:1;	/* Serialize Dx->D0 */
	u32 power_removed:1;	/* Optimize Dx->D0 */
	u32 reserved:28;
L
Linus Torvalds 已提交
231 232 233 234
};

struct acpi_device_power_state {
	struct {
L
Len Brown 已提交
235 236 237 238 239 240 241
		u8 valid:1;
		u8 explicit_set:1;	/* _PSx present? */
		u8 reserved:6;
	} flags;
	int power;		/* % Power (compared to D0) */
	int latency;		/* Dx->D0 time (microseconds) */
	struct acpi_handle_list resources;	/* Power resources referenced */
L
Linus Torvalds 已提交
242 243 244
};

struct acpi_device_power {
L
Len Brown 已提交
245
	int state;		/* Current state */
L
Linus Torvalds 已提交
246
	struct acpi_device_power_flags flags;
247
	struct acpi_device_power_state states[ACPI_D_STATE_COUNT];	/* Power states (D0-D3Cold) */
L
Linus Torvalds 已提交
248 249 250 251 252
};

/* Performance Management */

struct acpi_device_perf_flags {
L
Len Brown 已提交
253
	u8 reserved:8;
L
Linus Torvalds 已提交
254 255 256 257
};

struct acpi_device_perf_state {
	struct {
L
Len Brown 已提交
258 259 260 261 262 263
		u8 valid:1;
		u8 reserved:7;
	} flags;
	u8 power;		/* % Power (compared to P0) */
	u8 performance;		/* % Performance (    "   ) */
	int latency;		/* Px->P0 time (microseconds) */
L
Linus Torvalds 已提交
264 265 266
};

struct acpi_device_perf {
L
Len Brown 已提交
267
	int state;
L
Linus Torvalds 已提交
268
	struct acpi_device_perf_flags flags;
L
Len Brown 已提交
269
	int state_count;
L
Linus Torvalds 已提交
270 271 272 273 274
	struct acpi_device_perf_state *states;
};

/* Wakeup Management */
struct acpi_device_wakeup_flags {
L
Len Brown 已提交
275 276
	u8 valid:1;		/* Can successfully enable wakeup? */
	u8 run_wake:1;		/* Run-Wake GPE devices */
277
	u8 notifier_present:1;  /* Wake-up notify handler has been installed */
L
Linus Torvalds 已提交
278 279 280
};

struct acpi_device_wakeup {
L
Len Brown 已提交
281
	acpi_handle gpe_device;
L
Lin Ming 已提交
282 283
	u64 gpe_number;
	u64 sleep_state;
L
Len Brown 已提交
284 285
	struct acpi_handle_list resources;
	struct acpi_device_wakeup_flags flags;
286
	int prepare_count;
L
Linus Torvalds 已提交
287 288 289 290 291
};

/* Device */

struct acpi_device {
292 293
	int device_type;
	acpi_handle handle;		/* no handle for fixed hardware */
L
Len Brown 已提交
294 295 296 297
	struct acpi_device *parent;
	struct list_head children;
	struct list_head node;
	struct list_head wakeup_list;
L
Linus Torvalds 已提交
298 299
	struct acpi_device_status status;
	struct acpi_device_flags flags;
L
Len Brown 已提交
300
	struct acpi_device_pnp pnp;
L
Linus Torvalds 已提交
301 302
	struct acpi_device_power power;
	struct acpi_device_wakeup wakeup;
L
Len Brown 已提交
303 304 305 306 307
	struct acpi_device_perf performance;
	struct acpi_device_dir dir;
	struct acpi_device_ops ops;
	struct acpi_driver *driver;
	void *driver_data;
308
	struct device dev;
L
Li Shaohua 已提交
309
	struct acpi_bus_ops bus_ops;	/* workaround for different code path for hotplug */
L
Len Brown 已提交
310
	enum acpi_bus_removal_type removal_type;	/* indicate for different removal type */
L
Linus Torvalds 已提交
311 312
};

313 314 315 316 317
static inline void *acpi_driver_data(struct acpi_device *d)
{
	return d->driver_data;
}

318 319
#define to_acpi_device(d)	container_of(d, struct acpi_device, dev)
#define to_acpi_driver(d)	container_of(d, struct acpi_driver, drv)
L
Linus Torvalds 已提交
320

321 322 323
/* acpi_device.dev.bus == &acpi_bus_type */
extern struct bus_type acpi_bus_type;

L
Linus Torvalds 已提交
324 325 326 327 328 329
/*
 * Events
 * ------
 */

struct acpi_bus_event {
L
Len Brown 已提交
330 331 332 333 334
	struct list_head node;
	acpi_device_class device_class;
	acpi_bus_id bus_id;
	u32 type;
	u32 data;
L
Linus Torvalds 已提交
335 336
};

337
extern struct kobject *acpi_kobj;
338
extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
339
void acpi_bus_private_data_handler(acpi_handle, void *);
Z
Zhang Rui 已提交
340
int acpi_bus_get_private_data(acpi_handle, void **);
341 342 343
extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32);
extern int register_acpi_notifier(struct notifier_block *);
extern int unregister_acpi_notifier(struct notifier_block *);
344 345 346

extern int register_acpi_bus_notifier(struct notifier_block *nb);
extern void unregister_acpi_bus_notifier(struct notifier_block *nb);
L
Linus Torvalds 已提交
347 348 349 350 351
/*
 * External Functions
 */

int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device);
352
void acpi_bus_data_handler(acpi_handle handle, void *context);
353 354
acpi_status acpi_bus_get_status_handle(acpi_handle handle,
				       unsigned long long *sta);
L
Len Brown 已提交
355 356
int acpi_bus_get_status(struct acpi_device *device);
int acpi_bus_set_power(acpi_handle handle, int state);
357
int acpi_bus_update_power(acpi_handle handle, int *state_p);
358
bool acpi_bus_power_manageable(acpi_handle handle);
359
bool acpi_bus_can_wakeup(acpi_handle handle);
360 361
int acpi_power_resource_register_device(struct device *dev, acpi_handle handle);
void acpi_power_resource_unregister_device(struct device *dev, acpi_handle handle);
362 363
#ifdef CONFIG_ACPI_PROC_EVENT
int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data);
364
int acpi_bus_generate_proc_event4(const char *class, const char *bid, u8 type, int data);
L
Len Brown 已提交
365
int acpi_bus_receive_event(struct acpi_bus_event *event);
366 367 368 369
#else
static inline int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data)
	{ return 0; }
#endif
L
Len Brown 已提交
370
int acpi_bus_register_driver(struct acpi_driver *driver);
371
void acpi_bus_unregister_driver(struct acpi_driver *driver);
L
Len Brown 已提交
372 373
int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent,
		 acpi_handle handle, int type);
374
int acpi_bus_trim(struct acpi_device *start, int rmdevice);
L
Len Brown 已提交
375
int acpi_bus_start(struct acpi_device *device);
L
Len Brown 已提交
376
acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
377 378
int acpi_match_device_ids(struct acpi_device *device,
			  const struct acpi_device_id *ids);
L
Linus Torvalds 已提交
379 380 381
int acpi_create_dir(struct acpi_device *);
void acpi_remove_dir(struct acpi_device *);

382 383 384 385
/*
 * Bind physical devices with ACPI devices
 */
struct acpi_bus_type {
L
Len Brown 已提交
386 387 388 389
	struct list_head list;
	struct bus_type *bus;
	/* For general devices under the bus */
	int (*find_device) (struct device *, acpi_handle *);
390
	/* For bridges, such as PCI root bridge, IDE controller */
L
Len Brown 已提交
391
	int (*find_bridge) (struct device *, acpi_handle *);
392 393 394 395
};
int register_acpi_bus_type(struct acpi_bus_type *);
int unregister_acpi_bus_type(struct acpi_bus_type *);
struct device *acpi_get_physical_device(acpi_handle);
396

397 398 399 400 401 402
struct acpi_pci_root {
	struct list_head node;
	struct acpi_device * device;
	struct acpi_pci_id id;
	struct pci_bus *bus;
	u16 segment;
403
	struct resource secondary;	/* downstream bus range */
404 405 406 407 408

	u32 osc_support_set;	/* _OSC state of support bits */
	u32 osc_control_set;	/* _OSC state of control bits */
};

409
/* helper */
L
Lin Ming 已提交
410
acpi_handle acpi_get_child(acpi_handle, u64);
411
int acpi_is_root_bridge(acpi_handle);
412
acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
413
struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);
414
#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->archdata.acpi_handle))
415

416 417 418
int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state);
int acpi_disable_wakeup_device_power(struct acpi_device *dev);

R
Rafael J. Wysocki 已提交
419
#ifdef CONFIG_PM
420
int acpi_pm_device_sleep_state(struct device *, int *);
421
#else
422
static inline int acpi_pm_device_sleep_state(struct device *d, int *p)
423 424 425 426 427
{
	if (p)
		*p = ACPI_STATE_D0;
	return ACPI_STATE_D3;
}
428 429 430
#endif

#ifdef CONFIG_PM_SLEEP
431
int acpi_pm_device_run_wake(struct device *, bool);
432 433
int acpi_pm_device_sleep_wake(struct device *, bool);
#else
434 435 436 437
static inline int acpi_pm_device_run_wake(struct device *dev, bool enable)
{
	return -ENODEV;
}
438 439 440 441
static inline int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
{
	return -ENODEV;
}
442
#endif
443

444 445 446 447 448
#else	/* CONFIG_ACPI */

static int register_acpi_bus_type(struct acpi_bus_type *bus) { return 0; }
static int unregister_acpi_bus_type(struct acpi_bus_type *bus) { return 0; }

L
Len Brown 已提交
449
#endif				/* CONFIG_ACPI */
L
Linus Torvalds 已提交
450 451

#endif /*__ACPI_BUS_H__*/