xref: /OK3568_Linux_fs/kernel/drivers/acpi/internal.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * acpi/internal.h
4*4882a593Smuzhiyun  * For use by Linux/ACPI infrastructure, not drivers
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright (c) 2009, Intel Corporation.
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef _ACPI_INTERNAL_H_
10*4882a593Smuzhiyun #define _ACPI_INTERNAL_H_
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/idr.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define PREFIX "ACPI: "
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun int early_acpi_osi_init(void);
17*4882a593Smuzhiyun int acpi_osi_init(void);
18*4882a593Smuzhiyun acpi_status acpi_os_initialize1(void);
19*4882a593Smuzhiyun int acpi_scan_init(void);
20*4882a593Smuzhiyun #ifdef CONFIG_PCI
21*4882a593Smuzhiyun void acpi_pci_root_init(void);
22*4882a593Smuzhiyun void acpi_pci_link_init(void);
23*4882a593Smuzhiyun #else
acpi_pci_root_init(void)24*4882a593Smuzhiyun static inline void acpi_pci_root_init(void) {}
acpi_pci_link_init(void)25*4882a593Smuzhiyun static inline void acpi_pci_link_init(void) {}
26*4882a593Smuzhiyun #endif
27*4882a593Smuzhiyun void acpi_processor_init(void);
28*4882a593Smuzhiyun void acpi_platform_init(void);
29*4882a593Smuzhiyun void acpi_pnp_init(void);
30*4882a593Smuzhiyun void acpi_int340x_thermal_init(void);
31*4882a593Smuzhiyun #ifdef CONFIG_ARM_AMBA
32*4882a593Smuzhiyun void acpi_amba_init(void);
33*4882a593Smuzhiyun #else
acpi_amba_init(void)34*4882a593Smuzhiyun static inline void acpi_amba_init(void) {}
35*4882a593Smuzhiyun #endif
36*4882a593Smuzhiyun int acpi_sysfs_init(void);
37*4882a593Smuzhiyun void acpi_gpe_apply_masked_gpes(void);
38*4882a593Smuzhiyun void acpi_container_init(void);
39*4882a593Smuzhiyun void acpi_memory_hotplug_init(void);
40*4882a593Smuzhiyun #ifdef	CONFIG_ACPI_HOTPLUG_IOAPIC
41*4882a593Smuzhiyun void pci_ioapic_remove(struct acpi_pci_root *root);
42*4882a593Smuzhiyun int acpi_ioapic_remove(struct acpi_pci_root *root);
43*4882a593Smuzhiyun #else
pci_ioapic_remove(struct acpi_pci_root * root)44*4882a593Smuzhiyun static inline void pci_ioapic_remove(struct acpi_pci_root *root) { return; }
acpi_ioapic_remove(struct acpi_pci_root * root)45*4882a593Smuzhiyun static inline int acpi_ioapic_remove(struct acpi_pci_root *root) { return 0; }
46*4882a593Smuzhiyun #endif
47*4882a593Smuzhiyun #ifdef CONFIG_ACPI_DOCK
48*4882a593Smuzhiyun void register_dock_dependent_device(struct acpi_device *adev,
49*4882a593Smuzhiyun 				    acpi_handle dshandle);
50*4882a593Smuzhiyun int dock_notify(struct acpi_device *adev, u32 event);
51*4882a593Smuzhiyun void acpi_dock_add(struct acpi_device *adev);
52*4882a593Smuzhiyun #else
register_dock_dependent_device(struct acpi_device * adev,acpi_handle dshandle)53*4882a593Smuzhiyun static inline void register_dock_dependent_device(struct acpi_device *adev,
54*4882a593Smuzhiyun 						  acpi_handle dshandle) {}
dock_notify(struct acpi_device * adev,u32 event)55*4882a593Smuzhiyun static inline int dock_notify(struct acpi_device *adev, u32 event) { return -ENODEV; }
acpi_dock_add(struct acpi_device * adev)56*4882a593Smuzhiyun static inline void acpi_dock_add(struct acpi_device *adev) {}
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun #ifdef CONFIG_X86
59*4882a593Smuzhiyun void acpi_cmos_rtc_init(void);
60*4882a593Smuzhiyun #else
acpi_cmos_rtc_init(void)61*4882a593Smuzhiyun static inline void acpi_cmos_rtc_init(void) {}
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun int acpi_rev_override_setup(char *str);
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug,
66*4882a593Smuzhiyun 				    const char *name);
67*4882a593Smuzhiyun int acpi_scan_add_handler_with_hotplug(struct acpi_scan_handler *handler,
68*4882a593Smuzhiyun 				       const char *hotplug_profile_name);
69*4882a593Smuzhiyun void acpi_scan_hotplug_enabled(struct acpi_hotplug_profile *hotplug, bool val);
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_FS
72*4882a593Smuzhiyun extern struct dentry *acpi_debugfs_dir;
73*4882a593Smuzhiyun void acpi_debugfs_init(void);
74*4882a593Smuzhiyun #else
acpi_debugfs_init(void)75*4882a593Smuzhiyun static inline void acpi_debugfs_init(void) { return; }
76*4882a593Smuzhiyun #endif
77*4882a593Smuzhiyun #ifdef CONFIG_PCI
78*4882a593Smuzhiyun void acpi_lpss_init(void);
79*4882a593Smuzhiyun #else
acpi_lpss_init(void)80*4882a593Smuzhiyun static inline void acpi_lpss_init(void) {}
81*4882a593Smuzhiyun #endif
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun void acpi_apd_init(void);
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun acpi_status acpi_hotplug_schedule(struct acpi_device *adev, u32 src);
86*4882a593Smuzhiyun bool acpi_queue_hotplug_work(struct work_struct *work);
87*4882a593Smuzhiyun void acpi_device_hotplug(struct acpi_device *adev, u32 src);
88*4882a593Smuzhiyun bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun acpi_status acpi_sysfs_table_handler(u32 event, void *table, void *context);
91*4882a593Smuzhiyun void acpi_scan_table_handler(u32 event, void *table, void *context);
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun /* --------------------------------------------------------------------------
94*4882a593Smuzhiyun                      Device Node Initialization / Removal
95*4882a593Smuzhiyun    -------------------------------------------------------------------------- */
96*4882a593Smuzhiyun #define ACPI_STA_DEFAULT (ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | \
97*4882a593Smuzhiyun 			  ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING)
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun extern struct list_head acpi_bus_id_list;
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define ACPI_MAX_DEVICE_INSTANCES	4096
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun struct acpi_device_bus_id {
104*4882a593Smuzhiyun 	const char *bus_id;
105*4882a593Smuzhiyun 	struct ida instance_ida;
106*4882a593Smuzhiyun 	struct list_head node;
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun int acpi_device_add(struct acpi_device *device,
110*4882a593Smuzhiyun 		    void (*release)(struct device *));
111*4882a593Smuzhiyun void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
112*4882a593Smuzhiyun 			     int type, unsigned long long sta);
113*4882a593Smuzhiyun int acpi_device_setup_files(struct acpi_device *dev);
114*4882a593Smuzhiyun void acpi_device_remove_files(struct acpi_device *dev);
115*4882a593Smuzhiyun void acpi_device_add_finalize(struct acpi_device *device);
116*4882a593Smuzhiyun void acpi_free_pnp_ids(struct acpi_device_pnp *pnp);
117*4882a593Smuzhiyun bool acpi_device_is_present(const struct acpi_device *adev);
118*4882a593Smuzhiyun bool acpi_device_is_battery(struct acpi_device *adev);
119*4882a593Smuzhiyun bool acpi_device_is_first_physical_node(struct acpi_device *adev,
120*4882a593Smuzhiyun 					const struct device *dev);
121*4882a593Smuzhiyun int acpi_bus_register_early_device(int type);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /* --------------------------------------------------------------------------
124*4882a593Smuzhiyun                      Device Matching and Notification
125*4882a593Smuzhiyun    -------------------------------------------------------------------------- */
126*4882a593Smuzhiyun struct acpi_device *acpi_companion_match(const struct device *dev);
127*4882a593Smuzhiyun int __acpi_device_uevent_modalias(struct acpi_device *adev,
128*4882a593Smuzhiyun 				  struct kobj_uevent_env *env);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /* --------------------------------------------------------------------------
131*4882a593Smuzhiyun                                   Power Resource
132*4882a593Smuzhiyun    -------------------------------------------------------------------------- */
133*4882a593Smuzhiyun int acpi_power_init(void);
134*4882a593Smuzhiyun void acpi_power_resources_list_free(struct list_head *list);
135*4882a593Smuzhiyun int acpi_extract_power_resources(union acpi_object *package, unsigned int start,
136*4882a593Smuzhiyun 				 struct list_head *list);
137*4882a593Smuzhiyun int acpi_add_power_resource(acpi_handle handle);
138*4882a593Smuzhiyun void acpi_power_add_remove_device(struct acpi_device *adev, bool add);
139*4882a593Smuzhiyun int acpi_power_wakeup_list_init(struct list_head *list, int *system_level);
140*4882a593Smuzhiyun int acpi_device_sleep_wake(struct acpi_device *dev,
141*4882a593Smuzhiyun 			   int enable, int sleep_state, int dev_state);
142*4882a593Smuzhiyun int acpi_power_get_inferred_state(struct acpi_device *device, int *state);
143*4882a593Smuzhiyun int acpi_power_on_resources(struct acpi_device *device, int state);
144*4882a593Smuzhiyun int acpi_power_transition(struct acpi_device *device, int state);
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /* --------------------------------------------------------------------------
147*4882a593Smuzhiyun                               Device Power Management
148*4882a593Smuzhiyun    -------------------------------------------------------------------------- */
149*4882a593Smuzhiyun int acpi_device_get_power(struct acpi_device *device, int *state);
150*4882a593Smuzhiyun int acpi_wakeup_device_init(void);
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /* --------------------------------------------------------------------------
153*4882a593Smuzhiyun                                   Processor
154*4882a593Smuzhiyun    -------------------------------------------------------------------------- */
155*4882a593Smuzhiyun #ifdef CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC
156*4882a593Smuzhiyun void acpi_early_processor_set_pdc(void);
157*4882a593Smuzhiyun #else
acpi_early_processor_set_pdc(void)158*4882a593Smuzhiyun static inline void acpi_early_processor_set_pdc(void) {}
159*4882a593Smuzhiyun #endif
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #ifdef CONFIG_X86
162*4882a593Smuzhiyun void acpi_early_processor_osc(void);
163*4882a593Smuzhiyun #else
acpi_early_processor_osc(void)164*4882a593Smuzhiyun static inline void acpi_early_processor_osc(void) {}
165*4882a593Smuzhiyun #endif
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun /* --------------------------------------------------------------------------
168*4882a593Smuzhiyun                                   Embedded Controller
169*4882a593Smuzhiyun    -------------------------------------------------------------------------- */
170*4882a593Smuzhiyun struct acpi_ec {
171*4882a593Smuzhiyun 	acpi_handle handle;
172*4882a593Smuzhiyun 	int gpe;
173*4882a593Smuzhiyun 	int irq;
174*4882a593Smuzhiyun 	unsigned long command_addr;
175*4882a593Smuzhiyun 	unsigned long data_addr;
176*4882a593Smuzhiyun 	bool global_lock;
177*4882a593Smuzhiyun 	unsigned long flags;
178*4882a593Smuzhiyun 	unsigned long reference_count;
179*4882a593Smuzhiyun 	struct mutex mutex;
180*4882a593Smuzhiyun 	wait_queue_head_t wait;
181*4882a593Smuzhiyun 	struct list_head list;
182*4882a593Smuzhiyun 	struct transaction *curr;
183*4882a593Smuzhiyun 	spinlock_t lock;
184*4882a593Smuzhiyun 	struct work_struct work;
185*4882a593Smuzhiyun 	unsigned long timestamp;
186*4882a593Smuzhiyun 	unsigned long nr_pending_queries;
187*4882a593Smuzhiyun 	unsigned int events_in_progress;
188*4882a593Smuzhiyun 	unsigned int queries_in_progress;
189*4882a593Smuzhiyun 	bool busy_polling;
190*4882a593Smuzhiyun 	unsigned int polling_guard;
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun extern struct acpi_ec *first_ec;
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun /* If we find an EC via the ECDT, we need to keep a ptr to its context */
196*4882a593Smuzhiyun /* External interfaces use first EC only, so remember */
197*4882a593Smuzhiyun typedef int (*acpi_ec_query_func) (void *data);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun void acpi_ec_init(void);
200*4882a593Smuzhiyun void acpi_ec_ecdt_probe(void);
201*4882a593Smuzhiyun void acpi_ec_dsdt_probe(void);
202*4882a593Smuzhiyun void acpi_ec_block_transactions(void);
203*4882a593Smuzhiyun void acpi_ec_unblock_transactions(void);
204*4882a593Smuzhiyun int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
205*4882a593Smuzhiyun 			      acpi_handle handle, acpi_ec_query_func func,
206*4882a593Smuzhiyun 			      void *data);
207*4882a593Smuzhiyun void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit);
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
210*4882a593Smuzhiyun void acpi_ec_flush_work(void);
211*4882a593Smuzhiyun bool acpi_ec_dispatch_gpe(void);
212*4882a593Smuzhiyun #endif
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /*--------------------------------------------------------------------------
216*4882a593Smuzhiyun                                   Suspend/Resume
217*4882a593Smuzhiyun   -------------------------------------------------------------------------- */
218*4882a593Smuzhiyun #ifdef CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT
219*4882a593Smuzhiyun extern bool acpi_s2idle_wakeup(void);
220*4882a593Smuzhiyun extern int acpi_sleep_init(void);
221*4882a593Smuzhiyun #else
acpi_s2idle_wakeup(void)222*4882a593Smuzhiyun static inline bool acpi_s2idle_wakeup(void) { return false; }
acpi_sleep_init(void)223*4882a593Smuzhiyun static inline int acpi_sleep_init(void) { return -ENXIO; }
224*4882a593Smuzhiyun #endif
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun #ifdef CONFIG_ACPI_SLEEP
227*4882a593Smuzhiyun void acpi_sleep_proc_init(void);
228*4882a593Smuzhiyun int suspend_nvs_alloc(void);
229*4882a593Smuzhiyun void suspend_nvs_free(void);
230*4882a593Smuzhiyun int suspend_nvs_save(void);
231*4882a593Smuzhiyun void suspend_nvs_restore(void);
232*4882a593Smuzhiyun #else
acpi_sleep_proc_init(void)233*4882a593Smuzhiyun static inline void acpi_sleep_proc_init(void) {}
suspend_nvs_alloc(void)234*4882a593Smuzhiyun static inline int suspend_nvs_alloc(void) { return 0; }
suspend_nvs_free(void)235*4882a593Smuzhiyun static inline void suspend_nvs_free(void) {}
suspend_nvs_save(void)236*4882a593Smuzhiyun static inline int suspend_nvs_save(void) { return 0; }
suspend_nvs_restore(void)237*4882a593Smuzhiyun static inline void suspend_nvs_restore(void) {}
238*4882a593Smuzhiyun #endif
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /*--------------------------------------------------------------------------
241*4882a593Smuzhiyun 				Device properties
242*4882a593Smuzhiyun   -------------------------------------------------------------------------- */
243*4882a593Smuzhiyun #define ACPI_DT_NAMESPACE_HID	"PRP0001"
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun void acpi_init_properties(struct acpi_device *adev);
246*4882a593Smuzhiyun void acpi_free_properties(struct acpi_device *adev);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun #ifdef CONFIG_X86
249*4882a593Smuzhiyun void acpi_extract_apple_properties(struct acpi_device *adev);
250*4882a593Smuzhiyun #else
acpi_extract_apple_properties(struct acpi_device * adev)251*4882a593Smuzhiyun static inline void acpi_extract_apple_properties(struct acpi_device *adev) {}
252*4882a593Smuzhiyun #endif
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun /*--------------------------------------------------------------------------
255*4882a593Smuzhiyun 				Watchdog
256*4882a593Smuzhiyun   -------------------------------------------------------------------------- */
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun #ifdef CONFIG_ACPI_WATCHDOG
259*4882a593Smuzhiyun void acpi_watchdog_init(void);
260*4882a593Smuzhiyun #else
acpi_watchdog_init(void)261*4882a593Smuzhiyun static inline void acpi_watchdog_init(void) {}
262*4882a593Smuzhiyun #endif
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun #ifdef CONFIG_ACPI_LPIT
265*4882a593Smuzhiyun void acpi_init_lpit(void);
266*4882a593Smuzhiyun #else
acpi_init_lpit(void)267*4882a593Smuzhiyun static inline void acpi_init_lpit(void) { }
268*4882a593Smuzhiyun #endif
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun #endif /* _ACPI_INTERNAL_H_ */
271