| 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 | |
| 15 | /** |
| 16 | * struct wmi_device - WMI device structure |
| 17 | * @dev: Device associated with this WMI device |
| 18 | * @setable: True for devices implementing the Set Control Method |
| 19 | * @driver_override: Driver name to force a match; do not set directly, |
| 20 | * because core frees it; use driver_set_override() to |
| 21 | * set or clear it. |
| 22 | * |
| 23 | * This represents WMI devices discovered by the WMI driver core. |
| 24 | */ |
| 25 | struct wmi_device { |
| 26 | struct device dev; |
| 27 | bool setable; |
| 28 | const char *driver_override; |
| 29 | }; |
| 30 | |
| 31 | /** |
| 32 | * to_wmi_device() - Helper macro to cast a device to a wmi_device |
| 33 | * @device: device struct |
| 34 | * |
| 35 | * Cast a struct device to a struct wmi_device. |
| 36 | */ |
| 37 | #define to_wmi_device(device) container_of_const(device, struct wmi_device, dev) |
| 38 | |
| 39 | extern acpi_status wmidev_evaluate_method(struct wmi_device *wdev, |
| 40 | u8 instance, u32 method_id, |
| 41 | const struct acpi_buffer *in, |
| 42 | struct acpi_buffer *out); |
| 43 | |
| 44 | extern union acpi_object *wmidev_block_query(struct wmi_device *wdev, |
| 45 | u8 instance); |
| 46 | |
| 47 | acpi_status wmidev_block_set(struct wmi_device *wdev, u8 instance, const struct acpi_buffer *in); |
| 48 | |
| 49 | u8 wmidev_instance_count(struct wmi_device *wdev); |
| 50 | |
| 51 | /** |
| 52 | * struct wmi_driver - WMI driver structure |
| 53 | * @driver: Driver model structure |
| 54 | * @id_table: List of WMI GUIDs supported by this driver |
| 55 | * @no_notify_data: Driver supports WMI events which provide no event data |
| 56 | * @no_singleton: Driver can be instantiated multiple times |
| 57 | * @probe: Callback for device binding |
| 58 | * @remove: Callback for device unbinding |
| 59 | * @shutdown: Callback for device shutdown |
| 60 | * @notify: Callback for receiving WMI events |
| 61 | * |
| 62 | * This represents WMI drivers which handle WMI devices. |
| 63 | */ |
| 64 | struct wmi_driver { |
| 65 | struct device_driver driver; |
| 66 | const struct wmi_device_id *id_table; |
| 67 | bool no_notify_data; |
| 68 | bool no_singleton; |
| 69 | |
| 70 | int (*probe)(struct wmi_device *wdev, const void *context); |
| 71 | void (*remove)(struct wmi_device *wdev); |
| 72 | void (*shutdown)(struct wmi_device *wdev); |
| 73 | void (*notify)(struct wmi_device *device, union acpi_object *data); |
| 74 | }; |
| 75 | |
| 76 | /** |
| 77 | * to_wmi_driver() - Helper macro to cast a driver to a wmi_driver |
| 78 | * @drv: driver struct |
| 79 | * |
| 80 | * Cast a struct device_driver to a struct wmi_driver. |
| 81 | */ |
| 82 | #define to_wmi_driver(drv) container_of_const(drv, struct wmi_driver, driver) |
| 83 | |
| 84 | extern int __must_check __wmi_driver_register(struct wmi_driver *driver, |
| 85 | struct module *owner); |
| 86 | extern void wmi_driver_unregister(struct wmi_driver *driver); |
| 87 | |
| 88 | /** |
| 89 | * wmi_driver_register() - Helper macro to register a WMI driver |
| 90 | * @driver: wmi_driver struct |
| 91 | * |
| 92 | * Helper macro for registering a WMI driver. It automatically passes |
| 93 | * THIS_MODULE to the underlying function. |
| 94 | */ |
| 95 | #define wmi_driver_register(driver) __wmi_driver_register((driver), THIS_MODULE) |
| 96 | |
| 97 | /** |
| 98 | * module_wmi_driver() - Helper macro to register/unregister a WMI driver |
| 99 | * @__wmi_driver: wmi_driver struct |
| 100 | * |
| 101 | * Helper macro for WMI drivers which do not do anything special in module |
| 102 | * init/exit. This eliminates a lot of boilerplate. Each module may only |
| 103 | * use this macro once, and calling it replaces module_init() and module_exit(). |
| 104 | */ |
| 105 | #define module_wmi_driver(__wmi_driver) \ |
| 106 | module_driver(__wmi_driver, wmi_driver_register, \ |
| 107 | wmi_driver_unregister) |
| 108 | |
| 109 | #endif |
| 110 | |