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