1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * wmi.h - ACPI WMI interface 4 * 5 * Copyright (c) 2015 Andrew Lutomirski 6 */ 7 8 #ifndef _LINUX_WMI_H 9 #define _LINUX_WMI_H 10 11 #include <linux/device.h> 12 #include <linux/acpi.h> 13 #include <linux/mod_devicetable.h> 14 #include <uapi/linux/wmi.h> 15 16 /** 17 * struct wmi_device - WMI device structure 18 * @dev: Device associated with this WMI device 19 * @setable: True for devices implementing the Set Control Method 20 * 21 * This represents WMI devices discovered by the WMI driver core. 22 */ 23 struct wmi_device { 24 struct device dev; 25 26 /* private: used by the WMI driver core */ 27 bool setable; 28 }; 29 30 extern acpi_status wmidev_evaluate_method(struct wmi_device *wdev, 31 u8 instance, u32 method_id, 32 const struct acpi_buffer *in, 33 struct acpi_buffer *out); 34 35 extern union acpi_object *wmidev_block_query(struct wmi_device *wdev, 36 u8 instance); 37 38 extern int set_required_buffer_size(struct wmi_device *wdev, u64 length); 39 40 /** 41 * struct wmi_driver - WMI driver structure 42 * @driver: Driver model structure 43 * @id_table: List of WMI GUIDs supported by this driver 44 * @no_notify_data: WMI events provide no event data 45 * @probe: Callback for device binding 46 * @remove: Callback for device unbinding 47 * @notify: Callback for receiving WMI events 48 * @filter_callback: Callback for filtering device IOCTLs 49 * 50 * This represents WMI drivers which handle WMI devices. 51 * @filter_callback is only necessary for drivers which 52 * want to set up a WMI IOCTL interface. 53 */ 54 struct wmi_driver { 55 struct device_driver driver; 56 const struct wmi_device_id *id_table; 57 bool no_notify_data; 58 59 int (*probe)(struct wmi_device *wdev, const void *context); 60 void (*remove)(struct wmi_device *wdev); 61 void (*notify)(struct wmi_device *device, union acpi_object *data); 62 long (*filter_callback)(struct wmi_device *wdev, unsigned int cmd, 63 struct wmi_ioctl_buffer *arg); 64 }; 65 66 extern int __must_check __wmi_driver_register(struct wmi_driver *driver, 67 struct module *owner); 68 extern void wmi_driver_unregister(struct wmi_driver *driver); 69 70 /** 71 * wmi_driver_register() - Helper macro to register a WMI driver 72 * @driver: wmi_driver struct 73 * 74 * Helper macro for registering a WMI driver. It automatically passes 75 * THIS_MODULE to the underlying function. 76 */ 77 #define wmi_driver_register(driver) __wmi_driver_register((driver), THIS_MODULE) 78 79 /** 80 * module_wmi_driver() - Helper macro to register/unregister a WMI driver 81 * @__wmi_driver: wmi_driver struct 82 * 83 * Helper macro for WMI drivers which do not do anything special in module 84 * init/exit. This eliminates a lot of boilerplate. Each module may only 85 * use this macro once, and calling it replaces module_init() and module_exit(). 86 */ 87 #define module_wmi_driver(__wmi_driver) \ 88 module_driver(__wmi_driver, wmi_driver_register, \ 89 wmi_driver_unregister) 90 91 #endif 92