2005-04-17 02:20:36 +04:00
/*
* 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__
2006-05-10 18:33:00 +04:00
# include <linux/device.h>
2005-04-17 02:20:36 +04:00
# include <acpi/acpi.h>
/* TBD: Make dynamic */
# define ACPI_MAX_HANDLES 10
struct acpi_handle_list {
2005-08-05 08:44:28 +04:00
u32 count ;
acpi_handle handles [ ACPI_MAX_HANDLES ] ;
2005-04-17 02:20:36 +04:00
} ;
/* acpi_utils.h */
acpi_status
2005-08-05 08:44:28 +04:00
acpi_extract_package ( union acpi_object * package ,
struct acpi_buffer * format , struct acpi_buffer * buffer ) ;
2005-04-17 02:20:36 +04:00
acpi_status
2005-08-05 08:44:28 +04:00
acpi_evaluate_integer ( acpi_handle handle ,
acpi_string pathname ,
2008-10-10 10:22:59 +04:00
struct acpi_object_list * arguments , unsigned long long * data ) ;
2005-04-17 02:20:36 +04:00
acpi_status
2005-08-05 08:44:28 +04:00
acpi_evaluate_reference ( acpi_handle handle ,
acpi_string pathname ,
struct acpi_object_list * arguments ,
struct acpi_handle_list * list ) ;
2005-04-17 02:20:36 +04:00
2005-08-24 20:10:49 +04:00
# ifdef CONFIG_ACPI
2005-04-17 02:20:36 +04:00
# include <linux/proc_fs.h>
# define ACPI_BUS_FILE_ROOT "acpi"
2005-08-05 08:44:28 +04:00
extern struct proc_dir_entry * acpi_root_dir ;
2005-04-17 02:20:36 +04:00
enum acpi_bus_removal_type {
2005-08-05 08:44:28 +04:00
ACPI_BUS_REMOVAL_NORMAL = 0 ,
2005-04-17 02:20:36 +04:00
ACPI_BUS_REMOVAL_EJECT ,
ACPI_BUS_REMOVAL_SUPRISE ,
ACPI_BUS_REMOVAL_TYPE_COUNT
} ;
enum acpi_bus_device_type {
2005-08-05 08:44:28 +04:00
ACPI_BUS_TYPE_DEVICE = 0 ,
2005-04-17 02:20:36 +04:00
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
* - - - - - - - - - - -
*/
2005-08-05 08:44:28 +04:00
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 ) ;
2007-05-10 07:34:35 +04:00
typedef int ( * acpi_op_suspend ) ( struct acpi_device * device ,
pm_message_t state ) ;
2006-12-07 15:56:27 +03:00
typedef int ( * acpi_op_resume ) ( struct acpi_device * device ) ;
2005-08-05 08:44:28 +04:00
typedef int ( * acpi_op_bind ) ( struct acpi_device * device ) ;
typedef int ( * acpi_op_unbind ) ( struct acpi_device * device ) ;
2009-03-30 21:48:13 +04:00
typedef void ( * acpi_op_notify ) ( struct acpi_device * device , u32 event ) ;
2005-04-17 02:20:36 +04:00
2005-04-28 11:25:52 +04:00
struct acpi_bus_ops {
2005-08-05 08:44:28 +04:00
u32 acpi_op_add : 1 ;
u32 acpi_op_start : 1 ;
2005-04-28 11:25:52 +04:00
} ;
2005-04-17 02:20:36 +04:00
struct acpi_device_ops {
2005-08-05 08:44:28 +04:00
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 ;
2009-03-30 21:48:13 +04:00
acpi_op_notify notify ;
2005-04-17 02:20:36 +04:00
} ;
2009-04-30 19:35:37 +04:00
# define ACPI_DRIVER_ALL_NOTIFY_EVENTS 0x1 /* system AND device events */
2005-04-17 02:20:36 +04:00
struct acpi_driver {
2005-08-05 08:44:28 +04:00
char name [ 80 ] ;
char class [ 80 ] ;
2007-07-23 16:43:32 +04:00
const struct acpi_device_id * ids ; /* Supported Hardware IDs */
2009-04-30 19:35:37 +04:00
unsigned int flags ;
2005-08-05 08:44:28 +04:00
struct acpi_device_ops ops ;
2006-12-07 15:56:23 +03:00
struct device_driver drv ;
2006-12-07 15:56:31 +03:00
struct module * owner ;
2005-04-17 02:20:36 +04:00
} ;
/*
* ACPI Device
* - - - - - - - - - - -
*/
/* Status (_STA) */
struct acpi_device_status {
2005-08-05 08:44:28 +04:00
u32 present : 1 ;
u32 enabled : 1 ;
u32 show_in_ui : 1 ;
u32 functional : 1 ;
u32 battery_present : 1 ;
u32 reserved : 27 ;
2005-04-17 02:20:36 +04:00
} ;
/* Flags */
struct acpi_device_flags {
2005-08-05 08:44:28 +04:00
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 ;
u32 wake_capable : 1 ; /* Wakeup(_PRW) supported? */
2008-01-24 06:41:20 +03:00
u32 force_power_state : 1 ;
2009-09-21 23:35:35 +04:00
u32 reserved : 22 ;
2005-04-17 02:20:36 +04:00
} ;
/* File System */
struct acpi_device_dir {
2005-08-05 08:44:28 +04:00
struct proc_dir_entry * entry ;
2005-04-17 02:20:36 +04:00
} ;
# define acpi_device_dir(d) ((d)->dir.entry)
/* Plug and Play */
2009-05-21 12:25:35 +04:00
typedef char acpi_bus_id [ 8 ] ;
2005-08-05 08:44:28 +04:00
typedef unsigned long acpi_bus_address ;
typedef char acpi_device_name [ 40 ] ;
typedef char acpi_device_class [ 20 ] ;
2005-04-17 02:20:36 +04:00
2009-09-21 23:35:19 +04:00
struct acpi_hardware_id {
struct list_head list ;
char * id ;
} ;
2005-04-17 02:20:36 +04:00
struct acpi_device_pnp {
2005-08-05 08:44:28 +04:00
acpi_bus_id bus_id ; /* Object name */
acpi_bus_address bus_address ; /* _ADR */
2009-06-29 09:39:29 +04:00
char * unique_id ; /* _UID */
2009-09-21 23:35:19 +04:00
struct list_head ids ; /* _HID and _CIDs */
2005-08-05 08:44:28 +04:00
acpi_device_name device_name ; /* Driver-determined */
acpi_device_class device_class ; /* " */
2005-04-17 02:20:36 +04:00
} ;
# define acpi_device_bid(d) ((d)->pnp.bus_id)
# define acpi_device_adr(d) ((d)->pnp.bus_address)
2009-09-21 23:35:19 +04:00
char * acpi_device_hid ( struct acpi_device * device ) ;
2005-04-17 02:20:36 +04:00
# 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 {
2005-08-05 08:44:28 +04:00
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 ;
2005-04-17 02:20:36 +04:00
} ;
struct acpi_device_power_state {
struct {
2005-08-05 08:44:28 +04:00
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 */
2005-04-17 02:20:36 +04:00
} ;
struct acpi_device_power {
2005-08-05 08:44:28 +04:00
int state ; /* Current state */
2005-04-17 02:20:36 +04:00
struct acpi_device_power_flags flags ;
2005-08-05 08:44:28 +04:00
struct acpi_device_power_state states [ 4 ] ; /* Power states (D0-D3) */
2005-04-17 02:20:36 +04:00
} ;
/* Performance Management */
struct acpi_device_perf_flags {
2005-08-05 08:44:28 +04:00
u8 reserved : 8 ;
2005-04-17 02:20:36 +04:00
} ;
struct acpi_device_perf_state {
struct {
2005-08-05 08:44:28 +04:00
u8 valid : 1 ;
u8 reserved : 7 ;
} flags ;
u8 power ; /* % Power (compared to P0) */
u8 performance ; /* % Performance ( " ) */
int latency ; /* Px->P0 time (microseconds) */
2005-04-17 02:20:36 +04:00
} ;
struct acpi_device_perf {
2005-08-05 08:44:28 +04:00
int state ;
2005-04-17 02:20:36 +04:00
struct acpi_device_perf_flags flags ;
2005-08-05 08:44:28 +04:00
int state_count ;
2005-04-17 02:20:36 +04:00
struct acpi_device_perf_state * states ;
} ;
/* Wakeup Management */
struct acpi_device_wakeup_flags {
2005-08-05 08:44:28 +04:00
u8 valid : 1 ; /* Can successfully enable wakeup? */
u8 run_wake : 1 ; /* Run-Wake GPE devices */
2010-02-18 01:41:49 +03:00
u8 always_enabled : 1 ; /* Run-wake devices that are always enabled */
2010-02-18 01:44:09 +03:00
u8 notifier_present : 1 ; /* Wake-up notify handler has been installed */
2005-04-17 02:20:36 +04:00
} ;
struct acpi_device_wakeup_state {
2005-08-05 08:44:28 +04:00
u8 enabled : 1 ;
2005-04-17 02:20:36 +04:00
} ;
struct acpi_device_wakeup {
2005-08-05 08:44:28 +04:00
acpi_handle gpe_device ;
2010-01-28 05:53:19 +03:00
u64 gpe_number ;
u64 sleep_state ;
2005-08-05 08:44:28 +04:00
struct acpi_handle_list resources ;
struct acpi_device_wakeup_state state ;
struct acpi_device_wakeup_flags flags ;
2009-09-09 01:15:31 +04:00
int prepare_count ;
2010-02-18 01:41:49 +03:00
int run_wake_count ;
2005-04-17 02:20:36 +04:00
} ;
/* Device */
struct acpi_device {
2009-09-21 23:29:10 +04:00
int device_type ;
acpi_handle handle ; /* no handle for fixed hardware */
2005-08-05 08:44:28 +04:00
struct acpi_device * parent ;
struct list_head children ;
struct list_head node ;
struct list_head wakeup_list ;
2005-04-17 02:20:36 +04:00
struct acpi_device_status status ;
struct acpi_device_flags flags ;
2005-08-05 08:44:28 +04:00
struct acpi_device_pnp pnp ;
2005-04-17 02:20:36 +04:00
struct acpi_device_power power ;
struct acpi_device_wakeup wakeup ;
2005-08-05 08:44:28 +04:00
struct acpi_device_perf performance ;
struct acpi_device_dir dir ;
struct acpi_device_ops ops ;
struct acpi_driver * driver ;
void * driver_data ;
2006-05-10 18:33:00 +04:00
struct device dev ;
2006-12-07 15:56:41 +03:00
struct acpi_bus_ops bus_ops ; /* workaround for different code path for hotplug */
2007-05-10 07:34:35 +04:00
enum acpi_bus_removal_type removal_type ; /* indicate for different removal type */
2005-04-17 02:20:36 +04:00
} ;
2008-09-23 01:37:34 +04:00
static inline void * acpi_driver_data ( struct acpi_device * d )
{
return d - > driver_data ;
}
2006-12-07 15:56:23 +03:00
# define to_acpi_device(d) container_of(d, struct acpi_device, dev)
# define to_acpi_driver(d) container_of(d, struct acpi_driver, drv)
2005-04-17 02:20:36 +04:00
2007-05-08 11:28:35 +04:00
/* acpi_device.dev.bus == &acpi_bus_type */
extern struct bus_type acpi_bus_type ;
2005-04-17 02:20:36 +04:00
/*
* Events
* - - - - - -
*/
struct acpi_bus_event {
2005-08-05 08:44:28 +04:00
struct list_head node ;
acpi_device_class device_class ;
acpi_bus_id bus_id ;
u32 type ;
u32 data ;
2005-04-17 02:20:36 +04:00
} ;
2007-11-03 02:19:59 +03:00
extern struct kobject * acpi_kobj ;
2007-08-22 21:24:31 +04:00
extern int acpi_bus_generate_netlink_event ( const char * , const char * , u8 , int ) ;
2009-06-29 09:43:27 +04:00
void acpi_bus_private_data_handler ( acpi_handle , void * ) ;
2008-01-17 10:51:21 +03:00
int acpi_bus_get_private_data ( acpi_handle , void * * ) ;
2008-01-25 09:48:06 +03:00
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 * ) ;
2008-08-28 06:04:29 +04:00
extern int register_acpi_bus_notifier ( struct notifier_block * nb ) ;
extern void unregister_acpi_bus_notifier ( struct notifier_block * nb ) ;
2005-04-17 02:20:36 +04:00
/*
* External Functions
*/
int acpi_bus_get_device ( acpi_handle handle , struct acpi_device * * device ) ;
2009-06-29 09:43:27 +04:00
void acpi_bus_data_handler ( acpi_handle handle , void * context ) ;
2009-09-21 23:30:01 +04:00
acpi_status acpi_bus_get_status_handle ( acpi_handle handle ,
unsigned long long * sta ) ;
2005-08-05 08:44:28 +04:00
int acpi_bus_get_status ( struct acpi_device * device ) ;
int acpi_bus_get_power ( acpi_handle handle , int * state ) ;
int acpi_bus_set_power ( acpi_handle handle , int state ) ;
2008-07-07 05:30:55 +04:00
bool acpi_bus_power_manageable ( acpi_handle handle ) ;
2008-07-07 05:34:48 +04:00
bool acpi_bus_can_wakeup ( acpi_handle handle ) ;
2007-08-23 23:20:26 +04:00
# ifdef CONFIG_ACPI_PROC_EVENT
int acpi_bus_generate_proc_event ( struct acpi_device * device , u8 type , int data ) ;
2007-09-26 19:43:16 +04:00
int acpi_bus_generate_proc_event4 ( const char * class , const char * bid , u8 type , int data ) ;
2005-08-05 08:44:28 +04:00
int acpi_bus_receive_event ( struct acpi_bus_event * event ) ;
2007-08-23 23:20:26 +04:00
# else
static inline int acpi_bus_generate_proc_event ( struct acpi_device * device , u8 type , int data )
{ return 0 ; }
# endif
2005-08-05 08:44:28 +04:00
int acpi_bus_register_driver ( struct acpi_driver * driver ) ;
2006-04-27 13:25:00 +04:00
void acpi_bus_unregister_driver ( struct acpi_driver * driver ) ;
2005-08-05 08:44:28 +04:00
int acpi_bus_add ( struct acpi_device * * child , struct acpi_device * parent ,
acpi_handle handle , int type ) ;
2006-02-24 04:56:01 +03:00
int acpi_bus_trim ( struct acpi_device * start , int rmdevice ) ;
2005-08-05 08:44:28 +04:00
int acpi_bus_start ( struct acpi_device * device ) ;
2007-05-10 07:34:35 +04:00
acpi_status acpi_bus_get_ejd ( acpi_handle handle , acpi_handle * ejd ) ;
2007-07-23 16:43:32 +04:00
int acpi_match_device_ids ( struct acpi_device * device ,
const struct acpi_device_id * ids ) ;
2005-04-17 02:20:36 +04:00
int acpi_create_dir ( struct acpi_device * ) ;
void acpi_remove_dir ( struct acpi_device * ) ;
2005-03-19 02:45:35 +03:00
/*
* Bind physical devices with ACPI devices
*/
struct acpi_bus_type {
2005-08-05 08:44:28 +04:00
struct list_head list ;
struct bus_type * bus ;
/* For general devices under the bus */
int ( * find_device ) ( struct device * , acpi_handle * ) ;
2005-03-19 02:45:35 +03:00
/* For bridges, such as PCI root bridge, IDE controller */
2005-08-05 08:44:28 +04:00
int ( * find_bridge ) ( struct device * , acpi_handle * ) ;
2005-03-19 02:45:35 +03:00
} ;
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 ) ;
2008-08-01 19:37:54 +04:00
2009-07-24 03:03:00 +04:00
struct acpi_pci_root {
struct list_head node ;
struct acpi_device * device ;
struct acpi_pci_id id ;
struct pci_bus * bus ;
u16 segment ;
u8 bus_nr ;
u32 osc_support_set ; /* _OSC state of support bits */
u32 osc_control_set ; /* _OSC state of control bits */
u32 osc_control_qry ; /* the latest _OSC query result */
u32 osc_queried : 1 ; /* has _OSC control been queried? */
} ;
2005-03-19 02:45:35 +03:00
/* helper */
2010-01-28 05:53:19 +03:00
acpi_handle acpi_get_child ( acpi_handle , u64 ) ;
2009-06-10 23:55:14 +04:00
int acpi_is_root_bridge ( acpi_handle ) ;
2005-03-19 02:45:35 +03:00
acpi_handle acpi_get_pci_rootbridge_handle ( unsigned int , unsigned int ) ;
2009-07-24 03:03:00 +04:00
struct acpi_pci_root * acpi_pci_find_root ( acpi_handle handle ) ;
2006-11-11 09:18:42 +03:00
# define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->archdata.acpi_handle))
2005-03-19 02:45:35 +03:00
2010-02-18 01:44:09 +03:00
int acpi_enable_wakeup_device_power ( struct acpi_device * dev , int state ) ;
int acpi_disable_wakeup_device_power ( struct acpi_device * dev ) ;
2007-07-30 01:27:18 +04:00
# ifdef CONFIG_PM_SLEEP
2008-06-05 03:15:40 +04:00
int acpi_pm_device_sleep_state ( struct device * , int * ) ;
2008-07-07 05:34:48 +04:00
int acpi_pm_device_sleep_wake ( struct device * , bool ) ;
2007-07-30 01:27:18 +04:00
# else /* !CONFIG_PM_SLEEP */
2008-06-05 03:15:40 +04:00
static inline int acpi_pm_device_sleep_state ( struct device * d , int * p )
2007-07-30 01:27:18 +04:00
{
if ( p )
* p = ACPI_STATE_D0 ;
return ACPI_STATE_D3 ;
}
2008-07-08 18:00:54 +04:00
static inline int acpi_pm_device_sleep_wake ( struct device * dev , bool enable )
{
return - ENODEV ;
}
2007-07-30 01:27:18 +04:00
# endif /* !CONFIG_PM_SLEEP */
2007-07-18 00:40:25 +04:00
2007-05-10 07:34:35 +04:00
# endif /* CONFIG_ACPI */
2005-04-17 02:20:36 +04:00
# endif /*__ACPI_BUS_H__*/