linux/include/acpi/acpi_bus.h
<<
>>
Prefs
   1/*
   2 *  acpi_bus.h - ACPI Bus Driver ($Revision: 22 $)
   3 *
   4 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
   5 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
   6 *
   7 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   8 *
   9 *  This program is free software; you can redistribute it and/or modify
  10 *  it under the terms of the GNU General Public License as published by
  11 *  the Free Software Foundation; either version 2 of the License, or (at
  12 *  your option) any later version.
  13 *
  14 *  This program is distributed in the hope that it will be useful, but
  15 *  WITHOUT ANY WARRANTY; without even the implied warranty of
  16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17 *  General Public License for more details.
  18 *
  19 *  You should have received a copy of the GNU General Public License along
  20 *  with this program; if not, write to the Free Software Foundation, Inc.,
  21 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  22 *
  23 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  24 */
  25
  26#ifndef __ACPI_BUS_H__
  27#define __ACPI_BUS_H__
  28
  29#include <linux/device.h>
  30
  31#include <acpi/acpi.h>
  32
  33#define PREFIX                  "ACPI: "
  34
  35/* TBD: Make dynamic */
  36#define ACPI_MAX_HANDLES        10
  37struct acpi_handle_list {
  38        u32 count;
  39        acpi_handle handles[ACPI_MAX_HANDLES];
  40};
  41
  42/* acpi_utils.h */
  43acpi_status
  44acpi_extract_package(union acpi_object *package,
  45                     struct acpi_buffer *format, struct acpi_buffer *buffer);
  46acpi_status
  47acpi_evaluate_integer(acpi_handle handle,
  48                      acpi_string pathname,
  49                      struct acpi_object_list *arguments, unsigned long long *data);
  50acpi_status
  51acpi_evaluate_reference(acpi_handle handle,
  52                        acpi_string pathname,
  53                        struct acpi_object_list *arguments,
  54                        struct acpi_handle_list *list);
  55
  56#ifdef CONFIG_ACPI
  57
  58#include <linux/proc_fs.h>
  59
  60#define ACPI_BUS_FILE_ROOT      "acpi"
  61extern struct proc_dir_entry *acpi_root_dir;
  62
  63enum acpi_bus_removal_type {
  64        ACPI_BUS_REMOVAL_NORMAL = 0,
  65        ACPI_BUS_REMOVAL_EJECT,
  66        ACPI_BUS_REMOVAL_SUPRISE,
  67        ACPI_BUS_REMOVAL_TYPE_COUNT
  68};
  69
  70enum acpi_bus_device_type {
  71        ACPI_BUS_TYPE_DEVICE = 0,
  72        ACPI_BUS_TYPE_POWER,
  73        ACPI_BUS_TYPE_PROCESSOR,
  74        ACPI_BUS_TYPE_THERMAL,
  75        ACPI_BUS_TYPE_SYSTEM,
  76        ACPI_BUS_TYPE_POWER_BUTTON,
  77        ACPI_BUS_TYPE_SLEEP_BUTTON,
  78        ACPI_BUS_DEVICE_TYPE_COUNT
  79};
  80
  81struct acpi_driver;
  82struct acpi_device;
  83
  84/*
  85 * ACPI Driver
  86 * -----------
  87 */
  88
  89typedef int (*acpi_op_add) (struct acpi_device * device);
  90typedef int (*acpi_op_remove) (struct acpi_device * device, int type);
  91typedef int (*acpi_op_lock) (struct acpi_device * device, int type);
  92typedef int (*acpi_op_start) (struct acpi_device * device);
  93typedef int (*acpi_op_stop) (struct acpi_device * device, int type);
  94typedef int (*acpi_op_suspend) (struct acpi_device * device,
  95                                pm_message_t state);
  96typedef int (*acpi_op_resume) (struct acpi_device * device);
  97typedef int (*acpi_op_scan) (struct acpi_device * device);
  98typedef int (*acpi_op_bind) (struct acpi_device * device);
  99typedef int (*acpi_op_unbind) (struct acpi_device * device);
 100typedef int (*acpi_op_shutdown) (struct acpi_device * device);
 101
 102struct acpi_bus_ops {
 103        u32 acpi_op_add:1;
 104        u32 acpi_op_remove:1;
 105        u32 acpi_op_lock:1;
 106        u32 acpi_op_start:1;
 107        u32 acpi_op_stop:1;
 108        u32 acpi_op_suspend:1;
 109        u32 acpi_op_resume:1;
 110        u32 acpi_op_scan:1;
 111        u32 acpi_op_bind:1;
 112        u32 acpi_op_unbind:1;
 113        u32 acpi_op_shutdown:1;
 114        u32 reserved:21;
 115};
 116
 117struct acpi_device_ops {
 118        acpi_op_add add;
 119        acpi_op_remove remove;
 120        acpi_op_lock lock;
 121        acpi_op_start start;
 122        acpi_op_stop stop;
 123        acpi_op_suspend suspend;
 124        acpi_op_resume resume;
 125        acpi_op_scan scan;
 126        acpi_op_bind bind;
 127        acpi_op_unbind unbind;
 128        acpi_op_shutdown shutdown;
 129};
 130
 131struct acpi_driver {
 132        char name[80];
 133        char class[80];
 134        const struct acpi_device_id *ids; /* Supported Hardware IDs */
 135        struct acpi_device_ops ops;
 136        struct device_driver drv;
 137        struct module *owner;
 138};
 139
 140/*
 141 * ACPI Device
 142 * -----------
 143 */
 144
 145/* Status (_STA) */
 146
 147struct acpi_device_status {
 148        u32 present:1;
 149        u32 enabled:1;
 150        u32 show_in_ui:1;
 151        u32 functional:1;
 152        u32 battery_present:1;
 153        u32 reserved:27;
 154};
 155
 156/* Flags */
 157
 158struct acpi_device_flags {
 159        u32 dynamic_status:1;
 160        u32 hardware_id:1;
 161        u32 compatible_ids:1;
 162        u32 bus_address:1;
 163        u32 unique_id:1;
 164        u32 removable:1;
 165        u32 ejectable:1;
 166        u32 lockable:1;
 167        u32 suprise_removal_ok:1;
 168        u32 power_manageable:1;
 169        u32 performance_manageable:1;
 170        u32 wake_capable:1;     /* Wakeup(_PRW) supported? */
 171        u32 force_power_state:1;
 172        u32 reserved:19;
 173};
 174
 175/* File System */
 176
 177struct acpi_device_dir {
 178        struct proc_dir_entry *entry;
 179};
 180
 181#define acpi_device_dir(d)      ((d)->dir.entry)
 182
 183/* Plug and Play */
 184
 185typedef char acpi_bus_id[5];
 186typedef unsigned long acpi_bus_address;
 187typedef char acpi_hardware_id[15];
 188typedef char acpi_unique_id[9];
 189typedef char acpi_device_name[40];
 190typedef char acpi_device_class[20];
 191
 192struct acpi_device_pnp {
 193        acpi_bus_id bus_id;     /* Object name */
 194        acpi_bus_address bus_address;   /* _ADR */
 195        acpi_hardware_id hardware_id;   /* _HID */
 196        struct acpi_compatible_id_list *cid_list;       /* _CIDs */
 197        acpi_unique_id unique_id;       /* _UID */
 198        acpi_device_name device_name;   /* Driver-determined */
 199        acpi_device_class device_class; /*        "          */
 200};
 201
 202#define acpi_device_bid(d)      ((d)->pnp.bus_id)
 203#define acpi_device_adr(d)      ((d)->pnp.bus_address)
 204#define acpi_device_hid(d)      ((d)->pnp.hardware_id)
 205#define acpi_device_uid(d)      ((d)->pnp.unique_id)
 206#define acpi_device_name(d)     ((d)->pnp.device_name)
 207#define acpi_device_class(d)    ((d)->pnp.device_class)
 208
 209/* Power Management */
 210
 211struct acpi_device_power_flags {
 212        u32 explicit_get:1;     /* _PSC present? */
 213        u32 power_resources:1;  /* Power resources */
 214        u32 inrush_current:1;   /* Serialize Dx->D0 */
 215        u32 power_removed:1;    /* Optimize Dx->D0 */
 216        u32 reserved:28;
 217};
 218
 219struct acpi_device_power_state {
 220        struct {
 221                u8 valid:1;
 222                u8 explicit_set:1;      /* _PSx present? */
 223                u8 reserved:6;
 224        } flags;
 225        int power;              /* % Power (compared to D0) */
 226        int latency;            /* Dx->D0 time (microseconds) */
 227        struct acpi_handle_list resources;      /* Power resources referenced */
 228};
 229
 230struct acpi_device_power {
 231        int state;              /* Current state */
 232        struct acpi_device_power_flags flags;
 233        struct acpi_device_power_state states[4];       /* Power states (D0-D3) */
 234};
 235
 236/* Performance Management */
 237
 238struct acpi_device_perf_flags {
 239        u8 reserved:8;
 240};
 241
 242struct acpi_device_perf_state {
 243        struct {
 244                u8 valid:1;
 245                u8 reserved:7;
 246        } flags;
 247        u8 power;               /* % Power (compared to P0) */
 248        u8 performance;         /* % Performance (    "   ) */
 249        int latency;            /* Px->P0 time (microseconds) */
 250};
 251
 252struct acpi_device_perf {
 253        int state;
 254        struct acpi_device_perf_flags flags;
 255        int state_count;
 256        struct acpi_device_perf_state *states;
 257};
 258
 259/* Wakeup Management */
 260struct acpi_device_wakeup_flags {
 261        u8 valid:1;             /* Can successfully enable wakeup? */
 262        u8 prepared:1;          /* Has the wake-up capability been enabled? */
 263        u8 run_wake:1;          /* Run-Wake GPE devices */
 264};
 265
 266struct acpi_device_wakeup_state {
 267        u8 enabled:1;
 268};
 269
 270struct acpi_device_wakeup {
 271        acpi_handle gpe_device;
 272        acpi_integer gpe_number;
 273        acpi_integer sleep_state;
 274        struct acpi_handle_list resources;
 275        struct acpi_device_wakeup_state state;
 276        struct acpi_device_wakeup_flags flags;
 277};
 278
 279/* Device */
 280
 281struct acpi_device {
 282        acpi_handle handle;
 283        struct acpi_device *parent;
 284        struct list_head children;
 285        struct list_head node;
 286        struct list_head wakeup_list;
 287        struct list_head g_list;
 288        struct acpi_device_status status;
 289        struct acpi_device_flags flags;
 290        struct acpi_device_pnp pnp;
 291        struct acpi_device_power power;
 292        struct acpi_device_wakeup wakeup;
 293        struct acpi_device_perf performance;
 294        struct acpi_device_dir dir;
 295        struct acpi_device_ops ops;
 296        struct acpi_driver *driver;
 297        void *driver_data;
 298        struct device dev;
 299        struct acpi_bus_ops bus_ops;    /* workaround for different code path for hotplug */
 300        enum acpi_bus_removal_type removal_type;        /* indicate for different removal type */
 301};
 302
 303static inline void *acpi_driver_data(struct acpi_device *d)
 304{
 305        return d->driver_data;
 306}
 307
 308#define to_acpi_device(d)       container_of(d, struct acpi_device, dev)
 309#define to_acpi_driver(d)       container_of(d, struct acpi_driver, drv)
 310
 311/* acpi_device.dev.bus == &acpi_bus_type */
 312extern struct bus_type acpi_bus_type;
 313
 314/*
 315 * Events
 316 * ------
 317 */
 318
 319struct acpi_bus_event {
 320        struct list_head node;
 321        acpi_device_class device_class;
 322        acpi_bus_id bus_id;
 323        u32 type;
 324        u32 data;
 325};
 326
 327extern struct kobject *acpi_kobj;
 328extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
 329void acpi_bus_private_data_handler(acpi_handle, u32, void *);
 330int acpi_bus_get_private_data(acpi_handle, void **);
 331extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32);
 332extern int register_acpi_notifier(struct notifier_block *);
 333extern int unregister_acpi_notifier(struct notifier_block *);
 334
 335extern int register_acpi_bus_notifier(struct notifier_block *nb);
 336extern void unregister_acpi_bus_notifier(struct notifier_block *nb);
 337/*
 338 * External Functions
 339 */
 340
 341int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device);
 342void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context);
 343int acpi_bus_get_status(struct acpi_device *device);
 344int acpi_bus_get_power(acpi_handle handle, int *state);
 345int acpi_bus_set_power(acpi_handle handle, int state);
 346bool acpi_bus_power_manageable(acpi_handle handle);
 347bool acpi_bus_can_wakeup(acpi_handle handle);
 348#ifdef CONFIG_ACPI_PROC_EVENT
 349int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data);
 350int acpi_bus_generate_proc_event4(const char *class, const char *bid, u8 type, int data);
 351int acpi_bus_receive_event(struct acpi_bus_event *event);
 352#else
 353static inline int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data)
 354        { return 0; }
 355#endif
 356int acpi_bus_register_driver(struct acpi_driver *driver);
 357void acpi_bus_unregister_driver(struct acpi_driver *driver);
 358int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent,
 359                 acpi_handle handle, int type);
 360int acpi_bus_trim(struct acpi_device *start, int rmdevice);
 361int acpi_bus_start(struct acpi_device *device);
 362acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
 363int acpi_match_device_ids(struct acpi_device *device,
 364                          const struct acpi_device_id *ids);
 365int acpi_create_dir(struct acpi_device *);
 366void acpi_remove_dir(struct acpi_device *);
 367
 368/*
 369 * Bind physical devices with ACPI devices
 370 */
 371#include <linux/device.h>
 372struct acpi_bus_type {
 373        struct list_head list;
 374        struct bus_type *bus;
 375        /* For general devices under the bus */
 376        int (*find_device) (struct device *, acpi_handle *);
 377        /* For bridges, such as PCI root bridge, IDE controller */
 378        int (*find_bridge) (struct device *, acpi_handle *);
 379};
 380int register_acpi_bus_type(struct acpi_bus_type *);
 381int unregister_acpi_bus_type(struct acpi_bus_type *);
 382struct device *acpi_get_physical_device(acpi_handle);
 383struct device *acpi_get_physical_pci_device(acpi_handle);
 384
 385/* helper */
 386acpi_handle acpi_get_child(acpi_handle, acpi_integer);
 387acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
 388#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->archdata.acpi_handle))
 389
 390#ifdef CONFIG_PM_SLEEP
 391int acpi_pm_device_sleep_state(struct device *, int *);
 392int acpi_pm_device_sleep_wake(struct device *, bool);
 393#else /* !CONFIG_PM_SLEEP */
 394static inline int acpi_pm_device_sleep_state(struct device *d, int *p)
 395{
 396        if (p)
 397                *p = ACPI_STATE_D0;
 398        return ACPI_STATE_D3;
 399}
 400static inline int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
 401{
 402        return -ENODEV;
 403}
 404#endif /* !CONFIG_PM_SLEEP */
 405
 406#endif                          /* CONFIG_ACPI */
 407
 408#endif /*__ACPI_BUS_H__*/
 409
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.