acpi_bus.h 16.1 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
acpi_status
58
acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld);
L
Len Brown 已提交
59
#ifdef CONFIG_ACPI
L
Linus Torvalds 已提交
60 61 62 63

#include <linux/proc_fs.h>

#define ACPI_BUS_FILE_ROOT	"acpi"
L
Len Brown 已提交
64
extern struct proc_dir_entry *acpi_root_dir;
L
Linus Torvalds 已提交
65 66

enum acpi_bus_removal_type {
L
Len Brown 已提交
67
	ACPI_BUS_REMOVAL_NORMAL = 0,
L
Linus Torvalds 已提交
68 69 70 71 72 73
	ACPI_BUS_REMOVAL_EJECT,
	ACPI_BUS_REMOVAL_SUPRISE,
	ACPI_BUS_REMOVAL_TYPE_COUNT
};

enum acpi_bus_device_type {
L
Len Brown 已提交
74
	ACPI_BUS_TYPE_DEVICE = 0,
L
Linus Torvalds 已提交
75 76 77 78 79 80 81 82 83 84 85
	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;

86 87 88 89 90
/*
 * ACPI Scan Handler
 * -----------------
 */

91 92 93 94 95 96 97
enum acpi_hotplug_mode {
	AHM_GENERIC = 0,
	AHM_CONTAINER,
	AHM_COUNT
};

struct acpi_hotplug_profile {
98
	struct kobject kobj;
99 100 101 102
	bool enabled:1;
	enum acpi_hotplug_mode mode;
};

103 104 105 106 107 108
static inline struct acpi_hotplug_profile *to_acpi_hotplug_profile(
						struct kobject *kobj)
{
	return container_of(kobj, struct acpi_hotplug_profile, kobj);
}

109 110 111 112 113
struct acpi_scan_handler {
	const struct acpi_device_id *ids;
	struct list_head list_node;
	int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id);
	void (*detach)(struct acpi_device *dev);
114
	struct acpi_hotplug_profile hotplug;
115 116
};

L
Linus Torvalds 已提交
117 118 119 120 121
/*
 * ACPI Driver
 * -----------
 */

L
Len Brown 已提交
122
typedef int (*acpi_op_add) (struct acpi_device * device);
123
typedef int (*acpi_op_remove) (struct acpi_device * device);
124
typedef void (*acpi_op_notify) (struct acpi_device * device, u32 event);
L
Linus Torvalds 已提交
125 126

struct acpi_device_ops {
L
Len Brown 已提交
127 128
	acpi_op_add add;
	acpi_op_remove remove;
129
	acpi_op_notify notify;
L
Linus Torvalds 已提交
130 131
};

132 133
#define ACPI_DRIVER_ALL_NOTIFY_EVENTS	0x1	/* system AND device events */

L
Linus Torvalds 已提交
134
struct acpi_driver {
L
Len Brown 已提交
135 136
	char name[80];
	char class[80];
137
	const struct acpi_device_id *ids; /* Supported Hardware IDs */
138
	unsigned int flags;
L
Len Brown 已提交
139
	struct acpi_device_ops ops;
140
	struct device_driver drv;
141
	struct module *owner;
L
Linus Torvalds 已提交
142 143 144 145 146 147 148 149 150 151
};

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

/* Status (_STA) */

struct acpi_device_status {
L
Len Brown 已提交
152 153 154 155 156 157
	u32 present:1;
	u32 enabled:1;
	u32 show_in_ui:1;
	u32 functional:1;
	u32 battery_present:1;
	u32 reserved:27;
L
Linus Torvalds 已提交
158 159 160 161 162
};

/* Flags */

struct acpi_device_flags {
L
Len Brown 已提交
163 164 165 166 167 168
	u32 dynamic_status:1;
	u32 removable:1;
	u32 ejectable:1;
	u32 suprise_removal_ok:1;
	u32 power_manageable:1;
	u32 performance_manageable:1;
169
	u32 eject_pending:1;
170
	u32 match_driver:1;
171
	u32 reserved:24;
L
Linus Torvalds 已提交
172 173 174 175 176
};

/* File System */

struct acpi_device_dir {
L
Len Brown 已提交
177
	struct proc_dir_entry *entry;
L
Linus Torvalds 已提交
178 179 180 181 182 183
};

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

/* Plug and Play */

184
typedef char acpi_bus_id[8];
L
Len Brown 已提交
185 186 187
typedef unsigned long acpi_bus_address;
typedef char acpi_device_name[40];
typedef char acpi_device_class[20];
L
Linus Torvalds 已提交
188

189 190 191 192 193
struct acpi_hardware_id {
	struct list_head list;
	char *id;
};

194 195 196 197 198 199
struct acpi_pnp_type {
	u32 hardware_id:1;
	u32 bus_address:1;
	u32 reserved:30;
};

L
Linus Torvalds 已提交
200
struct acpi_device_pnp {
201 202
	acpi_bus_id bus_id;		/* Object name */
	struct acpi_pnp_type type;	/* ID type */
L
Len Brown 已提交
203
	acpi_bus_address bus_address;	/* _ADR */
204
	char *unique_id;		/* _UID */
205
	struct list_head ids;		/* _HID and _CIDs */
L
Len Brown 已提交
206 207
	acpi_device_name device_name;	/* Driver-determined */
	acpi_device_class device_class;	/*        "          */
208
	union acpi_object *str_obj;	/* unicode string for _STR method */
Y
Yasuaki Ishimatsu 已提交
209
	unsigned long sun;		/* _SUN */
L
Linus Torvalds 已提交
210 211 212 213
};

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

struct acpi_device_power_state {
	struct {
L
Len Brown 已提交
230
		u8 valid:1;
231
		u8 os_accessible:1;
L
Len Brown 已提交
232 233 234 235 236
		u8 explicit_set:1;	/* _PSx present? */
		u8 reserved:6;
	} flags;
	int power;		/* % Power (compared to D0) */
	int latency;		/* Dx->D0 time (microseconds) */
237
	struct list_head 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;
280
	struct list_head resources;
L
Len Brown 已提交
281
	struct acpi_device_wakeup_flags flags;
282
	int prepare_count;
L
Linus Torvalds 已提交
283 284
};

285 286 287 288 289
struct acpi_device_physical_node {
	u8 node_id;
	struct list_head node;
	struct device *dev;
};
L
Linus Torvalds 已提交
290

291 292
/* set maximum of physical nodes to 32 for expansibility */
#define ACPI_MAX_PHYSICAL_NODE	32
L
Linus Torvalds 已提交
293

294
/* Device */
L
Linus Torvalds 已提交
295
struct acpi_device {
296 297
	int device_type;
	acpi_handle handle;		/* no handle for fixed hardware */
L
Len Brown 已提交
298 299 300 301
	struct acpi_device *parent;
	struct list_head children;
	struct list_head node;
	struct list_head wakeup_list;
L
Linus Torvalds 已提交
302 303
	struct acpi_device_status status;
	struct acpi_device_flags flags;
L
Len Brown 已提交
304
	struct acpi_device_pnp pnp;
L
Linus Torvalds 已提交
305 306
	struct acpi_device_power power;
	struct acpi_device_wakeup wakeup;
L
Len Brown 已提交
307 308
	struct acpi_device_perf performance;
	struct acpi_device_dir dir;
309
	struct acpi_scan_handler *handler;
L
Len Brown 已提交
310 311
	struct acpi_driver *driver;
	void *driver_data;
312
	struct device dev;
L
Len Brown 已提交
313
	enum acpi_bus_removal_type removal_type;	/* indicate for different removal type */
314 315 316 317
	u8 physical_node_count;
	struct list_head physical_node_list;
	struct mutex physical_node_lock;
	DECLARE_BITMAP(physical_node_id_bitmap, ACPI_MAX_PHYSICAL_NODE);
318
	struct list_head power_dependent;
319
	void (*remove)(struct acpi_device *);
L
Linus Torvalds 已提交
320 321
};

322 323 324 325 326
static inline void *acpi_driver_data(struct acpi_device *d)
{
	return d->driver_data;
}

327 328
#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 已提交
329

330 331 332
/* acpi_device.dev.bus == &acpi_bus_type */
extern struct bus_type acpi_bus_type;

L
Linus Torvalds 已提交
333 334 335 336 337 338
/*
 * Events
 * ------
 */

struct acpi_bus_event {
L
Len Brown 已提交
339 340 341 342 343
	struct list_head node;
	acpi_device_class device_class;
	acpi_bus_id bus_id;
	u32 type;
	u32 data;
L
Linus Torvalds 已提交
344 345
};

346
struct acpi_eject_event {
347
	struct acpi_device	*device;
348 349 350
	u32		event;
};

351 352 353 354 355 356 357 358 359
struct acpi_hp_work {
	struct work_struct work;
	acpi_handle handle;
	u32 type;
	void *context;
};
void alloc_acpi_hp_work(acpi_handle handle, u32 type, void *context,
			void (*func)(struct work_struct *work));

360
extern struct kobject *acpi_kobj;
361
extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
362
void acpi_bus_private_data_handler(acpi_handle, void *);
Z
Zhang Rui 已提交
363
int acpi_bus_get_private_data(acpi_handle, void **);
364 365 366
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 *);
367 368 369

extern int register_acpi_bus_notifier(struct notifier_block *nb);
extern void unregister_acpi_bus_notifier(struct notifier_block *nb);
L
Linus Torvalds 已提交
370 371 372 373 374
/*
 * External Functions
 */

int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device);
375
void acpi_bus_data_handler(acpi_handle handle, void *context);
376 377
acpi_status acpi_bus_get_status_handle(acpi_handle handle,
				       unsigned long long *sta);
L
Len Brown 已提交
378
int acpi_bus_get_status(struct acpi_device *device);
379 380

#ifdef CONFIG_PM
L
Len Brown 已提交
381
int acpi_bus_set_power(acpi_handle handle, int state);
382
const char *acpi_power_state_string(int state);
383
int acpi_device_get_power(struct acpi_device *device, int *state);
384
int acpi_device_set_power(struct acpi_device *device, int state);
385
int acpi_bus_init_power(struct acpi_device *device);
386
int acpi_bus_update_power(acpi_handle handle, int *state_p);
387
bool acpi_bus_power_manageable(acpi_handle handle);
388
bool acpi_bus_can_wakeup(acpi_handle handle);
389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
#else /* !CONFIG_PM */
static inline int acpi_bus_set_power(acpi_handle handle, int state)
{
	return 0;
}
static inline const char *acpi_power_state_string(int state)
{
	return "D0";
}
static inline int acpi_device_get_power(struct acpi_device *device, int *state)
{
	return 0;
}
static inline int acpi_device_set_power(struct acpi_device *device, int state)
{
	return 0;
}
static inline int acpi_bus_init_power(struct acpi_device *device)
{
	return 0;
}
static inline int acpi_bus_update_power(acpi_handle handle, int *state_p)
{
	return 0;
}
static inline bool acpi_bus_power_manageable(acpi_handle handle)
{
	return false;
}
static inline bool acpi_bus_can_wakeup(acpi_handle handle)
{
	return false;
}
#endif /* !CONFIG_PM */

424 425
#ifdef CONFIG_ACPI_PROC_EVENT
int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data);
426
int acpi_bus_generate_proc_event4(const char *class, const char *bid, u8 type, int data);
L
Len Brown 已提交
427
int acpi_bus_receive_event(struct acpi_bus_event *event);
428 429 430 431
#else
static inline int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data)
	{ return 0; }
#endif
432 433 434

void acpi_scan_lock_acquire(void);
void acpi_scan_lock_release(void);
435
int acpi_scan_add_handler(struct acpi_scan_handler *handler);
L
Len Brown 已提交
436
int acpi_bus_register_driver(struct acpi_driver *driver);
437
void acpi_bus_unregister_driver(struct acpi_driver *driver);
438
int acpi_bus_scan(acpi_handle handle);
439
void acpi_bus_hot_remove_device(void *context);
440
void acpi_bus_trim(struct acpi_device *start);
L
Len Brown 已提交
441
acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
442 443
int acpi_match_device_ids(struct acpi_device *device,
			  const struct acpi_device_id *ids);
L
Linus Torvalds 已提交
444 445 446
int acpi_create_dir(struct acpi_device *);
void acpi_remove_dir(struct acpi_device *);

447 448 449 450 451 452 453 454 455 456 457 458 459

/**
 * 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)

460 461 462 463
/*
 * Bind physical devices with ACPI devices
 */
struct acpi_bus_type {
L
Len Brown 已提交
464
	struct list_head list;
465 466
	const char *name;
	bool (*match)(struct device *dev);
L
Len Brown 已提交
467
	int (*find_device) (struct device *, acpi_handle *);
468 469
	void (*setup)(struct device *);
	void (*cleanup)(struct device *);
470 471 472
};
int register_acpi_bus_type(struct acpi_bus_type *);
int unregister_acpi_bus_type(struct acpi_bus_type *);
473

474 475 476 477 478
struct acpi_pci_root {
	struct list_head node;
	struct acpi_device * device;
	struct pci_bus *bus;
	u16 segment;
479
	struct resource secondary;	/* downstream bus range */
480 481 482

	u32 osc_support_set;	/* _OSC state of support bits */
	u32 osc_control_set;	/* _OSC state of control bits */
483
	phys_addr_t mcfg_addr;
484 485
};

486
/* helper */
L
Lin Ming 已提交
487
acpi_handle acpi_get_child(acpi_handle, u64);
488
int acpi_is_root_bridge(acpi_handle);
489
struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);
490
#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)ACPI_HANDLE(dev))
491

492 493 494
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 已提交
495
#ifdef CONFIG_PM
496 497 498 499
acpi_status acpi_add_pm_notifier(struct acpi_device *adev,
				 acpi_notify_handler handler, void *context);
acpi_status acpi_remove_pm_notifier(struct acpi_device *adev,
				    acpi_notify_handler handler);
500 501
int acpi_device_power_state(struct device *dev, struct acpi_device *adev,
			    u32 target_state, int d_max_in, int *d_min_p);
502
int acpi_pm_device_sleep_state(struct device *, int *, int);
503 504
void acpi_dev_pm_add_dependent(acpi_handle handle, struct device *depdev);
void acpi_dev_pm_remove_dependent(acpi_handle handle, struct device *depdev);
505
#else
506 507 508 509 510 511 512 513 514 515 516
static inline acpi_status acpi_add_pm_notifier(struct acpi_device *adev,
					       acpi_notify_handler handler,
					       void *context)
{
	return AE_SUPPORT;
}
static inline acpi_status acpi_remove_pm_notifier(struct acpi_device *adev,
						  acpi_notify_handler handler)
{
	return AE_SUPPORT;
}
517
static inline int __acpi_device_power_state(int m, int *p)
518 519 520
{
	if (p)
		*p = ACPI_STATE_D0;
521
	return (m >= ACPI_STATE_D0 && m <= ACPI_STATE_D3) ? m : ACPI_STATE_D0;
522
}
523 524 525 526 527 528 529 530 531 532 533
static inline int acpi_device_power_state(struct device *dev,
					  struct acpi_device *adev,
					  u32 target_state, int d_max_in,
					  int *d_min_p)
{
	return __acpi_device_power_state(d_max_in, d_min_p);
}
static inline int acpi_pm_device_sleep_state(struct device *d, int *p, int m)
{
	return __acpi_device_power_state(m, p);
}
534 535 536 537
static inline void acpi_dev_pm_add_dependent(acpi_handle handle,
					     struct device *depdev) {}
static inline void acpi_dev_pm_remove_dependent(acpi_handle handle,
						struct device *depdev) {}
538 539
#endif

540
#ifdef CONFIG_PM_RUNTIME
541
int __acpi_device_run_wake(struct acpi_device *, bool);
542
int acpi_pm_device_run_wake(struct device *, bool);
543
#else
544 545 546 547
static inline int __acpi_device_run_wake(struct acpi_device *adev, bool en)
{
	return -ENODEV;
}
548 549 550 551
static inline int acpi_pm_device_run_wake(struct device *dev, bool enable)
{
	return -ENODEV;
}
552 553 554
#endif

#ifdef CONFIG_PM_SLEEP
555
int __acpi_device_sleep_wake(struct acpi_device *, u32, bool);
556 557
int acpi_pm_device_sleep_wake(struct device *, bool);
#else
558 559 560 561 562
static inline int __acpi_device_sleep_wake(struct acpi_device *adev,
					   u32 target_state, bool enable)
{
	return -ENODEV;
}
563 564 565 566
static inline int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
{
	return -ENODEV;
}
567
#endif
568

569 570 571 572 573 574
#ifdef CONFIG_ACPI_SLEEP
u32 acpi_target_system_state(void);
#else
static inline u32 acpi_target_system_state(void) { return ACPI_STATE_S0; }
#endif

575 576 577 578 579 580 581 582 583 584
static inline bool acpi_device_power_manageable(struct acpi_device *adev)
{
	return adev->flags.power_manageable;
}

static inline bool acpi_device_can_wakeup(struct acpi_device *adev)
{
	return adev->wakeup.flags.valid;
}

585 586 587 588 589
static inline bool acpi_device_can_poweroff(struct acpi_device *adev)
{
	return adev->power.states[ACPI_STATE_D3_COLD].flags.os_accessible;
}

590 591
#else	/* CONFIG_ACPI */

592 593
static inline int register_acpi_bus_type(void *bus) { return 0; }
static inline int unregister_acpi_bus_type(void *bus) { return 0; }
594

L
Len Brown 已提交
595
#endif				/* CONFIG_ACPI */
L
Linus Torvalds 已提交
596 597

#endif /*__ACPI_BUS_H__*/