xref: /linux/drivers/platform/x86/dell/alienware-wmi.h (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
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