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