acpi_bus.h 13.3 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 123 124
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);
typedef int (*acpi_op_bind) (struct acpi_device * device);
typedef int (*acpi_op_unbind) (struct acpi_device * device);
125
typedef void (*acpi_op_notify) (struct acpi_device * device, u32 event);
L
Linus Torvalds 已提交
126

127
struct acpi_bus_ops {
L
Len Brown 已提交
128 129
	u32 acpi_op_add:1;
	u32 acpi_op_start:1;
130 131
};

L
Linus Torvalds 已提交
132
struct acpi_device_ops {
L
Len Brown 已提交
133 134 135 136 137
	acpi_op_add add;
	acpi_op_remove remove;
	acpi_op_start start;
	acpi_op_bind bind;
	acpi_op_unbind unbind;
138
	acpi_op_notify notify;
L
Linus Torvalds 已提交
139 140
};

141 142
#define ACPI_DRIVER_ALL_NOTIFY_EVENTS	0x1	/* system AND device events */

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

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

/* Status (_STA) */

struct acpi_device_status {
L
Len Brown 已提交
161 162 163 164 165 166
	u32 present:1;
	u32 enabled:1;
	u32 show_in_ui:1;
	u32 functional:1;
	u32 battery_present:1;
	u32 reserved:27;
L
Linus Torvalds 已提交
167 168 169 170 171
};

/* Flags */

struct acpi_device_flags {
L
Len Brown 已提交
172 173 174 175 176 177 178 179
	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;
180 181
	u32 eject_pending:1;
	u32 reserved:23;
L
Linus Torvalds 已提交
182 183 184 185 186
};

/* File System */

struct acpi_device_dir {
L
Len Brown 已提交
187
	struct proc_dir_entry *entry;
L
Linus Torvalds 已提交
188 189 190 191 192 193
};

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

/* Plug and Play */

194
typedef char acpi_bus_id[8];
L
Len Brown 已提交
195 196 197
typedef unsigned long acpi_bus_address;
typedef char acpi_device_name[40];
typedef char acpi_device_class[20];
L
Linus Torvalds 已提交
198

199 200 201 202 203
struct acpi_hardware_id {
	struct list_head list;
	char *id;
};

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

#define acpi_device_bid(d)	((d)->pnp.bus_id)
#define acpi_device_adr(d)	((d)->pnp.bus_address)
215
const char *acpi_device_hid(struct acpi_device *device);
L
Linus Torvalds 已提交
216 217 218 219 220 221
#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 已提交
222 223 224 225 226
	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 已提交
227 228 229 230
};

struct acpi_device_power_state {
	struct {
L
Len Brown 已提交
231 232 233 234 235 236 237
		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 已提交
238 239 240
};

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

/* Performance Management */

struct acpi_device_perf_flags {
L
Len Brown 已提交
249
	u8 reserved:8;
L
Linus Torvalds 已提交
250 251 252 253
};

struct acpi_device_perf_state {
	struct {
L
Len Brown 已提交
254 255 256 257 258 259
		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 已提交
260 261 262
};

struct acpi_device_perf {
L
Len Brown 已提交
263
	int state;
L
Linus Torvalds 已提交
264
	struct acpi_device_perf_flags flags;
L
Len Brown 已提交
265
	int state_count;
L
Linus Torvalds 已提交
266 267 268 269 270
	struct acpi_device_perf_state *states;
};

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

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

/* Device */

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

309 310 311 312 313
static inline void *acpi_driver_data(struct acpi_device *d)
{
	return d->driver_data;
}

314 315
#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 已提交
316

317 318 319
/* acpi_device.dev.bus == &acpi_bus_type */
extern struct bus_type acpi_bus_type;

L
Linus Torvalds 已提交
320 321 322 323 324 325
/*
 * Events
 * ------
 */

struct acpi_bus_event {
L
Len Brown 已提交
326 327 328 329 330
	struct list_head node;
	acpi_device_class device_class;
	acpi_bus_id bus_id;
	u32 type;
	u32 data;
L
Linus Torvalds 已提交
331 332
};

333 334 335 336 337
struct acpi_eject_event {
	acpi_handle	handle;
	u32		event;
};

338
extern struct kobject *acpi_kobj;
339
extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
340
void acpi_bus_private_data_handler(acpi_handle, void *);
Z
Zhang Rui 已提交
341
int acpi_bus_get_private_data(acpi_handle, void **);
342 343 344
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 *);
345 346 347

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

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

384 385 386 387 388 389 390 391 392 393 394 395 396

/**
 * module_acpi_driver(acpi_driver) - Helper macro for registering an ACPI driver
 * @__acpi_driver: acpi_driver struct
 *
 * Helper macro for ACPI drivers which do not do anything special in module
 * init/exit. This eliminates a lot of boilerplate. Each module may only
 * use this macro once, and calling it replaces module_init() and module_exit()
 */
#define module_acpi_driver(__acpi_driver) \
	module_driver(__acpi_driver, acpi_bus_register_driver, \
		      acpi_bus_unregister_driver)

397 398 399 400
/*
 * Bind physical devices with ACPI devices
 */
struct acpi_bus_type {
L
Len Brown 已提交
401 402 403 404
	struct list_head list;
	struct bus_type *bus;
	/* For general devices under the bus */
	int (*find_device) (struct device *, acpi_handle *);
405
	/* For bridges, such as PCI root bridge, IDE controller */
L
Len Brown 已提交
406
	int (*find_bridge) (struct device *, acpi_handle *);
407 408 409 410
};
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);
411

412 413 414 415 416 417
struct acpi_pci_root {
	struct list_head node;
	struct acpi_device * device;
	struct acpi_pci_id id;
	struct pci_bus *bus;
	u16 segment;
418
	struct resource secondary;	/* downstream bus range */
419 420 421

	u32 osc_support_set;	/* _OSC state of support bits */
	u32 osc_control_set;	/* _OSC state of control bits */
422
	phys_addr_t mcfg_addr;
423 424
};

425
/* helper */
L
Lin Ming 已提交
426
acpi_handle acpi_get_child(acpi_handle, u64);
427
int acpi_is_root_bridge(acpi_handle);
428
acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
429
struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);
430
#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->archdata.acpi_handle))
431

432 433 434
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 已提交
435
#ifdef CONFIG_PM
436
int acpi_pm_device_sleep_state(struct device *, int *, int);
437
#else
438
static inline int acpi_pm_device_sleep_state(struct device *d, int *p, int m)
439 440 441
{
	if (p)
		*p = ACPI_STATE_D0;
442
	return (m >= ACPI_STATE_D0 && m <= ACPI_STATE_D3) ? m : ACPI_STATE_D0;
443
}
444 445 446
#endif

#ifdef CONFIG_PM_SLEEP
447
int acpi_pm_device_run_wake(struct device *, bool);
448 449
int acpi_pm_device_sleep_wake(struct device *, bool);
#else
450 451 452 453
static inline int acpi_pm_device_run_wake(struct device *dev, bool enable)
{
	return -ENODEV;
}
454 455 456 457
static inline int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
{
	return -ENODEV;
}
458
#endif
459

460 461
#else	/* CONFIG_ACPI */

462 463
static inline int register_acpi_bus_type(void *bus) { return 0; }
static inline int unregister_acpi_bus_type(void *bus) { return 0; }
464

L
Len Brown 已提交
465
#endif				/* CONFIG_ACPI */
L
Linus Torvalds 已提交
466 467

#endif /*__ACPI_BUS_H__*/