1c5ebbaf1SKurt Borja /* SPDX-License-Identifier: GPL-2.0-or-later */ 2c5ebbaf1SKurt Borja /* 3c5ebbaf1SKurt Borja * Alienware WMI special features driver 4c5ebbaf1SKurt Borja * 5c5ebbaf1SKurt Borja * Copyright (C) 2014 Dell Inc <Dell.Client.Kernel@dell.com> 6c5ebbaf1SKurt Borja * Copyright (C) 2024 Kurt Borja <kuurtb@gmail.com> 7c5ebbaf1SKurt Borja */ 8c5ebbaf1SKurt Borja 9c5ebbaf1SKurt Borja #ifndef _ALIENWARE_WMI_H_ 10c5ebbaf1SKurt Borja #define _ALIENWARE_WMI_H_ 11c5ebbaf1SKurt Borja 12c5ebbaf1SKurt Borja #include <linux/leds.h> 13c5ebbaf1SKurt Borja #include <linux/platform_device.h> 14c5ebbaf1SKurt Borja #include <linux/wmi.h> 15c5ebbaf1SKurt Borja 16c5ebbaf1SKurt Borja #define LEGACY_CONTROL_GUID "A90597CE-A997-11DA-B012-B622A1EF5492" 17c5ebbaf1SKurt Borja #define LEGACY_POWER_CONTROL_GUID "A80593CE-A997-11DA-B012-B622A1EF5492" 18c5ebbaf1SKurt Borja #define WMAX_CONTROL_GUID "A70591CE-A997-11DA-B012-B622A1EF5492" 19c5ebbaf1SKurt Borja 20c5ebbaf1SKurt Borja enum INTERFACE_FLAGS { 21c5ebbaf1SKurt Borja LEGACY, 22c5ebbaf1SKurt Borja WMAX, 23c5ebbaf1SKurt Borja }; 24c5ebbaf1SKurt Borja 25c5ebbaf1SKurt Borja enum LEGACY_CONTROL_STATES { 26c5ebbaf1SKurt Borja LEGACY_RUNNING = 1, 27c5ebbaf1SKurt Borja LEGACY_BOOTING = 0, 28c5ebbaf1SKurt Borja LEGACY_SUSPEND = 3, 29c5ebbaf1SKurt Borja }; 30c5ebbaf1SKurt Borja 31c5ebbaf1SKurt Borja enum WMAX_CONTROL_STATES { 32c5ebbaf1SKurt Borja WMAX_RUNNING = 0xFF, 33c5ebbaf1SKurt Borja WMAX_BOOTING = 0, 34c5ebbaf1SKurt Borja WMAX_SUSPEND = 3, 35c5ebbaf1SKurt Borja }; 36c5ebbaf1SKurt Borja 37c5ebbaf1SKurt Borja struct alienfx_quirks { 38c5ebbaf1SKurt Borja u8 num_zones; 39c5ebbaf1SKurt Borja bool hdmi_mux; 40c5ebbaf1SKurt Borja bool amplifier; 41c5ebbaf1SKurt Borja bool deepslp; 42c5ebbaf1SKurt Borja }; 43c5ebbaf1SKurt Borja 44c5ebbaf1SKurt Borja struct color_platform { 45c5ebbaf1SKurt Borja u8 blue; 46c5ebbaf1SKurt Borja u8 green; 47c5ebbaf1SKurt Borja u8 red; 48c5ebbaf1SKurt Borja } __packed; 49c5ebbaf1SKurt Borja 50c5ebbaf1SKurt Borja struct alienfx_priv { 51c5ebbaf1SKurt Borja struct platform_device *pdev; 52c5ebbaf1SKurt Borja struct led_classdev global_led; 53c5ebbaf1SKurt Borja struct color_platform colors[4]; 54c5ebbaf1SKurt Borja u8 global_brightness; 55c5ebbaf1SKurt Borja u8 lighting_control_state; 56c5ebbaf1SKurt Borja }; 57c5ebbaf1SKurt Borja 58c5ebbaf1SKurt Borja struct alienfx_ops { 59c5ebbaf1SKurt Borja int (*upd_led)(struct alienfx_priv *priv, struct wmi_device *wdev, 60c5ebbaf1SKurt Borja u8 location); 61c5ebbaf1SKurt Borja int (*upd_brightness)(struct alienfx_priv *priv, struct wmi_device *wdev, 62c5ebbaf1SKurt Borja u8 brightness); 63c5ebbaf1SKurt Borja }; 64c5ebbaf1SKurt Borja 65c5ebbaf1SKurt Borja struct alienfx_platdata { 66c5ebbaf1SKurt Borja struct wmi_device *wdev; 67c5ebbaf1SKurt Borja struct alienfx_ops ops; 68c5ebbaf1SKurt Borja }; 69c5ebbaf1SKurt Borja 70c5ebbaf1SKurt Borja extern u8 alienware_interface; 71c5ebbaf1SKurt Borja extern struct alienfx_quirks *alienfx; 72c5ebbaf1SKurt Borja 73c5ebbaf1SKurt Borja int alienware_wmi_command(struct wmi_device *wdev, u32 method_id, 74c5ebbaf1SKurt Borja void *in_args, size_t in_size, u32 *out_data); 75c5ebbaf1SKurt Borja 76c5ebbaf1SKurt Borja int alienware_alienfx_setup(struct alienfx_platdata *pdata); 77c5ebbaf1SKurt Borja 78*b1b8fcf6SKurt Borja #if IS_ENABLED(CONFIG_ALIENWARE_WMI_LEGACY) 79c5ebbaf1SKurt Borja int __init alienware_legacy_wmi_init(void); 80c5ebbaf1SKurt Borja void __exit alienware_legacy_wmi_exit(void); 81*b1b8fcf6SKurt Borja #else 82*b1b8fcf6SKurt Borja static inline int alienware_legacy_wmi_init(void) 83*b1b8fcf6SKurt Borja { 84*b1b8fcf6SKurt Borja return -ENODEV; 85*b1b8fcf6SKurt Borja } 86c5ebbaf1SKurt Borja 87*b1b8fcf6SKurt Borja static inline void alienware_legacy_wmi_exit(void) 88*b1b8fcf6SKurt Borja { 89*b1b8fcf6SKurt Borja } 90*b1b8fcf6SKurt Borja #endif 91*b1b8fcf6SKurt Borja 92*b1b8fcf6SKurt Borja #if IS_ENABLED(CONFIG_ALIENWARE_WMI_WMAX) 93c5ebbaf1SKurt Borja extern const struct attribute_group wmax_hdmi_attribute_group; 94c5ebbaf1SKurt Borja extern const struct attribute_group wmax_amplifier_attribute_group; 95c5ebbaf1SKurt Borja extern const struct attribute_group wmax_deepsleep_attribute_group; 96c5ebbaf1SKurt Borja 97c5ebbaf1SKurt Borja #define WMAX_DEV_GROUPS &wmax_hdmi_attribute_group, \ 98c5ebbaf1SKurt Borja &wmax_amplifier_attribute_group, \ 99c5ebbaf1SKurt Borja &wmax_deepsleep_attribute_group, 100c5ebbaf1SKurt Borja 101c5ebbaf1SKurt Borja int __init alienware_wmax_wmi_init(void); 102c5ebbaf1SKurt Borja void __exit alienware_wmax_wmi_exit(void); 103*b1b8fcf6SKurt Borja #else 104*b1b8fcf6SKurt Borja #define WMAX_DEV_GROUPS 105*b1b8fcf6SKurt Borja 106*b1b8fcf6SKurt Borja static inline int alienware_wmax_wmi_init(void) 107*b1b8fcf6SKurt Borja { 108*b1b8fcf6SKurt Borja return -ENODEV; 109*b1b8fcf6SKurt Borja } 110*b1b8fcf6SKurt Borja 111*b1b8fcf6SKurt Borja 112*b1b8fcf6SKurt Borja static inline void alienware_wmax_wmi_exit(void) 113*b1b8fcf6SKurt Borja { 114*b1b8fcf6SKurt Borja } 115*b1b8fcf6SKurt Borja #endif 116c5ebbaf1SKurt Borja 117c5ebbaf1SKurt Borja #endif 118