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_start) (struct acpi_device * device);
  92typedef int (*acpi_op_stop) (struct acpi_device * device, int type);
  93typedef int (*acpi_op_suspend) (struct acpi_device * device,
  94                                pm_message_t state);
  95typedef int (*acpi_op_resume) (struct acpi_device * device);
  96typedef int (*acpi_op_bind) (struct acpi_device * device);
  97typedef int (*acpi_op_unbind) (struct acpi_device * device);
  98typedef void (*acpi_op_notify) (struct acpi_device * device, u32 event);
  99
 100struct acpi_bus_ops {
 101        u32 acpi_op_add:1;
 102        u32 acpi_op_start:1;
 103};
 104
 105struct acpi_device_ops {
 106        acpi_op_add add;
 107        acpi_op_remove remove;
 108        acpi_op_start start;
 109        acpi_op_stop stop;
 110        acpi_op_suspend suspend;
 111        acpi_op_resume resume;
 112        acpi_op_bind bind;
 113        acpi_op_unbind unbind;
 114        acpi_op_notify notify;
 115};
 116
 117#define ACPI_DRIVER_ALL_NOTIFY_EVENTS   0x1     /* system AND device events */
 118
 119struct acpi_driver {
 120        char name[80];
 121        char class[80];
 122        const struct acpi_device_id *ids; /* Supported Hardware IDs */
 123        unsigned int flags;
 124        struct acpi_device_ops ops;
 125        struct device_driver drv;
 126        struct module *owner;
 127};
 128
 129/*
 130 * ACPI Device
 131 * -----------
 132 */
 133
 134/* Status (_STA) */
 135
 136struct acpi_device_status {
 137        u32 present:1;
 138        u32 enabled:1;
 139        u32 show_in_ui:1;
 140        u32 functional:1;
 141        u32 battery_present:1;
 142        u32 reserved:27;
 143};
 144
 145/* Flags */
 146
 147struct acpi_device_flags {
 148        u32 dynamic_status:1;
 149        u32 hardware_id:1;
 150        u32 compatible_ids:1;
 151        u32 bus_address:1;
 152        u32 unique_id:1;
 153        u32 removable:1;
 154        u32 ejectable:1;
 155        u32 lockable:1;
 156        u32 suprise_removal_ok:1;
 157        u32 power_manageable:1;
 158        u32 performance_manageable:1;
 159        u32 wake_capable:1;     /* Wakeup(_PRW) supported? */
 160        u32 force_power_state:1;
 161        u32 reserved:19;
 162};
 163
 164/* File System */
 165
 166struct acpi_device_dir {
 167        struct proc_dir_entry *entry;
 168};
 169
 170#define acpi_device_dir(d)      ((d)->dir.entry)
 171
 172/* Plug and Play */
 173
 174typedef char acpi_bus_id[8];
 175typedef unsigned long acpi_bus_address;
 176typedef char acpi_hardware_id[15];
 177typedef char acpi_unique_id[9];
 178typedef char acpi_device_name[40];
 179typedef char acpi_device_class[20];
 180
 181struct acpi_device_pnp {
 182        acpi_bus_id bus_id;     /* Object name */
 183        acpi_bus_address bus_address;   /* _ADR */
 184        acpi_hardware_id hardware_id;   /* _HID */
 185        struct acpi_compatible_id_list *cid_list;       /* _CIDs */
 186        acpi_unique_id unique_id;       /* _UID */
 187        acpi_device_name device_name;   /* Driver-determined */
 188        acpi_device_class device_class; /*        "          */
 189};
 190
 191#define acpi_device_bid(d)      ((d)->pnp.bus_id)
 192#define acpi_device_adr(d)      ((d)->pnp.bus_address)
 193#define acpi_device_hid(d)      ((d)->pnp.hardware_id)
 194#define acpi_device_uid(d)      ((d)->pnp.unique_id)
 195#define acpi_device_name(d)     ((d)->pnp.device_name)
 196#define acpi_device_class(d)    ((d)->pnp.device_class)
 197
 198/* Power Management */
 199
 200struct acpi_device_power_flags {
 201        u32 explicit_get:1;     /* _PSC present? */
 202        u32 power_resources:1;  /* Power resources */
 203        u32 inrush_current:1;   /* Serialize Dx->D0 */
 204        u32 power_removed:1;    /* Optimize Dx->D0 */
 205        u32 reserved:28;
 206};
 207
 208struct acpi_device_power_state {
 209        struct {
 210                u8 valid:1;
 211                u8 explicit_set:1;      /* _PSx present? */
 212                u8 reserved:6;
 213        } flags;
 214        int power;              /* % Power (compared to D0) */
 215        int latency;            /* Dx->D0 time (microseconds) */
 216        struct acpi_handle_list resources;      /* Power resources referenced */
 217};
 218
 219struct acpi_device_power {
 220        int state;              /* Current state */
 221        struct acpi_device_power_flags flags;
 222        struct acpi_device_power_state states[4];       /* Power states (D0-D3) */
 223};
 224
 225/* Performance Management */
 226
 227struct acpi_device_perf_flags {
 228        u8 reserved:8;
 229};
 230
 231struct acpi_device_perf_state {
 232        struct {
 233                u8 valid:1;
 234                u8 reserved:7;
 235        } flags;
 236        u8 power;               /* % Power (compared to P0) */
 237        u8 performance;         /* % Performance (    "   ) */
 238        int latency;            /* Px->P0 time (microseconds) */
 239};
 240
 241struct acpi_device_perf {
 242        int state;
 243        struct acpi_device_perf_flags flags;
 244        int state_count;
 245        struct acpi_device_perf_state *states;
 246};
 247
 248/* Wakeup Management */
 249struct acpi_device_wakeup_flags {
 250        u8 valid:1;             /* Can successfully enable wakeup? */
 251        u8 prepared:1;          /* Has the wake-up capability been enabled? */
 252        u8 run_wake:1;          /* Run-Wake GPE devices */
 253};
 254
 255struct acpi_device_wakeup_state {
 256        u8 enabled:1;
 257};
 258
 259struct acpi_device_wakeup {
 260        acpi_handle gpe_device;
 261        acpi_integer gpe_number;
 262        acpi_integer sleep_state;
 263        struct acpi_handle_list resources;
 264        struct acpi_device_wakeup_state state;
 265        struct acpi_device_wakeup_flags flags;
 266};
 267
 268/* Device */
 269
 270struct acpi_device {
 271        acpi_handle handle;
 272        struct acpi_device *parent;
 273        struct list_head children;
 274        struct list_head node;
 275        struct list_head wakeup_list;
 276        struct acpi_device_status status;
 277        struct acpi_device_flags flags;
 278        struct acpi_device_pnp pnp;
 279        struct acpi_device_power power;
 280        struct acpi_device_wakeup wakeup;
 281        struct acpi_device_perf performance;
 282        struct acpi_device_dir dir;
 283        struct acpi_device_ops ops;
 284        struct acpi_driver *driver;
 285        void *driver_data;
 286        struct device dev;
 287        struct acpi_bus_ops bus_ops;    /* workaround for different code path for hotplug */
 288        enum acpi_bus_removal_type removal_type;        /* indicate for different removal type */
 289};
 290
 291static inline void *acpi_driver_data(struct acpi_device *d)
 292{
 293        return d->driver_data;
 294}
 295
 296#define to_acpi_device(d)       container_of(d, struct acpi_device, dev)
 297#define to_acpi_driver(d)       container_of(d, struct acpi_driver, drv)
 298
 299/* acpi_device.dev.bus == &acpi_bus_type */
 300extern struct bus_type acpi_bus_type;
 301
 302/*
 303 * Events
 304 * ------
 305 */
 306
 307struct acpi_bus_event {
 308        struct list_head node;
 309        acpi_device_class device_class;
 310        acpi_bus_id bus_id;
 311        u32 type;
 312        u32 data;
 313};
 314
 315extern struct kobject *acpi_kobj;
 316extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
 317void acpi_bus_private_data_handler(acpi_handle, u32, void *);
 318int acpi_bus_get_private_data(acpi_handle, void **);
 319extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32);
 320extern int register_acpi_notifier(struct notifier_block *);
 321extern int unregister_acpi_notifier(struct notifier_block *);
 322
 323extern int register_acpi_bus_notifier(struct notifier_block *nb);
 324extern void unregister_acpi_bus_notifier(struct notifier_block *nb);
 325/*
 326 * External Functions
 327 */
 328
 329int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device);
 330void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context);
 331int acpi_bus_get_status(struct acpi_device *device);
 332int acpi_bus_get_power(acpi_handle handle, int *state);
 333int acpi_bus_set_power(acpi_handle handle, int state);
 334bool acpi_bus_power_manageable(acpi_handle handle);
 335bool acpi_bus_can_wakeup(acpi_handle handle);
 336#ifdef CONFIG_ACPI_PROC_EVENT
 337int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data);
 338int acpi_bus_generate_proc_event4(const char *class, const char *bid, u8 type, int data);
 339int acpi_bus_receive_event(struct acpi_bus_event *event);
 340#else
 341static inline int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data)
 342        { return 0; }
 343#endif
 344int acpi_bus_register_driver(struct acpi_driver *driver);
 345void acpi_bus_unregister_driver(struct acpi_driver *driver);
 346int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent,
 347                 acpi_handle handle, int type);
 348int acpi_bus_trim(struct acpi_device *start, int rmdevice);
 349int acpi_bus_start(struct acpi_device *device);
 350acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
 351int acpi_match_device_ids(struct acpi_device *device,
 352                          const struct acpi_device_id *ids);
 353int acpi_create_dir(struct acpi_device *);
 354void acpi_remove_dir(struct acpi_device *);
 355
 356/*
 357 * Bind physical devices with ACPI devices
 358 */
 359#include <linux/device.h>
 360struct acpi_bus_type {
 361        struct list_head list;
 362        struct bus_type *bus;
 363        /* For general devices under the bus */
 364        int (*find_device) (struct device *, acpi_handle *);
 365        /* For bridges, such as PCI root bridge, IDE controller */
 366        int (*find_bridge) (struct device *, acpi_handle *);
 367};
 368int register_acpi_bus_type(struct acpi_bus_type *);
 369int unregister_acpi_bus_type(struct acpi_bus_type *);
 370struct device *acpi_get_physical_device(acpi_handle);
 371
 372/* helper */
 373acpi_handle acpi_get_child(acpi_handle, acpi_integer);
 374int acpi_is_root_bridge(acpi_handle);
 375acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
 376#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->archdata.acpi_handle))
 377
 378#ifdef CONFIG_PM_SLEEP
 379int acpi_pm_device_sleep_state(struct device *, int *);
 380int acpi_pm_device_sleep_wake(struct device *, bool);
 381#else /* !CONFIG_PM_SLEEP */
 382static inline int acpi_pm_device_sleep_state(struct device *d, int *p)
 383{
 384        if (p)
 385                *p = ACPI_STATE_D0;
 386        return ACPI_STATE_D3;
 387}
 388static inline int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
 389{
 390        return -ENODEV;
 391}
 392#endif /* !CONFIG_PM_SLEEP */
 393
 394#endif                          /* CONFIG_ACPI */
 395
 396#endif /*__ACPI_BUS_H__*/
 397
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.