acpi_bus.h 12.6 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);
L
Linus Torvalds 已提交
53

M
Matthew Garrett 已提交
54 55 56 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
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 已提交
85
#ifdef CONFIG_ACPI
L
Linus Torvalds 已提交
86 87 88 89

#include <linux/proc_fs.h>

#define ACPI_BUS_FILE_ROOT	"acpi"
L
Len Brown 已提交
90
extern struct proc_dir_entry *acpi_root_dir;
L
Linus Torvalds 已提交
91 92

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

enum acpi_bus_device_type {
L
Len Brown 已提交
100
	ACPI_BUS_TYPE_DEVICE = 0,
L
Linus Torvalds 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
	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 已提交
117 118 119
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 已提交
120 121
typedef int (*acpi_op_suspend) (struct acpi_device * device,
				pm_message_t state);
122
typedef int (*acpi_op_resume) (struct acpi_device * device);
L
Len Brown 已提交
123 124
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 138 139
	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;
140
	acpi_op_notify notify;
L
Linus Torvalds 已提交
141 142
};

143 144
#define ACPI_DRIVER_ALL_NOTIFY_EVENTS	0x1	/* system AND device events */

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

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

/* Status (_STA) */

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

/* Flags */

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

/* File System */

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

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

/* Plug and Play */

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

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

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

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

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

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

/* Performance Management */

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

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

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

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

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

/* Device */

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

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

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

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

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

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

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

extern int register_acpi_bus_notifier(struct notifier_block *nb);
extern void unregister_acpi_bus_notifier(struct notifier_block *nb);
L
Linus Torvalds 已提交
344 345 346 347 348
/*
 * External Functions
 */

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

379 380 381 382
/*
 * Bind physical devices with ACPI devices
 */
struct acpi_bus_type {
L
Len Brown 已提交
383 384 385 386
	struct list_head list;
	struct bus_type *bus;
	/* For general devices under the bus */
	int (*find_device) (struct device *, acpi_handle *);
387
	/* For bridges, such as PCI root bridge, IDE controller */
L
Len Brown 已提交
388
	int (*find_bridge) (struct device *, acpi_handle *);
389 390 391 392
};
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);
393

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

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

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

413 414 415
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 已提交
416
#ifdef CONFIG_PM
417
int acpi_pm_device_sleep_state(struct device *, int *);
418
#else
419
static inline int acpi_pm_device_sleep_state(struct device *d, int *p)
420 421 422 423 424
{
	if (p)
		*p = ACPI_STATE_D0;
	return ACPI_STATE_D3;
}
425 426 427
#endif

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

441 442
#else	/* CONFIG_ACPI */

443 444
static inline int register_acpi_bus_type(void *bus) { return 0; }
static inline int unregister_acpi_bus_type(void *bus) { return 0; }
445

L
Len Brown 已提交
446
#endif				/* CONFIG_ACPI */
L
Linus Torvalds 已提交
447 448

#endif /*__ACPI_BUS_H__*/