162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * acpi_bus.h - ACPI Bus Driver ($Revision: 22 $) 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> 662306a36Sopenharmony_ci * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef __ACPI_BUS_H__ 1062306a36Sopenharmony_ci#define __ACPI_BUS_H__ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/device.h> 1362306a36Sopenharmony_ci#include <linux/property.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* TBD: Make dynamic */ 1662306a36Sopenharmony_ci#define ACPI_MAX_HANDLES 10 1762306a36Sopenharmony_cistruct acpi_handle_list { 1862306a36Sopenharmony_ci u32 count; 1962306a36Sopenharmony_ci acpi_handle handles[ACPI_MAX_HANDLES]; 2062306a36Sopenharmony_ci}; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* acpi_utils.h */ 2362306a36Sopenharmony_ciacpi_status 2462306a36Sopenharmony_ciacpi_extract_package(union acpi_object *package, 2562306a36Sopenharmony_ci struct acpi_buffer *format, struct acpi_buffer *buffer); 2662306a36Sopenharmony_ciacpi_status 2762306a36Sopenharmony_ciacpi_evaluate_integer(acpi_handle handle, 2862306a36Sopenharmony_ci acpi_string pathname, 2962306a36Sopenharmony_ci struct acpi_object_list *arguments, unsigned long long *data); 3062306a36Sopenharmony_ciacpi_status 3162306a36Sopenharmony_ciacpi_evaluate_reference(acpi_handle handle, 3262306a36Sopenharmony_ci acpi_string pathname, 3362306a36Sopenharmony_ci struct acpi_object_list *arguments, 3462306a36Sopenharmony_ci struct acpi_handle_list *list); 3562306a36Sopenharmony_ciacpi_status 3662306a36Sopenharmony_ciacpi_evaluate_ost(acpi_handle handle, u32 source_event, u32 status_code, 3762306a36Sopenharmony_ci struct acpi_buffer *status_buf); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ciacpi_status 4062306a36Sopenharmony_ciacpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cibool acpi_has_method(acpi_handle handle, char *name); 4362306a36Sopenharmony_ciacpi_status acpi_execute_simple_method(acpi_handle handle, char *method, 4462306a36Sopenharmony_ci u64 arg); 4562306a36Sopenharmony_ciacpi_status acpi_evaluate_ej0(acpi_handle handle); 4662306a36Sopenharmony_ciacpi_status acpi_evaluate_lck(acpi_handle handle, int lock); 4762306a36Sopenharmony_ciacpi_status acpi_evaluate_reg(acpi_handle handle, u8 space_id, u32 function); 4862306a36Sopenharmony_cibool acpi_ata_match(acpi_handle handle); 4962306a36Sopenharmony_cibool acpi_bay_match(acpi_handle handle); 5062306a36Sopenharmony_cibool acpi_dock_match(acpi_handle handle); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cibool acpi_check_dsm(acpi_handle handle, const guid_t *guid, u64 rev, u64 funcs); 5362306a36Sopenharmony_ciunion acpi_object *acpi_evaluate_dsm(acpi_handle handle, const guid_t *guid, 5462306a36Sopenharmony_ci u64 rev, u64 func, union acpi_object *argv4); 5562306a36Sopenharmony_ci#ifdef CONFIG_ACPI 5662306a36Sopenharmony_cistatic inline union acpi_object * 5762306a36Sopenharmony_ciacpi_evaluate_dsm_typed(acpi_handle handle, const guid_t *guid, u64 rev, 5862306a36Sopenharmony_ci u64 func, union acpi_object *argv4, 5962306a36Sopenharmony_ci acpi_object_type type) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci union acpi_object *obj; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci obj = acpi_evaluate_dsm(handle, guid, rev, func, argv4); 6462306a36Sopenharmony_ci if (obj && obj->type != type) { 6562306a36Sopenharmony_ci ACPI_FREE(obj); 6662306a36Sopenharmony_ci obj = NULL; 6762306a36Sopenharmony_ci } 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci return obj; 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci#endif 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#define ACPI_INIT_DSM_ARGV4(cnt, eles) \ 7462306a36Sopenharmony_ci { \ 7562306a36Sopenharmony_ci .package.type = ACPI_TYPE_PACKAGE, \ 7662306a36Sopenharmony_ci .package.count = (cnt), \ 7762306a36Sopenharmony_ci .package.elements = (eles) \ 7862306a36Sopenharmony_ci } 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cibool acpi_dev_found(const char *hid); 8162306a36Sopenharmony_cibool acpi_dev_present(const char *hid, const char *uid, s64 hrv); 8262306a36Sopenharmony_cibool acpi_reduced_hardware(void); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci#ifdef CONFIG_ACPI 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistruct proc_dir_entry; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci#define ACPI_BUS_FILE_ROOT "acpi" 8962306a36Sopenharmony_ciextern struct proc_dir_entry *acpi_root_dir; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cienum acpi_bus_device_type { 9262306a36Sopenharmony_ci ACPI_BUS_TYPE_DEVICE = 0, 9362306a36Sopenharmony_ci ACPI_BUS_TYPE_POWER, 9462306a36Sopenharmony_ci ACPI_BUS_TYPE_PROCESSOR, 9562306a36Sopenharmony_ci ACPI_BUS_TYPE_THERMAL, 9662306a36Sopenharmony_ci ACPI_BUS_TYPE_POWER_BUTTON, 9762306a36Sopenharmony_ci ACPI_BUS_TYPE_SLEEP_BUTTON, 9862306a36Sopenharmony_ci ACPI_BUS_TYPE_ECDT_EC, 9962306a36Sopenharmony_ci ACPI_BUS_DEVICE_TYPE_COUNT 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistruct acpi_driver; 10362306a36Sopenharmony_cistruct acpi_device; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci/* 10662306a36Sopenharmony_ci * ACPI Scan Handler 10762306a36Sopenharmony_ci * ----------------- 10862306a36Sopenharmony_ci */ 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistruct acpi_hotplug_profile { 11162306a36Sopenharmony_ci struct kobject kobj; 11262306a36Sopenharmony_ci int (*scan_dependent)(struct acpi_device *adev); 11362306a36Sopenharmony_ci void (*notify_online)(struct acpi_device *adev); 11462306a36Sopenharmony_ci bool enabled:1; 11562306a36Sopenharmony_ci bool demand_offline:1; 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistatic inline struct acpi_hotplug_profile *to_acpi_hotplug_profile( 11962306a36Sopenharmony_ci struct kobject *kobj) 12062306a36Sopenharmony_ci{ 12162306a36Sopenharmony_ci return container_of(kobj, struct acpi_hotplug_profile, kobj); 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistruct acpi_scan_handler { 12562306a36Sopenharmony_ci const struct acpi_device_id *ids; 12662306a36Sopenharmony_ci struct list_head list_node; 12762306a36Sopenharmony_ci bool (*match)(const char *idstr, const struct acpi_device_id **matchid); 12862306a36Sopenharmony_ci int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id); 12962306a36Sopenharmony_ci void (*detach)(struct acpi_device *dev); 13062306a36Sopenharmony_ci void (*bind)(struct device *phys_dev); 13162306a36Sopenharmony_ci void (*unbind)(struct device *phys_dev); 13262306a36Sopenharmony_ci struct acpi_hotplug_profile hotplug; 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci/* 13662306a36Sopenharmony_ci * ACPI Hotplug Context 13762306a36Sopenharmony_ci * -------------------- 13862306a36Sopenharmony_ci */ 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistruct acpi_hotplug_context { 14162306a36Sopenharmony_ci struct acpi_device *self; 14262306a36Sopenharmony_ci int (*notify)(struct acpi_device *, u32); 14362306a36Sopenharmony_ci void (*uevent)(struct acpi_device *, u32); 14462306a36Sopenharmony_ci void (*fixup)(struct acpi_device *); 14562306a36Sopenharmony_ci}; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci/* 14862306a36Sopenharmony_ci * ACPI Driver 14962306a36Sopenharmony_ci * ----------- 15062306a36Sopenharmony_ci */ 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_citypedef int (*acpi_op_add) (struct acpi_device * device); 15362306a36Sopenharmony_citypedef void (*acpi_op_remove) (struct acpi_device *device); 15462306a36Sopenharmony_citypedef void (*acpi_op_notify) (struct acpi_device * device, u32 event); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistruct acpi_device_ops { 15762306a36Sopenharmony_ci acpi_op_add add; 15862306a36Sopenharmony_ci acpi_op_remove remove; 15962306a36Sopenharmony_ci acpi_op_notify notify; 16062306a36Sopenharmony_ci}; 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci#define ACPI_DRIVER_ALL_NOTIFY_EVENTS 0x1 /* system AND device events */ 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistruct acpi_driver { 16562306a36Sopenharmony_ci char name[80]; 16662306a36Sopenharmony_ci char class[80]; 16762306a36Sopenharmony_ci const struct acpi_device_id *ids; /* Supported Hardware IDs */ 16862306a36Sopenharmony_ci unsigned int flags; 16962306a36Sopenharmony_ci struct acpi_device_ops ops; 17062306a36Sopenharmony_ci struct device_driver drv; 17162306a36Sopenharmony_ci struct module *owner; 17262306a36Sopenharmony_ci}; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci/* 17562306a36Sopenharmony_ci * ACPI Device 17662306a36Sopenharmony_ci * ----------- 17762306a36Sopenharmony_ci */ 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci/* Status (_STA) */ 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cistruct acpi_device_status { 18262306a36Sopenharmony_ci u32 present:1; 18362306a36Sopenharmony_ci u32 enabled:1; 18462306a36Sopenharmony_ci u32 show_in_ui:1; 18562306a36Sopenharmony_ci u32 functional:1; 18662306a36Sopenharmony_ci u32 battery_present:1; 18762306a36Sopenharmony_ci u32 reserved:27; 18862306a36Sopenharmony_ci}; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci/* Flags */ 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistruct acpi_device_flags { 19362306a36Sopenharmony_ci u32 dynamic_status:1; 19462306a36Sopenharmony_ci u32 removable:1; 19562306a36Sopenharmony_ci u32 ejectable:1; 19662306a36Sopenharmony_ci u32 power_manageable:1; 19762306a36Sopenharmony_ci u32 match_driver:1; 19862306a36Sopenharmony_ci u32 initialized:1; 19962306a36Sopenharmony_ci u32 visited:1; 20062306a36Sopenharmony_ci u32 hotplug_notify:1; 20162306a36Sopenharmony_ci u32 is_dock_station:1; 20262306a36Sopenharmony_ci u32 of_compatible_ok:1; 20362306a36Sopenharmony_ci u32 coherent_dma:1; 20462306a36Sopenharmony_ci u32 cca_seen:1; 20562306a36Sopenharmony_ci u32 enumeration_by_parent:1; 20662306a36Sopenharmony_ci u32 honor_deps:1; 20762306a36Sopenharmony_ci u32 reserved:18; 20862306a36Sopenharmony_ci}; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci/* File System */ 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_cistruct acpi_device_dir { 21362306a36Sopenharmony_ci struct proc_dir_entry *entry; 21462306a36Sopenharmony_ci}; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci#define acpi_device_dir(d) ((d)->dir.entry) 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci/* Plug and Play */ 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_citypedef char acpi_bus_id[8]; 22162306a36Sopenharmony_citypedef u64 acpi_bus_address; 22262306a36Sopenharmony_citypedef char acpi_device_name[40]; 22362306a36Sopenharmony_citypedef char acpi_device_class[20]; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistruct acpi_hardware_id { 22662306a36Sopenharmony_ci struct list_head list; 22762306a36Sopenharmony_ci const char *id; 22862306a36Sopenharmony_ci}; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_cistruct acpi_pnp_type { 23162306a36Sopenharmony_ci u32 hardware_id:1; 23262306a36Sopenharmony_ci u32 bus_address:1; 23362306a36Sopenharmony_ci u32 platform_id:1; 23462306a36Sopenharmony_ci u32 backlight:1; 23562306a36Sopenharmony_ci u32 reserved:28; 23662306a36Sopenharmony_ci}; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cistruct acpi_device_pnp { 23962306a36Sopenharmony_ci acpi_bus_id bus_id; /* Object name */ 24062306a36Sopenharmony_ci int instance_no; /* Instance number of this object */ 24162306a36Sopenharmony_ci struct acpi_pnp_type type; /* ID type */ 24262306a36Sopenharmony_ci acpi_bus_address bus_address; /* _ADR */ 24362306a36Sopenharmony_ci char *unique_id; /* _UID */ 24462306a36Sopenharmony_ci struct list_head ids; /* _HID and _CIDs */ 24562306a36Sopenharmony_ci acpi_device_name device_name; /* Driver-determined */ 24662306a36Sopenharmony_ci acpi_device_class device_class; /* " */ 24762306a36Sopenharmony_ci union acpi_object *str_obj; /* unicode string for _STR method */ 24862306a36Sopenharmony_ci}; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci#define acpi_device_bid(d) ((d)->pnp.bus_id) 25162306a36Sopenharmony_ci#define acpi_device_adr(d) ((d)->pnp.bus_address) 25262306a36Sopenharmony_ciconst char *acpi_device_hid(struct acpi_device *device); 25362306a36Sopenharmony_ci#define acpi_device_uid(d) ((d)->pnp.unique_id) 25462306a36Sopenharmony_ci#define acpi_device_name(d) ((d)->pnp.device_name) 25562306a36Sopenharmony_ci#define acpi_device_class(d) ((d)->pnp.device_class) 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci/* Power Management */ 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistruct acpi_device_power_flags { 26062306a36Sopenharmony_ci u32 explicit_get:1; /* _PSC present? */ 26162306a36Sopenharmony_ci u32 power_resources:1; /* Power resources */ 26262306a36Sopenharmony_ci u32 inrush_current:1; /* Serialize Dx->D0 */ 26362306a36Sopenharmony_ci u32 power_removed:1; /* Optimize Dx->D0 */ 26462306a36Sopenharmony_ci u32 ignore_parent:1; /* Power is independent of parent power state */ 26562306a36Sopenharmony_ci u32 dsw_present:1; /* _DSW present? */ 26662306a36Sopenharmony_ci u32 reserved:26; 26762306a36Sopenharmony_ci}; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_cistruct acpi_device_power_state { 27062306a36Sopenharmony_ci struct { 27162306a36Sopenharmony_ci u8 valid:1; 27262306a36Sopenharmony_ci u8 explicit_set:1; /* _PSx present? */ 27362306a36Sopenharmony_ci u8 reserved:6; 27462306a36Sopenharmony_ci } flags; 27562306a36Sopenharmony_ci int power; /* % Power (compared to D0) */ 27662306a36Sopenharmony_ci int latency; /* Dx->D0 time (microseconds) */ 27762306a36Sopenharmony_ci struct list_head resources; /* Power resources referenced */ 27862306a36Sopenharmony_ci}; 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_cistruct acpi_device_power { 28162306a36Sopenharmony_ci int state; /* Current state */ 28262306a36Sopenharmony_ci struct acpi_device_power_flags flags; 28362306a36Sopenharmony_ci struct acpi_device_power_state states[ACPI_D_STATE_COUNT]; /* Power states (D0-D3Cold) */ 28462306a36Sopenharmony_ci u8 state_for_enumeration; /* Deepest power state for enumeration */ 28562306a36Sopenharmony_ci}; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_cistruct acpi_dep_data { 28862306a36Sopenharmony_ci struct list_head node; 28962306a36Sopenharmony_ci acpi_handle supplier; 29062306a36Sopenharmony_ci acpi_handle consumer; 29162306a36Sopenharmony_ci bool honor_dep; 29262306a36Sopenharmony_ci bool met; 29362306a36Sopenharmony_ci bool free_when_met; 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci/* Performance Management */ 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistruct acpi_device_perf_flags { 29962306a36Sopenharmony_ci u8 reserved:8; 30062306a36Sopenharmony_ci}; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cistruct acpi_device_perf_state { 30362306a36Sopenharmony_ci struct { 30462306a36Sopenharmony_ci u8 valid:1; 30562306a36Sopenharmony_ci u8 reserved:7; 30662306a36Sopenharmony_ci } flags; 30762306a36Sopenharmony_ci u8 power; /* % Power (compared to P0) */ 30862306a36Sopenharmony_ci u8 performance; /* % Performance ( " ) */ 30962306a36Sopenharmony_ci int latency; /* Px->P0 time (microseconds) */ 31062306a36Sopenharmony_ci}; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistruct acpi_device_perf { 31362306a36Sopenharmony_ci int state; 31462306a36Sopenharmony_ci struct acpi_device_perf_flags flags; 31562306a36Sopenharmony_ci int state_count; 31662306a36Sopenharmony_ci struct acpi_device_perf_state *states; 31762306a36Sopenharmony_ci}; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci/* Wakeup Management */ 32062306a36Sopenharmony_cistruct acpi_device_wakeup_flags { 32162306a36Sopenharmony_ci u8 valid:1; /* Can successfully enable wakeup? */ 32262306a36Sopenharmony_ci u8 notifier_present:1; /* Wake-up notify handler has been installed */ 32362306a36Sopenharmony_ci}; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistruct acpi_device_wakeup_context { 32662306a36Sopenharmony_ci void (*func)(struct acpi_device_wakeup_context *context); 32762306a36Sopenharmony_ci struct device *dev; 32862306a36Sopenharmony_ci}; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_cistruct acpi_device_wakeup { 33162306a36Sopenharmony_ci acpi_handle gpe_device; 33262306a36Sopenharmony_ci u64 gpe_number; 33362306a36Sopenharmony_ci u64 sleep_state; 33462306a36Sopenharmony_ci struct list_head resources; 33562306a36Sopenharmony_ci struct acpi_device_wakeup_flags flags; 33662306a36Sopenharmony_ci struct acpi_device_wakeup_context context; 33762306a36Sopenharmony_ci struct wakeup_source *ws; 33862306a36Sopenharmony_ci int prepare_count; 33962306a36Sopenharmony_ci int enable_count; 34062306a36Sopenharmony_ci}; 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_cistruct acpi_device_physical_node { 34362306a36Sopenharmony_ci unsigned int node_id; 34462306a36Sopenharmony_ci struct list_head node; 34562306a36Sopenharmony_ci struct device *dev; 34662306a36Sopenharmony_ci bool put_online:1; 34762306a36Sopenharmony_ci}; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_cistruct acpi_device_properties { 35062306a36Sopenharmony_ci const guid_t *guid; 35162306a36Sopenharmony_ci union acpi_object *properties; 35262306a36Sopenharmony_ci struct list_head list; 35362306a36Sopenharmony_ci void **bufs; 35462306a36Sopenharmony_ci}; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci/* ACPI Device Specific Data (_DSD) */ 35762306a36Sopenharmony_cistruct acpi_device_data { 35862306a36Sopenharmony_ci const union acpi_object *pointer; 35962306a36Sopenharmony_ci struct list_head properties; 36062306a36Sopenharmony_ci const union acpi_object *of_compatible; 36162306a36Sopenharmony_ci struct list_head subnodes; 36262306a36Sopenharmony_ci}; 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_cistruct acpi_gpio_mapping; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci/* Device */ 36762306a36Sopenharmony_cistruct acpi_device { 36862306a36Sopenharmony_ci u32 pld_crc; 36962306a36Sopenharmony_ci int device_type; 37062306a36Sopenharmony_ci acpi_handle handle; /* no handle for fixed hardware */ 37162306a36Sopenharmony_ci struct fwnode_handle fwnode; 37262306a36Sopenharmony_ci struct list_head wakeup_list; 37362306a36Sopenharmony_ci struct list_head del_list; 37462306a36Sopenharmony_ci struct acpi_device_status status; 37562306a36Sopenharmony_ci struct acpi_device_flags flags; 37662306a36Sopenharmony_ci struct acpi_device_pnp pnp; 37762306a36Sopenharmony_ci struct acpi_device_power power; 37862306a36Sopenharmony_ci struct acpi_device_wakeup wakeup; 37962306a36Sopenharmony_ci struct acpi_device_perf performance; 38062306a36Sopenharmony_ci struct acpi_device_dir dir; 38162306a36Sopenharmony_ci struct acpi_device_data data; 38262306a36Sopenharmony_ci struct acpi_scan_handler *handler; 38362306a36Sopenharmony_ci struct acpi_hotplug_context *hp; 38462306a36Sopenharmony_ci const struct acpi_gpio_mapping *driver_gpios; 38562306a36Sopenharmony_ci void *driver_data; 38662306a36Sopenharmony_ci struct device dev; 38762306a36Sopenharmony_ci unsigned int physical_node_count; 38862306a36Sopenharmony_ci unsigned int dep_unmet; 38962306a36Sopenharmony_ci struct list_head physical_node_list; 39062306a36Sopenharmony_ci struct mutex physical_node_lock; 39162306a36Sopenharmony_ci void (*remove)(struct acpi_device *); 39262306a36Sopenharmony_ci}; 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci/* Non-device subnode */ 39562306a36Sopenharmony_cistruct acpi_data_node { 39662306a36Sopenharmony_ci const char *name; 39762306a36Sopenharmony_ci acpi_handle handle; 39862306a36Sopenharmony_ci struct fwnode_handle fwnode; 39962306a36Sopenharmony_ci struct fwnode_handle *parent; 40062306a36Sopenharmony_ci struct acpi_device_data data; 40162306a36Sopenharmony_ci struct list_head sibling; 40262306a36Sopenharmony_ci struct kobject kobj; 40362306a36Sopenharmony_ci struct completion kobj_done; 40462306a36Sopenharmony_ci}; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ciextern const struct fwnode_operations acpi_device_fwnode_ops; 40762306a36Sopenharmony_ciextern const struct fwnode_operations acpi_data_fwnode_ops; 40862306a36Sopenharmony_ciextern const struct fwnode_operations acpi_static_fwnode_ops; 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_cibool is_acpi_device_node(const struct fwnode_handle *fwnode); 41162306a36Sopenharmony_cibool is_acpi_data_node(const struct fwnode_handle *fwnode); 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_cistatic inline bool is_acpi_node(const struct fwnode_handle *fwnode) 41462306a36Sopenharmony_ci{ 41562306a36Sopenharmony_ci return (is_acpi_device_node(fwnode) || is_acpi_data_node(fwnode)); 41662306a36Sopenharmony_ci} 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci#define to_acpi_device_node(__fwnode) \ 41962306a36Sopenharmony_ci ({ \ 42062306a36Sopenharmony_ci typeof(__fwnode) __to_acpi_device_node_fwnode = __fwnode; \ 42162306a36Sopenharmony_ci \ 42262306a36Sopenharmony_ci is_acpi_device_node(__to_acpi_device_node_fwnode) ? \ 42362306a36Sopenharmony_ci container_of(__to_acpi_device_node_fwnode, \ 42462306a36Sopenharmony_ci struct acpi_device, fwnode) : \ 42562306a36Sopenharmony_ci NULL; \ 42662306a36Sopenharmony_ci }) 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci#define to_acpi_data_node(__fwnode) \ 42962306a36Sopenharmony_ci ({ \ 43062306a36Sopenharmony_ci typeof(__fwnode) __to_acpi_data_node_fwnode = __fwnode; \ 43162306a36Sopenharmony_ci \ 43262306a36Sopenharmony_ci is_acpi_data_node(__to_acpi_data_node_fwnode) ? \ 43362306a36Sopenharmony_ci container_of(__to_acpi_data_node_fwnode, \ 43462306a36Sopenharmony_ci struct acpi_data_node, fwnode) : \ 43562306a36Sopenharmony_ci NULL; \ 43662306a36Sopenharmony_ci }) 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_cistatic inline bool is_acpi_static_node(const struct fwnode_handle *fwnode) 43962306a36Sopenharmony_ci{ 44062306a36Sopenharmony_ci return !IS_ERR_OR_NULL(fwnode) && 44162306a36Sopenharmony_ci fwnode->ops == &acpi_static_fwnode_ops; 44262306a36Sopenharmony_ci} 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_cistatic inline bool acpi_data_node_match(const struct fwnode_handle *fwnode, 44562306a36Sopenharmony_ci const char *name) 44662306a36Sopenharmony_ci{ 44762306a36Sopenharmony_ci return is_acpi_data_node(fwnode) ? 44862306a36Sopenharmony_ci (!strcmp(to_acpi_data_node(fwnode)->name, name)) : false; 44962306a36Sopenharmony_ci} 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_cistatic inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev) 45262306a36Sopenharmony_ci{ 45362306a36Sopenharmony_ci return &adev->fwnode; 45462306a36Sopenharmony_ci} 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_cistatic inline void *acpi_driver_data(struct acpi_device *d) 45762306a36Sopenharmony_ci{ 45862306a36Sopenharmony_ci return d->driver_data; 45962306a36Sopenharmony_ci} 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci#define to_acpi_device(d) container_of(d, struct acpi_device, dev) 46262306a36Sopenharmony_ci#define to_acpi_driver(d) container_of(d, struct acpi_driver, drv) 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_cistatic inline struct acpi_device *acpi_dev_parent(struct acpi_device *adev) 46562306a36Sopenharmony_ci{ 46662306a36Sopenharmony_ci if (adev->dev.parent) 46762306a36Sopenharmony_ci return to_acpi_device(adev->dev.parent); 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_ci return NULL; 47062306a36Sopenharmony_ci} 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_cistatic inline void acpi_set_device_status(struct acpi_device *adev, u32 sta) 47362306a36Sopenharmony_ci{ 47462306a36Sopenharmony_ci *((u32 *)&adev->status) = sta; 47562306a36Sopenharmony_ci} 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_cistatic inline void acpi_set_hp_context(struct acpi_device *adev, 47862306a36Sopenharmony_ci struct acpi_hotplug_context *hp) 47962306a36Sopenharmony_ci{ 48062306a36Sopenharmony_ci hp->self = adev; 48162306a36Sopenharmony_ci adev->hp = hp; 48262306a36Sopenharmony_ci} 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_civoid acpi_initialize_hp_context(struct acpi_device *adev, 48562306a36Sopenharmony_ci struct acpi_hotplug_context *hp, 48662306a36Sopenharmony_ci int (*notify)(struct acpi_device *, u32), 48762306a36Sopenharmony_ci void (*uevent)(struct acpi_device *, u32)); 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci/* acpi_device.dev.bus == &acpi_bus_type */ 49062306a36Sopenharmony_ciextern struct bus_type acpi_bus_type; 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ciint acpi_bus_for_each_dev(int (*fn)(struct device *, void *), void *data); 49362306a36Sopenharmony_ciint acpi_dev_for_each_child(struct acpi_device *adev, 49462306a36Sopenharmony_ci int (*fn)(struct acpi_device *, void *), void *data); 49562306a36Sopenharmony_ciint acpi_dev_for_each_child_reverse(struct acpi_device *adev, 49662306a36Sopenharmony_ci int (*fn)(struct acpi_device *, void *), 49762306a36Sopenharmony_ci void *data); 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci/* 50062306a36Sopenharmony_ci * Events 50162306a36Sopenharmony_ci * ------ 50262306a36Sopenharmony_ci */ 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_cistruct acpi_bus_event { 50562306a36Sopenharmony_ci struct list_head node; 50662306a36Sopenharmony_ci acpi_device_class device_class; 50762306a36Sopenharmony_ci acpi_bus_id bus_id; 50862306a36Sopenharmony_ci u32 type; 50962306a36Sopenharmony_ci u32 data; 51062306a36Sopenharmony_ci}; 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ciextern struct kobject *acpi_kobj; 51362306a36Sopenharmony_ciextern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int); 51462306a36Sopenharmony_civoid acpi_bus_private_data_handler(acpi_handle, void *); 51562306a36Sopenharmony_ciint acpi_bus_get_private_data(acpi_handle, void **); 51662306a36Sopenharmony_ciint acpi_bus_attach_private_data(acpi_handle, void *); 51762306a36Sopenharmony_civoid acpi_bus_detach_private_data(acpi_handle); 51862306a36Sopenharmony_ciint acpi_dev_install_notify_handler(struct acpi_device *adev, 51962306a36Sopenharmony_ci u32 handler_type, 52062306a36Sopenharmony_ci acpi_notify_handler handler); 52162306a36Sopenharmony_civoid acpi_dev_remove_notify_handler(struct acpi_device *adev, 52262306a36Sopenharmony_ci u32 handler_type, 52362306a36Sopenharmony_ci acpi_notify_handler handler); 52462306a36Sopenharmony_ciextern int acpi_notifier_call_chain(struct acpi_device *, u32, u32); 52562306a36Sopenharmony_ciextern int register_acpi_notifier(struct notifier_block *); 52662306a36Sopenharmony_ciextern int unregister_acpi_notifier(struct notifier_block *); 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci/* 52962306a36Sopenharmony_ci * External Functions 53062306a36Sopenharmony_ci */ 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_ciacpi_status acpi_bus_get_status_handle(acpi_handle handle, 53362306a36Sopenharmony_ci unsigned long long *sta); 53462306a36Sopenharmony_ciint acpi_bus_get_status(struct acpi_device *device); 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ciint acpi_bus_set_power(acpi_handle handle, int state); 53762306a36Sopenharmony_ciconst char *acpi_power_state_string(int state); 53862306a36Sopenharmony_ciint acpi_device_set_power(struct acpi_device *device, int state); 53962306a36Sopenharmony_ciint acpi_bus_init_power(struct acpi_device *device); 54062306a36Sopenharmony_ciint acpi_device_fix_up_power(struct acpi_device *device); 54162306a36Sopenharmony_civoid acpi_device_fix_up_power_extended(struct acpi_device *adev); 54262306a36Sopenharmony_civoid acpi_device_fix_up_power_children(struct acpi_device *adev); 54362306a36Sopenharmony_ciint acpi_bus_update_power(acpi_handle handle, int *state_p); 54462306a36Sopenharmony_ciint acpi_device_update_power(struct acpi_device *device, int *state_p); 54562306a36Sopenharmony_cibool acpi_bus_power_manageable(acpi_handle handle); 54662306a36Sopenharmony_civoid acpi_dev_power_up_children_with_adr(struct acpi_device *adev); 54762306a36Sopenharmony_ciu8 acpi_dev_power_state_for_wake(struct acpi_device *adev); 54862306a36Sopenharmony_ciint acpi_device_power_add_dependent(struct acpi_device *adev, 54962306a36Sopenharmony_ci struct device *dev); 55062306a36Sopenharmony_civoid acpi_device_power_remove_dependent(struct acpi_device *adev, 55162306a36Sopenharmony_ci struct device *dev); 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci#ifdef CONFIG_PM 55462306a36Sopenharmony_cibool acpi_bus_can_wakeup(acpi_handle handle); 55562306a36Sopenharmony_ci#else 55662306a36Sopenharmony_cistatic inline bool acpi_bus_can_wakeup(acpi_handle handle) { return false; } 55762306a36Sopenharmony_ci#endif 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_civoid acpi_scan_lock_acquire(void); 56062306a36Sopenharmony_civoid acpi_scan_lock_release(void); 56162306a36Sopenharmony_civoid acpi_lock_hp_context(void); 56262306a36Sopenharmony_civoid acpi_unlock_hp_context(void); 56362306a36Sopenharmony_ciint acpi_scan_add_handler(struct acpi_scan_handler *handler); 56462306a36Sopenharmony_ciint acpi_bus_register_driver(struct acpi_driver *driver); 56562306a36Sopenharmony_civoid acpi_bus_unregister_driver(struct acpi_driver *driver); 56662306a36Sopenharmony_ciint acpi_bus_scan(acpi_handle handle); 56762306a36Sopenharmony_civoid acpi_bus_trim(struct acpi_device *start); 56862306a36Sopenharmony_ciacpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd); 56962306a36Sopenharmony_ciint acpi_match_device_ids(struct acpi_device *device, 57062306a36Sopenharmony_ci const struct acpi_device_id *ids); 57162306a36Sopenharmony_civoid acpi_set_modalias(struct acpi_device *adev, const char *default_id, 57262306a36Sopenharmony_ci char *modalias, size_t len); 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_cistatic inline bool acpi_device_enumerated(struct acpi_device *adev) 57562306a36Sopenharmony_ci{ 57662306a36Sopenharmony_ci return adev && adev->flags.initialized && adev->flags.visited; 57762306a36Sopenharmony_ci} 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci/** 58062306a36Sopenharmony_ci * module_acpi_driver(acpi_driver) - Helper macro for registering an ACPI driver 58162306a36Sopenharmony_ci * @__acpi_driver: acpi_driver struct 58262306a36Sopenharmony_ci * 58362306a36Sopenharmony_ci * Helper macro for ACPI drivers which do not do anything special in module 58462306a36Sopenharmony_ci * init/exit. This eliminates a lot of boilerplate. Each module may only 58562306a36Sopenharmony_ci * use this macro once, and calling it replaces module_init() and module_exit() 58662306a36Sopenharmony_ci */ 58762306a36Sopenharmony_ci#define module_acpi_driver(__acpi_driver) \ 58862306a36Sopenharmony_ci module_driver(__acpi_driver, acpi_bus_register_driver, \ 58962306a36Sopenharmony_ci acpi_bus_unregister_driver) 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci/* 59262306a36Sopenharmony_ci * Bind physical devices with ACPI devices 59362306a36Sopenharmony_ci */ 59462306a36Sopenharmony_cistruct acpi_bus_type { 59562306a36Sopenharmony_ci struct list_head list; 59662306a36Sopenharmony_ci const char *name; 59762306a36Sopenharmony_ci bool (*match)(struct device *dev); 59862306a36Sopenharmony_ci struct acpi_device * (*find_companion)(struct device *); 59962306a36Sopenharmony_ci void (*setup)(struct device *); 60062306a36Sopenharmony_ci}; 60162306a36Sopenharmony_ciint register_acpi_bus_type(struct acpi_bus_type *); 60262306a36Sopenharmony_ciint unregister_acpi_bus_type(struct acpi_bus_type *); 60362306a36Sopenharmony_ciint acpi_bind_one(struct device *dev, struct acpi_device *adev); 60462306a36Sopenharmony_ciint acpi_unbind_one(struct device *dev); 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_cienum acpi_bridge_type { 60762306a36Sopenharmony_ci ACPI_BRIDGE_TYPE_PCIE = 1, 60862306a36Sopenharmony_ci ACPI_BRIDGE_TYPE_CXL, 60962306a36Sopenharmony_ci}; 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_cistruct acpi_pci_root { 61262306a36Sopenharmony_ci struct acpi_device * device; 61362306a36Sopenharmony_ci struct pci_bus *bus; 61462306a36Sopenharmony_ci u16 segment; 61562306a36Sopenharmony_ci int bridge_type; 61662306a36Sopenharmony_ci struct resource secondary; /* downstream bus range */ 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_ci u32 osc_support_set; /* _OSC state of support bits */ 61962306a36Sopenharmony_ci u32 osc_control_set; /* _OSC state of control bits */ 62062306a36Sopenharmony_ci u32 osc_ext_support_set; /* _OSC state of extended support bits */ 62162306a36Sopenharmony_ci u32 osc_ext_control_set; /* _OSC state of extended control bits */ 62262306a36Sopenharmony_ci phys_addr_t mcfg_addr; 62362306a36Sopenharmony_ci}; 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci/* helper */ 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_cibool acpi_dma_supported(const struct acpi_device *adev); 62862306a36Sopenharmony_cienum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev); 62962306a36Sopenharmony_ciint acpi_iommu_fwspec_init(struct device *dev, u32 id, 63062306a36Sopenharmony_ci struct fwnode_handle *fwnode, 63162306a36Sopenharmony_ci const struct iommu_ops *ops); 63262306a36Sopenharmony_ciint acpi_dma_get_range(struct device *dev, const struct bus_dma_region **map); 63362306a36Sopenharmony_ciint acpi_dma_configure_id(struct device *dev, enum dev_dma_attr attr, 63462306a36Sopenharmony_ci const u32 *input_id); 63562306a36Sopenharmony_cistatic inline int acpi_dma_configure(struct device *dev, 63662306a36Sopenharmony_ci enum dev_dma_attr attr) 63762306a36Sopenharmony_ci{ 63862306a36Sopenharmony_ci return acpi_dma_configure_id(dev, attr, NULL); 63962306a36Sopenharmony_ci} 64062306a36Sopenharmony_cistruct acpi_device *acpi_find_child_device(struct acpi_device *parent, 64162306a36Sopenharmony_ci u64 address, bool check_children); 64262306a36Sopenharmony_cistruct acpi_device *acpi_find_child_by_adr(struct acpi_device *adev, 64362306a36Sopenharmony_ci acpi_bus_address adr); 64462306a36Sopenharmony_ciint acpi_is_root_bridge(acpi_handle); 64562306a36Sopenharmony_cistruct acpi_pci_root *acpi_pci_find_root(acpi_handle handle); 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ciint acpi_enable_wakeup_device_power(struct acpi_device *dev, int state); 64862306a36Sopenharmony_ciint acpi_disable_wakeup_device_power(struct acpi_device *dev); 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_ci#ifdef CONFIG_X86 65162306a36Sopenharmony_cibool acpi_device_override_status(struct acpi_device *adev, unsigned long long *status); 65262306a36Sopenharmony_cibool acpi_quirk_skip_acpi_ac_and_battery(void); 65362306a36Sopenharmony_ciint acpi_install_cmos_rtc_space_handler(acpi_handle handle); 65462306a36Sopenharmony_civoid acpi_remove_cmos_rtc_space_handler(acpi_handle handle); 65562306a36Sopenharmony_ci#else 65662306a36Sopenharmony_cistatic inline bool acpi_device_override_status(struct acpi_device *adev, 65762306a36Sopenharmony_ci unsigned long long *status) 65862306a36Sopenharmony_ci{ 65962306a36Sopenharmony_ci return false; 66062306a36Sopenharmony_ci} 66162306a36Sopenharmony_cistatic inline bool acpi_quirk_skip_acpi_ac_and_battery(void) 66262306a36Sopenharmony_ci{ 66362306a36Sopenharmony_ci return false; 66462306a36Sopenharmony_ci} 66562306a36Sopenharmony_cistatic inline int acpi_install_cmos_rtc_space_handler(acpi_handle handle) 66662306a36Sopenharmony_ci{ 66762306a36Sopenharmony_ci return 1; 66862306a36Sopenharmony_ci} 66962306a36Sopenharmony_cistatic inline void acpi_remove_cmos_rtc_space_handler(acpi_handle handle) 67062306a36Sopenharmony_ci{ 67162306a36Sopenharmony_ci} 67262306a36Sopenharmony_ci#endif 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS) 67562306a36Sopenharmony_cibool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev); 67662306a36Sopenharmony_ciint acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip); 67762306a36Sopenharmony_cibool acpi_quirk_skip_gpio_event_handlers(void); 67862306a36Sopenharmony_ci#else 67962306a36Sopenharmony_cistatic inline bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev) 68062306a36Sopenharmony_ci{ 68162306a36Sopenharmony_ci return false; 68262306a36Sopenharmony_ci} 68362306a36Sopenharmony_cistatic inline int 68462306a36Sopenharmony_ciacpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip) 68562306a36Sopenharmony_ci{ 68662306a36Sopenharmony_ci *skip = false; 68762306a36Sopenharmony_ci return 0; 68862306a36Sopenharmony_ci} 68962306a36Sopenharmony_cistatic inline bool acpi_quirk_skip_gpio_event_handlers(void) 69062306a36Sopenharmony_ci{ 69162306a36Sopenharmony_ci return false; 69262306a36Sopenharmony_ci} 69362306a36Sopenharmony_ci#endif 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci#ifdef CONFIG_PM 69662306a36Sopenharmony_civoid acpi_pm_wakeup_event(struct device *dev); 69762306a36Sopenharmony_ciacpi_status acpi_add_pm_notifier(struct acpi_device *adev, struct device *dev, 69862306a36Sopenharmony_ci void (*func)(struct acpi_device_wakeup_context *context)); 69962306a36Sopenharmony_ciacpi_status acpi_remove_pm_notifier(struct acpi_device *adev); 70062306a36Sopenharmony_cibool acpi_pm_device_can_wakeup(struct device *dev); 70162306a36Sopenharmony_ciint acpi_pm_device_sleep_state(struct device *, int *, int); 70262306a36Sopenharmony_ciint acpi_pm_set_device_wakeup(struct device *dev, bool enable); 70362306a36Sopenharmony_ci#else 70462306a36Sopenharmony_cistatic inline void acpi_pm_wakeup_event(struct device *dev) 70562306a36Sopenharmony_ci{ 70662306a36Sopenharmony_ci} 70762306a36Sopenharmony_cistatic inline acpi_status acpi_add_pm_notifier(struct acpi_device *adev, 70862306a36Sopenharmony_ci struct device *dev, 70962306a36Sopenharmony_ci void (*func)(struct acpi_device_wakeup_context *context)) 71062306a36Sopenharmony_ci{ 71162306a36Sopenharmony_ci return AE_SUPPORT; 71262306a36Sopenharmony_ci} 71362306a36Sopenharmony_cistatic inline acpi_status acpi_remove_pm_notifier(struct acpi_device *adev) 71462306a36Sopenharmony_ci{ 71562306a36Sopenharmony_ci return AE_SUPPORT; 71662306a36Sopenharmony_ci} 71762306a36Sopenharmony_cistatic inline bool acpi_pm_device_can_wakeup(struct device *dev) 71862306a36Sopenharmony_ci{ 71962306a36Sopenharmony_ci return false; 72062306a36Sopenharmony_ci} 72162306a36Sopenharmony_cistatic inline int acpi_pm_device_sleep_state(struct device *d, int *p, int m) 72262306a36Sopenharmony_ci{ 72362306a36Sopenharmony_ci if (p) 72462306a36Sopenharmony_ci *p = ACPI_STATE_D0; 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci return (m >= ACPI_STATE_D0 && m <= ACPI_STATE_D3_COLD) ? 72762306a36Sopenharmony_ci m : ACPI_STATE_D0; 72862306a36Sopenharmony_ci} 72962306a36Sopenharmony_cistatic inline int acpi_pm_set_device_wakeup(struct device *dev, bool enable) 73062306a36Sopenharmony_ci{ 73162306a36Sopenharmony_ci return -ENODEV; 73262306a36Sopenharmony_ci} 73362306a36Sopenharmony_ci#endif 73462306a36Sopenharmony_ci 73562306a36Sopenharmony_ci#ifdef CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT 73662306a36Sopenharmony_cibool acpi_sleep_state_supported(u8 sleep_state); 73762306a36Sopenharmony_ci#else 73862306a36Sopenharmony_cistatic inline bool acpi_sleep_state_supported(u8 sleep_state) { return false; } 73962306a36Sopenharmony_ci#endif 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_ci#ifdef CONFIG_ACPI_SLEEP 74262306a36Sopenharmony_ciu32 acpi_target_system_state(void); 74362306a36Sopenharmony_ci#else 74462306a36Sopenharmony_cistatic inline u32 acpi_target_system_state(void) { return ACPI_STATE_S0; } 74562306a36Sopenharmony_ci#endif 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_cistatic inline bool acpi_device_power_manageable(struct acpi_device *adev) 74862306a36Sopenharmony_ci{ 74962306a36Sopenharmony_ci return adev->flags.power_manageable; 75062306a36Sopenharmony_ci} 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_cistatic inline bool acpi_device_can_wakeup(struct acpi_device *adev) 75362306a36Sopenharmony_ci{ 75462306a36Sopenharmony_ci return adev->wakeup.flags.valid; 75562306a36Sopenharmony_ci} 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_cistatic inline bool acpi_device_can_poweroff(struct acpi_device *adev) 75862306a36Sopenharmony_ci{ 75962306a36Sopenharmony_ci return adev->power.states[ACPI_STATE_D3_COLD].flags.valid || 76062306a36Sopenharmony_ci ((acpi_gbl_FADT.header.revision < 6) && 76162306a36Sopenharmony_ci adev->power.states[ACPI_STATE_D3_HOT].flags.explicit_set); 76262306a36Sopenharmony_ci} 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_cibool acpi_dev_hid_uid_match(struct acpi_device *adev, const char *hid2, const char *uid2); 76562306a36Sopenharmony_ciint acpi_dev_uid_to_integer(struct acpi_device *adev, u64 *integer); 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_civoid acpi_dev_clear_dependencies(struct acpi_device *supplier); 76862306a36Sopenharmony_cibool acpi_dev_ready_for_enumeration(const struct acpi_device *device); 76962306a36Sopenharmony_cistruct acpi_device *acpi_dev_get_next_consumer_dev(struct acpi_device *supplier, 77062306a36Sopenharmony_ci struct acpi_device *start); 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_ci/** 77362306a36Sopenharmony_ci * for_each_acpi_consumer_dev - iterate over the consumer ACPI devices for a 77462306a36Sopenharmony_ci * given supplier 77562306a36Sopenharmony_ci * @supplier: Pointer to the supplier's ACPI device 77662306a36Sopenharmony_ci * @consumer: Pointer to &struct acpi_device to hold the consumer, initially NULL 77762306a36Sopenharmony_ci */ 77862306a36Sopenharmony_ci#define for_each_acpi_consumer_dev(supplier, consumer) \ 77962306a36Sopenharmony_ci for (consumer = acpi_dev_get_next_consumer_dev(supplier, NULL); \ 78062306a36Sopenharmony_ci consumer; \ 78162306a36Sopenharmony_ci consumer = acpi_dev_get_next_consumer_dev(supplier, consumer)) 78262306a36Sopenharmony_ci 78362306a36Sopenharmony_cistruct acpi_device * 78462306a36Sopenharmony_ciacpi_dev_get_next_match_dev(struct acpi_device *adev, const char *hid, const char *uid, s64 hrv); 78562306a36Sopenharmony_cistruct acpi_device * 78662306a36Sopenharmony_ciacpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv); 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci/** 78962306a36Sopenharmony_ci * for_each_acpi_dev_match - iterate over ACPI devices that matching the criteria 79062306a36Sopenharmony_ci * @adev: pointer to the matching ACPI device, NULL at the end of the loop 79162306a36Sopenharmony_ci * @hid: Hardware ID of the device. 79262306a36Sopenharmony_ci * @uid: Unique ID of the device, pass NULL to not check _UID 79362306a36Sopenharmony_ci * @hrv: Hardware Revision of the device, pass -1 to not check _HRV 79462306a36Sopenharmony_ci * 79562306a36Sopenharmony_ci * The caller is responsible for invoking acpi_dev_put() on the returned device. 79662306a36Sopenharmony_ci */ 79762306a36Sopenharmony_ci#define for_each_acpi_dev_match(adev, hid, uid, hrv) \ 79862306a36Sopenharmony_ci for (adev = acpi_dev_get_first_match_dev(hid, uid, hrv); \ 79962306a36Sopenharmony_ci adev; \ 80062306a36Sopenharmony_ci adev = acpi_dev_get_next_match_dev(adev, hid, uid, hrv)) 80162306a36Sopenharmony_ci 80262306a36Sopenharmony_cistatic inline struct acpi_device *acpi_dev_get(struct acpi_device *adev) 80362306a36Sopenharmony_ci{ 80462306a36Sopenharmony_ci return adev ? to_acpi_device(get_device(&adev->dev)) : NULL; 80562306a36Sopenharmony_ci} 80662306a36Sopenharmony_ci 80762306a36Sopenharmony_cistatic inline void acpi_dev_put(struct acpi_device *adev) 80862306a36Sopenharmony_ci{ 80962306a36Sopenharmony_ci if (adev) 81062306a36Sopenharmony_ci put_device(&adev->dev); 81162306a36Sopenharmony_ci} 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_cistruct acpi_device *acpi_fetch_acpi_dev(acpi_handle handle); 81462306a36Sopenharmony_cistruct acpi_device *acpi_get_acpi_dev(acpi_handle handle); 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_cistatic inline void acpi_put_acpi_dev(struct acpi_device *adev) 81762306a36Sopenharmony_ci{ 81862306a36Sopenharmony_ci acpi_dev_put(adev); 81962306a36Sopenharmony_ci} 82062306a36Sopenharmony_ci#else /* CONFIG_ACPI */ 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_cistatic inline int register_acpi_bus_type(void *bus) { return 0; } 82362306a36Sopenharmony_cistatic inline int unregister_acpi_bus_type(void *bus) { return 0; } 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_ci#endif /* CONFIG_ACPI */ 82662306a36Sopenharmony_ci 82762306a36Sopenharmony_ci#endif /*__ACPI_BUS_H__*/ 828