xref: /openbmc/linux/include/acpi/acpi_bus.h (revision 1da177e4)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  *  acpi_bus.h - ACPI Bus Driver ($Revision: 22 $)
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
51da177e4SLinus Torvalds  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81da177e4SLinus Torvalds  *
91da177e4SLinus Torvalds  *  This program is free software; you can redistribute it and/or modify
101da177e4SLinus Torvalds  *  it under the terms of the GNU General Public License as published by
111da177e4SLinus Torvalds  *  the Free Software Foundation; either version 2 of the License, or (at
121da177e4SLinus Torvalds  *  your option) any later version.
131da177e4SLinus Torvalds  *
141da177e4SLinus Torvalds  *  This program is distributed in the hope that it will be useful, but
151da177e4SLinus Torvalds  *  WITHOUT ANY WARRANTY; without even the implied warranty of
161da177e4SLinus Torvalds  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
171da177e4SLinus Torvalds  *  General Public License for more details.
181da177e4SLinus Torvalds  *
191da177e4SLinus Torvalds  *  You should have received a copy of the GNU General Public License along
201da177e4SLinus Torvalds  *  with this program; if not, write to the Free Software Foundation, Inc.,
211da177e4SLinus Torvalds  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
221da177e4SLinus Torvalds  *
231da177e4SLinus Torvalds  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
241da177e4SLinus Torvalds  */
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds #ifndef __ACPI_BUS_H__
271da177e4SLinus Torvalds #define __ACPI_BUS_H__
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds #include <linux/kobject.h>
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds #include <acpi/acpi.h>
321da177e4SLinus Torvalds 
331da177e4SLinus Torvalds #define PREFIX			"ACPI: "
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds /* TBD: Make dynamic */
361da177e4SLinus Torvalds #define ACPI_MAX_HANDLES	10
371da177e4SLinus Torvalds struct acpi_handle_list {
381da177e4SLinus Torvalds 	u32			count;
391da177e4SLinus Torvalds 	acpi_handle		handles[ACPI_MAX_HANDLES];
401da177e4SLinus Torvalds };
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds 
431da177e4SLinus Torvalds /* acpi_utils.h */
441da177e4SLinus Torvalds acpi_status
451da177e4SLinus Torvalds acpi_extract_package (
461da177e4SLinus Torvalds 	union acpi_object       *package,
471da177e4SLinus Torvalds 	struct acpi_buffer      *format,
481da177e4SLinus Torvalds 	struct acpi_buffer      *buffer);
491da177e4SLinus Torvalds acpi_status
501da177e4SLinus Torvalds acpi_evaluate_integer (
511da177e4SLinus Torvalds 	acpi_handle             handle,
521da177e4SLinus Torvalds 	acpi_string             pathname,
531da177e4SLinus Torvalds 	struct acpi_object_list *arguments,
541da177e4SLinus Torvalds 	unsigned long           *data);
551da177e4SLinus Torvalds acpi_status
561da177e4SLinus Torvalds acpi_evaluate_reference (
571da177e4SLinus Torvalds 	acpi_handle             handle,
581da177e4SLinus Torvalds 	acpi_string             pathname,
591da177e4SLinus Torvalds 	struct acpi_object_list *arguments,
601da177e4SLinus Torvalds 	struct acpi_handle_list *list);
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds 
631da177e4SLinus Torvalds #ifdef CONFIG_ACPI_BUS
641da177e4SLinus Torvalds 
651da177e4SLinus Torvalds #include <linux/proc_fs.h>
661da177e4SLinus Torvalds 
671da177e4SLinus Torvalds #define ACPI_BUS_FILE_ROOT	"acpi"
681da177e4SLinus Torvalds extern struct proc_dir_entry	*acpi_root_dir;
691da177e4SLinus Torvalds extern FADT_DESCRIPTOR		acpi_fadt;
701da177e4SLinus Torvalds 
711da177e4SLinus Torvalds enum acpi_bus_removal_type {
721da177e4SLinus Torvalds 	ACPI_BUS_REMOVAL_NORMAL	= 0,
731da177e4SLinus Torvalds 	ACPI_BUS_REMOVAL_EJECT,
741da177e4SLinus Torvalds 	ACPI_BUS_REMOVAL_SUPRISE,
751da177e4SLinus Torvalds 	ACPI_BUS_REMOVAL_TYPE_COUNT
761da177e4SLinus Torvalds };
771da177e4SLinus Torvalds 
781da177e4SLinus Torvalds enum acpi_bus_device_type {
791da177e4SLinus Torvalds 	ACPI_BUS_TYPE_DEVICE	= 0,
801da177e4SLinus Torvalds 	ACPI_BUS_TYPE_POWER,
811da177e4SLinus Torvalds 	ACPI_BUS_TYPE_PROCESSOR,
821da177e4SLinus Torvalds 	ACPI_BUS_TYPE_THERMAL,
831da177e4SLinus Torvalds 	ACPI_BUS_TYPE_SYSTEM,
841da177e4SLinus Torvalds 	ACPI_BUS_TYPE_POWER_BUTTON,
851da177e4SLinus Torvalds 	ACPI_BUS_TYPE_SLEEP_BUTTON,
861da177e4SLinus Torvalds 	ACPI_BUS_DEVICE_TYPE_COUNT
871da177e4SLinus Torvalds };
881da177e4SLinus Torvalds 
891da177e4SLinus Torvalds struct acpi_driver;
901da177e4SLinus Torvalds struct acpi_device;
911da177e4SLinus Torvalds 
921da177e4SLinus Torvalds 
931da177e4SLinus Torvalds /*
941da177e4SLinus Torvalds  * ACPI Driver
951da177e4SLinus Torvalds  * -----------
961da177e4SLinus Torvalds  */
971da177e4SLinus Torvalds 
981da177e4SLinus Torvalds typedef int (*acpi_op_add)	(struct acpi_device *device);
991da177e4SLinus Torvalds typedef int (*acpi_op_remove)	(struct acpi_device *device, int type);
1001da177e4SLinus Torvalds typedef int (*acpi_op_lock)	(struct acpi_device *device, int type);
1011da177e4SLinus Torvalds typedef int (*acpi_op_start)	(struct acpi_device *device);
1021da177e4SLinus Torvalds typedef int (*acpi_op_stop)	(struct acpi_device *device, int type);
1031da177e4SLinus Torvalds typedef int (*acpi_op_suspend)	(struct acpi_device *device, int state);
1041da177e4SLinus Torvalds typedef int (*acpi_op_resume)	(struct acpi_device *device, int state);
1051da177e4SLinus Torvalds typedef int (*acpi_op_scan)	(struct acpi_device *device);
1061da177e4SLinus Torvalds typedef int (*acpi_op_bind)	(struct acpi_device *device);
1071da177e4SLinus Torvalds typedef int (*acpi_op_unbind)	(struct acpi_device *device);
1081da177e4SLinus Torvalds typedef int (*acpi_op_match)	(struct acpi_device *device,
1091da177e4SLinus Torvalds 				 struct acpi_driver *driver);
1101da177e4SLinus Torvalds 
1111da177e4SLinus Torvalds struct acpi_device_ops {
1121da177e4SLinus Torvalds 	acpi_op_add		add;
1131da177e4SLinus Torvalds 	acpi_op_remove		remove;
1141da177e4SLinus Torvalds 	acpi_op_lock		lock;
1151da177e4SLinus Torvalds 	acpi_op_start		start;
1161da177e4SLinus Torvalds 	acpi_op_stop		stop;
1171da177e4SLinus Torvalds 	acpi_op_suspend		suspend;
1181da177e4SLinus Torvalds 	acpi_op_resume		resume;
1191da177e4SLinus Torvalds 	acpi_op_scan		scan;
1201da177e4SLinus Torvalds 	acpi_op_bind		bind;
1211da177e4SLinus Torvalds 	acpi_op_unbind		unbind;
1221da177e4SLinus Torvalds 	acpi_op_match		match;
1231da177e4SLinus Torvalds };
1241da177e4SLinus Torvalds 
1251da177e4SLinus Torvalds struct acpi_driver {
1261da177e4SLinus Torvalds 	struct list_head	node;
1271da177e4SLinus Torvalds 	char			name[80];
1281da177e4SLinus Torvalds 	char			class[80];
1291da177e4SLinus Torvalds 	atomic_t		references;
1301da177e4SLinus Torvalds 	char			*ids;		/* Supported Hardware IDs */
1311da177e4SLinus Torvalds 	struct acpi_device_ops	ops;
1321da177e4SLinus Torvalds };
1331da177e4SLinus Torvalds 
1341da177e4SLinus Torvalds /*
1351da177e4SLinus Torvalds  * ACPI Device
1361da177e4SLinus Torvalds  * -----------
1371da177e4SLinus Torvalds  */
1381da177e4SLinus Torvalds 
1391da177e4SLinus Torvalds /* Status (_STA) */
1401da177e4SLinus Torvalds 
1411da177e4SLinus Torvalds struct acpi_device_status {
1421da177e4SLinus Torvalds 	u32			present:1;
1431da177e4SLinus Torvalds 	u32			enabled:1;
1441da177e4SLinus Torvalds 	u32			show_in_ui:1;
1451da177e4SLinus Torvalds 	u32			functional:1;
1461da177e4SLinus Torvalds 	u32			battery_present:1;
1471da177e4SLinus Torvalds 	u32			reserved:27;
1481da177e4SLinus Torvalds };
1491da177e4SLinus Torvalds 
1501da177e4SLinus Torvalds 
1511da177e4SLinus Torvalds /* Flags */
1521da177e4SLinus Torvalds 
1531da177e4SLinus Torvalds struct acpi_device_flags {
1541da177e4SLinus Torvalds 	u32			dynamic_status:1;
1551da177e4SLinus Torvalds 	u32			hardware_id:1;
1561da177e4SLinus Torvalds 	u32			compatible_ids:1;
1571da177e4SLinus Torvalds 	u32			bus_address:1;
1581da177e4SLinus Torvalds 	u32			unique_id:1;
1591da177e4SLinus Torvalds 	u32			removable:1;
1601da177e4SLinus Torvalds 	u32			ejectable:1;
1611da177e4SLinus Torvalds 	u32			lockable:1;
1621da177e4SLinus Torvalds 	u32			suprise_removal_ok:1;
1631da177e4SLinus Torvalds 	u32			power_manageable:1;
1641da177e4SLinus Torvalds 	u32			performance_manageable:1;
1651da177e4SLinus Torvalds 	u32			wake_capable:1; /* Wakeup(_PRW) supported? */
1661da177e4SLinus Torvalds 	u32			reserved:20;
1671da177e4SLinus Torvalds };
1681da177e4SLinus Torvalds 
1691da177e4SLinus Torvalds 
1701da177e4SLinus Torvalds /* File System */
1711da177e4SLinus Torvalds 
1721da177e4SLinus Torvalds struct acpi_device_dir {
1731da177e4SLinus Torvalds 	struct proc_dir_entry	*entry;
1741da177e4SLinus Torvalds };
1751da177e4SLinus Torvalds 
1761da177e4SLinus Torvalds #define acpi_device_dir(d)	((d)->dir.entry)
1771da177e4SLinus Torvalds 
1781da177e4SLinus Torvalds 
1791da177e4SLinus Torvalds /* Plug and Play */
1801da177e4SLinus Torvalds 
1811da177e4SLinus Torvalds typedef char			acpi_bus_id[5];
1821da177e4SLinus Torvalds typedef unsigned long		acpi_bus_address;
1831da177e4SLinus Torvalds typedef char			acpi_hardware_id[9];
1841da177e4SLinus Torvalds typedef char			acpi_unique_id[9];
1851da177e4SLinus Torvalds typedef char			acpi_device_name[40];
1861da177e4SLinus Torvalds typedef char			acpi_device_class[20];
1871da177e4SLinus Torvalds 
1881da177e4SLinus Torvalds struct acpi_device_pnp {
1891da177e4SLinus Torvalds 	acpi_bus_id		bus_id;		               /* Object name */
1901da177e4SLinus Torvalds 	acpi_bus_address	bus_address;	                      /* _ADR */
1911da177e4SLinus Torvalds 	acpi_hardware_id	hardware_id;	                      /* _HID */
1921da177e4SLinus Torvalds 	struct acpi_compatible_id_list *cid_list;		     /* _CIDs */
1931da177e4SLinus Torvalds 	acpi_unique_id		unique_id;	                      /* _UID */
1941da177e4SLinus Torvalds 	acpi_device_name	device_name;	         /* Driver-determined */
1951da177e4SLinus Torvalds 	acpi_device_class	device_class;	         /*        "          */
1961da177e4SLinus Torvalds };
1971da177e4SLinus Torvalds 
1981da177e4SLinus Torvalds #define acpi_device_bid(d)	((d)->pnp.bus_id)
1991da177e4SLinus Torvalds #define acpi_device_adr(d)	((d)->pnp.bus_address)
2001da177e4SLinus Torvalds #define acpi_device_hid(d)	((d)->pnp.hardware_id)
2011da177e4SLinus Torvalds #define acpi_device_uid(d)	((d)->pnp.unique_id)
2021da177e4SLinus Torvalds #define acpi_device_name(d)	((d)->pnp.device_name)
2031da177e4SLinus Torvalds #define acpi_device_class(d)	((d)->pnp.device_class)
2041da177e4SLinus Torvalds 
2051da177e4SLinus Torvalds 
2061da177e4SLinus Torvalds /* Power Management */
2071da177e4SLinus Torvalds 
2081da177e4SLinus Torvalds struct acpi_device_power_flags {
2091da177e4SLinus Torvalds 	u32			explicit_get:1;		     /* _PSC present? */
2101da177e4SLinus Torvalds 	u32			power_resources:1;	   /* Power resources */
2111da177e4SLinus Torvalds 	u32			inrush_current:1;	  /* Serialize Dx->D0 */
2121da177e4SLinus Torvalds 	u32			power_removed:1;	   /* Optimize Dx->D0 */
2131da177e4SLinus Torvalds 	u32			reserved:28;
2141da177e4SLinus Torvalds };
2151da177e4SLinus Torvalds 
2161da177e4SLinus Torvalds struct acpi_device_power_state {
2171da177e4SLinus Torvalds 	struct {
2181da177e4SLinus Torvalds 		u8			valid:1;
2191da177e4SLinus Torvalds 		u8			explicit_set:1;	     /* _PSx present? */
2201da177e4SLinus Torvalds 		u8			reserved:6;
2211da177e4SLinus Torvalds 	}			flags;
2221da177e4SLinus Torvalds 	int			power;		  /* % Power (compared to D0) */
2231da177e4SLinus Torvalds 	int			latency;	/* Dx->D0 time (microseconds) */
2241da177e4SLinus Torvalds 	struct acpi_handle_list	resources;	/* Power resources referenced */
2251da177e4SLinus Torvalds };
2261da177e4SLinus Torvalds 
2271da177e4SLinus Torvalds struct acpi_device_power {
2281da177e4SLinus Torvalds 	int			state;		             /* Current state */
2291da177e4SLinus Torvalds 	struct acpi_device_power_flags flags;
2301da177e4SLinus Torvalds 	struct acpi_device_power_state states[4];     /* Power states (D0-D3) */
2311da177e4SLinus Torvalds };
2321da177e4SLinus Torvalds 
2331da177e4SLinus Torvalds 
2341da177e4SLinus Torvalds /* Performance Management */
2351da177e4SLinus Torvalds 
2361da177e4SLinus Torvalds struct acpi_device_perf_flags {
2371da177e4SLinus Torvalds 	u8			reserved:8;
2381da177e4SLinus Torvalds };
2391da177e4SLinus Torvalds 
2401da177e4SLinus Torvalds struct acpi_device_perf_state {
2411da177e4SLinus Torvalds 	struct {
2421da177e4SLinus Torvalds 		u8			valid:1;
2431da177e4SLinus Torvalds 		u8			reserved:7;
2441da177e4SLinus Torvalds 	}			flags;
2451da177e4SLinus Torvalds 	u8			power;		  /* % Power (compared to P0) */
2461da177e4SLinus Torvalds 	u8			performance;	  /* % Performance (    "   ) */
2471da177e4SLinus Torvalds 	int			latency;	/* Px->P0 time (microseconds) */
2481da177e4SLinus Torvalds };
2491da177e4SLinus Torvalds 
2501da177e4SLinus Torvalds struct acpi_device_perf {
2511da177e4SLinus Torvalds 	int			state;
2521da177e4SLinus Torvalds 	struct acpi_device_perf_flags flags;
2531da177e4SLinus Torvalds 	int			state_count;
2541da177e4SLinus Torvalds 	struct acpi_device_perf_state *states;
2551da177e4SLinus Torvalds };
2561da177e4SLinus Torvalds 
2571da177e4SLinus Torvalds /* Wakeup Management */
2581da177e4SLinus Torvalds struct acpi_device_wakeup_flags {
2591da177e4SLinus Torvalds 	u8	valid:1; /* Can successfully enable wakeup? */
2601da177e4SLinus Torvalds 	u8	run_wake:1; /* Run-Wake GPE devices */
2611da177e4SLinus Torvalds };
2621da177e4SLinus Torvalds 
2631da177e4SLinus Torvalds struct acpi_device_wakeup_state {
2641da177e4SLinus Torvalds 	u8	enabled:1;
2651da177e4SLinus Torvalds 	u8	active:1;
2661da177e4SLinus Torvalds };
2671da177e4SLinus Torvalds 
2681da177e4SLinus Torvalds struct acpi_device_wakeup {
2691da177e4SLinus Torvalds 	acpi_handle		gpe_device;
2701da177e4SLinus Torvalds 	acpi_integer		gpe_number;;
2711da177e4SLinus Torvalds 	acpi_integer		sleep_state;
2721da177e4SLinus Torvalds 	struct acpi_handle_list	resources;
2731da177e4SLinus Torvalds 	struct acpi_device_wakeup_state	state;
2741da177e4SLinus Torvalds 	struct acpi_device_wakeup_flags	flags;
2751da177e4SLinus Torvalds };
2761da177e4SLinus Torvalds 
2771da177e4SLinus Torvalds /* Device */
2781da177e4SLinus Torvalds 
2791da177e4SLinus Torvalds struct acpi_device {
2801da177e4SLinus Torvalds 	acpi_handle		handle;
2811da177e4SLinus Torvalds 	struct acpi_device	*parent;
2821da177e4SLinus Torvalds 	struct list_head	children;
2831da177e4SLinus Torvalds 	struct list_head	node;
2841da177e4SLinus Torvalds 	struct list_head	wakeup_list;
2851da177e4SLinus Torvalds 	struct list_head	g_list;
2861da177e4SLinus Torvalds 	struct acpi_device_status status;
2871da177e4SLinus Torvalds 	struct acpi_device_flags flags;
2881da177e4SLinus Torvalds 	struct acpi_device_pnp	pnp;
2891da177e4SLinus Torvalds 	struct acpi_device_power power;
2901da177e4SLinus Torvalds 	struct acpi_device_wakeup wakeup;
2911da177e4SLinus Torvalds 	struct acpi_device_perf	performance;
2921da177e4SLinus Torvalds 	struct acpi_device_dir	dir;
2931da177e4SLinus Torvalds 	struct acpi_device_ops	ops;
2941da177e4SLinus Torvalds 	struct acpi_driver	*driver;
2951da177e4SLinus Torvalds 	void			*driver_data;
2961da177e4SLinus Torvalds 	struct kobject		kobj;
2971da177e4SLinus Torvalds };
2981da177e4SLinus Torvalds 
2991da177e4SLinus Torvalds #define acpi_driver_data(d)	((d)->driver_data)
3001da177e4SLinus Torvalds 
3011da177e4SLinus Torvalds 
3021da177e4SLinus Torvalds /*
3031da177e4SLinus Torvalds  * Events
3041da177e4SLinus Torvalds  * ------
3051da177e4SLinus Torvalds  */
3061da177e4SLinus Torvalds 
3071da177e4SLinus Torvalds struct acpi_bus_event {
3081da177e4SLinus Torvalds 	struct list_head	node;
3091da177e4SLinus Torvalds 	acpi_device_class	device_class;
3101da177e4SLinus Torvalds 	acpi_bus_id		bus_id;
3111da177e4SLinus Torvalds 	u32			type;
3121da177e4SLinus Torvalds 	u32			data;
3131da177e4SLinus Torvalds };
3141da177e4SLinus Torvalds 
3151da177e4SLinus Torvalds extern struct subsystem acpi_subsys;
3161da177e4SLinus Torvalds 
3171da177e4SLinus Torvalds /*
3181da177e4SLinus Torvalds  * External Functions
3191da177e4SLinus Torvalds  */
3201da177e4SLinus Torvalds 
3211da177e4SLinus Torvalds int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device);
3221da177e4SLinus Torvalds void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context);
3231da177e4SLinus Torvalds int acpi_bus_get_status (struct acpi_device *device);
3241da177e4SLinus Torvalds int acpi_bus_get_power (acpi_handle handle, int *state);
3251da177e4SLinus Torvalds int acpi_bus_set_power (acpi_handle handle, int state);
3261da177e4SLinus Torvalds int acpi_bus_generate_event (struct acpi_device *device, u8 type, int data);
3271da177e4SLinus Torvalds int acpi_bus_receive_event (struct acpi_bus_event *event);
3281da177e4SLinus Torvalds int acpi_bus_register_driver (struct acpi_driver *driver);
3291da177e4SLinus Torvalds int acpi_bus_unregister_driver (struct acpi_driver *driver);
3301da177e4SLinus Torvalds int acpi_bus_scan (struct acpi_device *start);
3311da177e4SLinus Torvalds int acpi_bus_add (struct acpi_device **child, struct acpi_device *parent,
3321da177e4SLinus Torvalds 		acpi_handle handle, int type);
3331da177e4SLinus Torvalds 
3341da177e4SLinus Torvalds 
3351da177e4SLinus Torvalds int acpi_match_ids (struct acpi_device	*device, char	*ids);
3361da177e4SLinus Torvalds int acpi_create_dir(struct acpi_device *);
3371da177e4SLinus Torvalds void acpi_remove_dir(struct acpi_device *);
3381da177e4SLinus Torvalds 
3391da177e4SLinus Torvalds #endif /*CONFIG_ACPI_BUS*/
3401da177e4SLinus Torvalds 
3411da177e4SLinus Torvalds #endif /*__ACPI_BUS_H__*/
342