xref: /linux/drivers/platform/x86/lenovo/wmi-capdata.h (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1f28d76b1SRong Zhang /* SPDX-License-Identifier: GPL-2.0-or-later */
2f28d76b1SRong Zhang 
3f28d76b1SRong Zhang /* Copyright (C) 2025 Derek J. Clark <derekjohn.clark@gmail.com> */
4f28d76b1SRong Zhang 
5f28d76b1SRong Zhang #ifndef _LENOVO_WMI_CAPDATA_H_
6f28d76b1SRong Zhang #define _LENOVO_WMI_CAPDATA_H_
7f28d76b1SRong Zhang 
867d9a39cSRong Zhang #include <linux/bits.h>
9f28d76b1SRong Zhang #include <linux/types.h>
10f28d76b1SRong Zhang 
1167d9a39cSRong Zhang #define LWMI_SUPP_VALID		BIT(0)
12*5a5203a4SRong Zhang #define LWMI_SUPP_GET		BIT(1)
13*5a5203a4SRong Zhang #define LWMI_SUPP_SET		BIT(2)
1467d9a39cSRong Zhang 
1567d9a39cSRong Zhang #define LWMI_ATTR_DEV_ID_MASK	GENMASK(31, 24)
1667d9a39cSRong Zhang #define LWMI_ATTR_FEAT_ID_MASK	GENMASK(23, 16)
1767d9a39cSRong Zhang #define LWMI_ATTR_MODE_ID_MASK	GENMASK(15, 8)
1867d9a39cSRong Zhang #define LWMI_ATTR_TYPE_ID_MASK	GENMASK(7, 0)
1967d9a39cSRong Zhang 
2067d9a39cSRong Zhang #define LWMI_DEVICE_ID_FAN	0x04
2167d9a39cSRong Zhang 
224ff1a029SRong Zhang struct component_match;
23f28d76b1SRong Zhang struct device;
24f28d76b1SRong Zhang struct cd_list;
25f28d76b1SRong Zhang 
26c05f67e6SRong Zhang struct capdata00 {
27c05f67e6SRong Zhang 	u32 id;
28c05f67e6SRong Zhang 	u32 supported;
29c05f67e6SRong Zhang 	u32 default_value;
30c05f67e6SRong Zhang };
31c05f67e6SRong Zhang 
32f28d76b1SRong Zhang struct capdata01 {
33f28d76b1SRong Zhang 	u32 id;
34f28d76b1SRong Zhang 	u32 supported;
35f28d76b1SRong Zhang 	u32 default_value;
36f28d76b1SRong Zhang 	u32 step;
37f28d76b1SRong Zhang 	u32 min_value;
38f28d76b1SRong Zhang 	u32 max_value;
39f28d76b1SRong Zhang };
40f28d76b1SRong Zhang 
41012a8f96SRong Zhang struct capdata_fan {
42012a8f96SRong Zhang 	u32 id;
43012a8f96SRong Zhang 	u32 min_rpm;
44012a8f96SRong Zhang 	u32 max_rpm;
45012a8f96SRong Zhang };
46012a8f96SRong Zhang 
4767d9a39cSRong Zhang typedef void (*cd_list_cb_t)(struct device *master_dev, struct cd_list *cd_list);
4867d9a39cSRong Zhang 
494ff1a029SRong Zhang struct lwmi_cd_binder {
50c05f67e6SRong Zhang 	struct cd_list *cd00_list;
514ff1a029SRong Zhang 	struct cd_list *cd01_list;
5267d9a39cSRong Zhang 	/*
5367d9a39cSRong Zhang 	 * May be called during or after the bind callback.
5467d9a39cSRong Zhang 	 * Will be called with NULL if capdata_fan does not exist.
5567d9a39cSRong Zhang 	 * The pointer is only valid in the callback; never keep it for later use!
5667d9a39cSRong Zhang 	 */
5767d9a39cSRong Zhang 	cd_list_cb_t cd_fan_list_cb;
584ff1a029SRong Zhang };
594ff1a029SRong Zhang 
604ff1a029SRong Zhang void lwmi_cd_match_add_all(struct device *master, struct component_match **matchptr);
61c05f67e6SRong Zhang int lwmi_cd00_get_data(struct cd_list *list, u32 attribute_id, struct capdata00 *output);
62f28d76b1SRong Zhang int lwmi_cd01_get_data(struct cd_list *list, u32 attribute_id, struct capdata01 *output);
63012a8f96SRong Zhang int lwmi_cd_fan_get_data(struct cd_list *list, u32 attribute_id, struct capdata_fan *output);
64f28d76b1SRong Zhang 
65f28d76b1SRong Zhang #endif /* !_LENOVO_WMI_CAPDATA_H_ */
66