Unverified Commit f28d76b1 authored by Rong Zhang's avatar Rong Zhang Committed by Ilpo Järvinen
Browse files

platform/x86: Rename lenovo-wmi-capdata01 to lenovo-wmi-capdata



Prepare for the upcoming changes to make it suitable to retrieve
and provide other Capability Data as well.

Signed-off-by: default avatarRong Zhang <i@rong.moe>
Reviewed-by: default avatarDerek J. Clark <derekjohn.clark@gmail.com>
Tested-by: default avatarDerek J. Clark <derekjohn.clark@gmail.com>
Link: https://patch.msgid.link/20260120182104.163424-3-i@rong.moe


Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent 465dc9da
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -233,7 +233,7 @@ config YT2_1380
	  To compile this driver as a module, choose M here: the module will
	  be called lenovo-yogabook.

config LENOVO_WMI_DATA01
config LENOVO_WMI_CAPDATA
	tristate
	depends on ACPI_WMI

@@ -264,7 +264,7 @@ config LENOVO_WMI_TUNING
	tristate "Lenovo Other Mode WMI Driver"
	depends on ACPI_WMI
	select FW_ATTR_CLASS
	select LENOVO_WMI_DATA01
	select LENOVO_WMI_CAPDATA
	select LENOVO_WMI_EVENTS
	select LENOVO_WMI_HELPERS
	help
+1 −1
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ lenovo-target-$(CONFIG_LENOVO_YMC) += ymc.o
lenovo-target-$(CONFIG_YOGABOOK)	+= yogabook.o
lenovo-target-$(CONFIG_YT2_1380)	+= yoga-tab2-pro-1380-fastcharger.o
lenovo-target-$(CONFIG_LENOVO_WMI_CAMERA)	+= wmi-camera.o
lenovo-target-$(CONFIG_LENOVO_WMI_DATA01)	+= wmi-capdata01.o
lenovo-target-$(CONFIG_LENOVO_WMI_CAPDATA)	+= wmi-capdata.o
lenovo-target-$(CONFIG_LENOVO_WMI_EVENTS)	+= wmi-events.o
lenovo-target-$(CONFIG_LENOVO_WMI_HELPERS)	+= wmi-helpers.o
lenovo-target-$(CONFIG_LENOVO_WMI_GAMEZONE)	+= wmi-gamezone.o
+63 −61
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Lenovo Capability Data 01 WMI Data Block driver.
 * Lenovo Capability Data WMI Data Block driver.
 *
 * Lenovo Capability Data 01 provides information on tunable attributes used by
 * the "Other Mode" WMI interface. The data includes if the attribute is
 * supported by the hardware, the default_value, max_value, min_value, and step
 * increment. Each attribute has multiple pages, one for each of the thermal
 * modes managed by the Gamezone interface.
 * Lenovo Capability Data provides information on tunable attributes used by
 * the "Other Mode" WMI interface.
 *
 * Capability Data 01 includes if the attribute is supported by the hardware,
 * and the default_value, max_value, min_value, and step increment. Each
 * attribute has multiple pages, one for each of the thermal modes managed by
 * the Gamezone interface.
 *
 * Copyright (C) 2025 Derek J. Clark <derekjohn.clark@gmail.com>
 *   - Initial implementation (formerly named lenovo-wmi-capdata01)
 */

#include <linux/acpi.h>
@@ -26,55 +29,55 @@
#include <linux/types.h>
#include <linux/wmi.h>

#include "wmi-capdata01.h"
#include "wmi-capdata.h"

#define LENOVO_CAPABILITY_DATA_01_GUID "7A8F5407-CB67-4D6E-B547-39B3BE018154"

#define ACPI_AC_CLASS "ac_adapter"
#define ACPI_AC_NOTIFY_STATUS 0x80

struct lwmi_cd01_priv {
struct lwmi_cd_priv {
	struct notifier_block acpi_nb; /* ACPI events */
	struct wmi_device *wdev;
	struct cd01_list *list;
	struct cd_list *list;
};

struct cd01_list {
struct cd_list {
	struct mutex list_mutex; /* list R/W mutex */
	u8 count;
	struct capdata01 data[];
};

/**
 * lwmi_cd01_component_bind() - Bind component to master device.
 * @cd01_dev: Pointer to the lenovo-wmi-capdata01 driver parent device.
 * lwmi_cd_component_bind() - Bind component to master device.
 * @cd_dev: Pointer to the lenovo-wmi-capdata driver parent device.
 * @om_dev: Pointer to the lenovo-wmi-other driver parent device.
 * @data: capdata01_list object pointer used to return the capability data.
 * @data: cd_list object pointer used to return the capability data.
 *
 * On lenovo-wmi-other's master bind, provide a pointer to the local capdata01
 * list. This is used to call lwmi_cd01_get_data to look up attribute data
 * On lenovo-wmi-other's master bind, provide a pointer to the local capdata
 * list. This is used to call lwmi_cd*_get_data to look up attribute data
 * from the lenovo-wmi-other driver.
 *
 * Return: 0
 */
static int lwmi_cd01_component_bind(struct device *cd01_dev,
static int lwmi_cd_component_bind(struct device *cd_dev,
				  struct device *om_dev, void *data)
{
	struct lwmi_cd01_priv *priv = dev_get_drvdata(cd01_dev);
	struct cd01_list **cd01_list = data;
	struct lwmi_cd_priv *priv = dev_get_drvdata(cd_dev);
	struct cd_list **cd_list = data;

	*cd01_list = priv->list;
	*cd_list = priv->list;

	return 0;
}

static const struct component_ops lwmi_cd01_component_ops = {
	.bind = lwmi_cd01_component_bind,
static const struct component_ops lwmi_cd_component_ops = {
	.bind = lwmi_cd_component_bind,
};

/**
 * lwmi_cd01_get_data - Get the data of the specified attribute
 * @list: The lenovo-wmi-capdata01 pointer to its cd01_list struct.
 * @list: The lenovo-wmi-capdata pointer to its cd_list struct.
 * @attribute_id: The capdata attribute ID to be found.
 * @output: Pointer to a capdata01 struct to return the data.
 *
@@ -83,7 +86,7 @@ static const struct component_ops lwmi_cd01_component_ops = {
 *
 * Return: 0 on success, or -EINVAL.
 */
int lwmi_cd01_get_data(struct cd01_list *list, u32 attribute_id, struct capdata01 *output)
int lwmi_cd01_get_data(struct cd_list *list, u32 attribute_id, struct capdata01 *output)
{
	u8 idx;

@@ -97,17 +100,17 @@ int lwmi_cd01_get_data(struct cd01_list *list, u32 attribute_id, struct capdata0

	return -EINVAL;
}
EXPORT_SYMBOL_NS_GPL(lwmi_cd01_get_data, "LENOVO_WMI_CD01");
EXPORT_SYMBOL_NS_GPL(lwmi_cd01_get_data, "LENOVO_WMI_CAPDATA");

/**
 * lwmi_cd01_cache() - Cache all WMI data block information
 * @priv: lenovo-wmi-capdata01 driver data.
 * lwmi_cd_cache() - Cache all WMI data block information
 * @priv: lenovo-wmi-capdata driver data.
 *
 * Loop through each WMI data block and cache the data.
 *
 * Return: 0 on success, or an error.
 */
static int lwmi_cd01_cache(struct lwmi_cd01_priv *priv)
static int lwmi_cd_cache(struct lwmi_cd_priv *priv)
{
	int idx;

@@ -131,17 +134,17 @@ static int lwmi_cd01_cache(struct lwmi_cd01_priv *priv)
}

/**
 * lwmi_cd01_alloc() - Allocate a cd01_list struct in drvdata
 * @priv: lenovo-wmi-capdata01 driver data.
 * lwmi_cd_alloc() - Allocate a cd_list struct in drvdata
 * @priv: lenovo-wmi-capdata driver data.
 *
 * Allocate a cd01_list struct large enough to contain data from all WMI data
 * Allocate a cd_list struct large enough to contain data from all WMI data
 * blocks provided by the interface.
 *
 * Return: 0 on success, or an error.
 */
static int lwmi_cd01_alloc(struct lwmi_cd01_priv *priv)
static int lwmi_cd_alloc(struct lwmi_cd_priv *priv)
{
	struct cd01_list *list;
	struct cd_list *list;
	size_t list_size;
	int count, ret;

@@ -163,28 +166,28 @@ static int lwmi_cd01_alloc(struct lwmi_cd01_priv *priv)
}

/**
 * lwmi_cd01_setup() - Cache all WMI data block information
 * @priv: lenovo-wmi-capdata01 driver data.
 * lwmi_cd_setup() - Cache all WMI data block information
 * @priv: lenovo-wmi-capdata driver data.
 *
 * Allocate a cd01_list struct large enough to contain data from all WMI data
 * Allocate a cd_list struct large enough to contain data from all WMI data
 * blocks provided by the interface. Then loop through each data block and
 * cache the data.
 *
 * Return: 0 on success, or an error code.
 */
static int lwmi_cd01_setup(struct lwmi_cd01_priv *priv)
static int lwmi_cd_setup(struct lwmi_cd_priv *priv)
{
	int ret;

	ret = lwmi_cd01_alloc(priv);
	ret = lwmi_cd_alloc(priv);
	if (ret)
		return ret;

	return lwmi_cd01_cache(priv);
	return lwmi_cd_cache(priv);
}

/**
 * lwmi_cd01_notifier_call() - Call method for lenovo-wmi-capdata01 driver notifier.
 * lwmi_cd01_notifier_call() - Call method for cd01 notifier.
 * block call chain.
 * @nb: The notifier_block registered to lenovo-wmi-events driver.
 * @action: Unused.
@@ -199,17 +202,17 @@ static int lwmi_cd01_notifier_call(struct notifier_block *nb, unsigned long acti
				   void *data)
{
	struct acpi_bus_event *event = data;
	struct lwmi_cd01_priv *priv;
	struct lwmi_cd_priv *priv;
	int ret;

	if (strcmp(event->device_class, ACPI_AC_CLASS) != 0)
		return NOTIFY_DONE;

	priv = container_of(nb, struct lwmi_cd01_priv, acpi_nb);
	priv = container_of(nb, struct lwmi_cd_priv, acpi_nb);

	switch (event->type) {
	case ACPI_AC_NOTIFY_STATUS:
		ret = lwmi_cd01_cache(priv);
		ret = lwmi_cd_cache(priv);
		if (ret)
			return NOTIFY_BAD;

@@ -230,10 +233,9 @@ static void lwmi_cd01_unregister(void *data)
	unregister_acpi_notifier(acpi_nb);
}

static int lwmi_cd01_probe(struct wmi_device *wdev, const void *context)

static int lwmi_cd_probe(struct wmi_device *wdev, const void *context)
{
	struct lwmi_cd01_priv *priv;
	struct lwmi_cd_priv *priv;
	int ret;

	priv = devm_kzalloc(&wdev->dev, sizeof(*priv), GFP_KERNEL);
@@ -243,7 +245,7 @@ static int lwmi_cd01_probe(struct wmi_device *wdev, const void *context)
	priv->wdev = wdev;
	dev_set_drvdata(&wdev->dev, priv);

	ret = lwmi_cd01_setup(priv);
	ret = lwmi_cd_setup(priv);
	if (ret)
		return ret;

@@ -257,27 +259,27 @@ static int lwmi_cd01_probe(struct wmi_device *wdev, const void *context)
	if (ret)
		return ret;

	return component_add(&wdev->dev, &lwmi_cd01_component_ops);
	return component_add(&wdev->dev, &lwmi_cd_component_ops);
}

static void lwmi_cd01_remove(struct wmi_device *wdev)
static void lwmi_cd_remove(struct wmi_device *wdev)
{
	component_del(&wdev->dev, &lwmi_cd01_component_ops);
	component_del(&wdev->dev, &lwmi_cd_component_ops);
}

static const struct wmi_device_id lwmi_cd01_id_table[] = {
static const struct wmi_device_id lwmi_cd_id_table[] = {
	{ LENOVO_CAPABILITY_DATA_01_GUID, NULL },
	{}
};

static struct wmi_driver lwmi_cd01_driver = {
static struct wmi_driver lwmi_cd_driver = {
	.driver = {
		.name = "lenovo_wmi_cd01",
		.name = "lenovo_wmi_capdata",
		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
	},
	.id_table = lwmi_cd01_id_table,
	.probe = lwmi_cd01_probe,
	.remove = lwmi_cd01_remove,
	.id_table = lwmi_cd_id_table,
	.probe = lwmi_cd_probe,
	.remove = lwmi_cd_remove,
	.no_singleton = true,
};

@@ -290,13 +292,13 @@ static struct wmi_driver lwmi_cd01_driver = {
 */
int lwmi_cd01_match(struct device *dev, void *data)
{
	return dev->driver == &lwmi_cd01_driver.driver;
	return dev->driver == &lwmi_cd_driver.driver;
}
EXPORT_SYMBOL_NS_GPL(lwmi_cd01_match, "LENOVO_WMI_CD01");
EXPORT_SYMBOL_NS_GPL(lwmi_cd01_match, "LENOVO_WMI_CAPDATA");

module_wmi_driver(lwmi_cd01_driver);
module_wmi_driver(lwmi_cd_driver);

MODULE_DEVICE_TABLE(wmi, lwmi_cd01_id_table);
MODULE_DEVICE_TABLE(wmi, lwmi_cd_id_table);
MODULE_AUTHOR("Derek J. Clark <derekjohn.clark@gmail.com>");
MODULE_DESCRIPTION("Lenovo Capability Data 01 WMI Driver");
MODULE_DESCRIPTION("Lenovo Capability Data WMI Driver");
MODULE_LICENSE("GPL");
+5 −5
Original line number Diff line number Diff line
@@ -2,13 +2,13 @@

/* Copyright (C) 2025 Derek J. Clark <derekjohn.clark@gmail.com> */

#ifndef _LENOVO_WMI_CAPDATA01_H_
#define _LENOVO_WMI_CAPDATA01_H_
#ifndef _LENOVO_WMI_CAPDATA_H_
#define _LENOVO_WMI_CAPDATA_H_

#include <linux/types.h>

struct device;
struct cd01_list;
struct cd_list;

struct capdata01 {
	u32 id;
@@ -19,7 +19,7 @@ struct capdata01 {
	u32 max_value;
};

int lwmi_cd01_get_data(struct cd01_list *list, u32 attribute_id, struct capdata01 *output);
int lwmi_cd01_get_data(struct cd_list *list, u32 attribute_id, struct capdata01 *output);
int lwmi_cd01_match(struct device *dev, void *data);

#endif /* !_LENOVO_WMI_CAPDATA01_H_ */
#endif /* !_LENOVO_WMI_CAPDATA_H_ */
+7 −4
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@
#include <linux/types.h>
#include <linux/wmi.h>

#include "wmi-capdata01.h"
#include "wmi-capdata.h"
#include "wmi-events.h"
#include "wmi-gamezone.h"
#include "wmi-helpers.h"
@@ -74,7 +74,10 @@ enum attribute_property {

struct lwmi_om_priv {
	struct component_master_ops *ops;
	struct cd01_list *cd01_list; /* only valid after capdata01 bind */

	/* only valid after capdata bind */
	struct cd_list *cd01_list;

	struct device *fw_attr_dev;
	struct kset *fw_attr_kset;
	struct notifier_block nb;
@@ -576,7 +579,7 @@ static void lwmi_om_fw_attr_remove(struct lwmi_om_priv *priv)
static int lwmi_om_master_bind(struct device *dev)
{
	struct lwmi_om_priv *priv = dev_get_drvdata(dev);
	struct cd01_list *tmp_list;
	struct cd_list *tmp_list;
	int ret;

	ret = component_bind_all(dev, &tmp_list);
@@ -657,7 +660,7 @@ static struct wmi_driver lwmi_other_driver = {

module_wmi_driver(lwmi_other_driver);

MODULE_IMPORT_NS("LENOVO_WMI_CD01");
MODULE_IMPORT_NS("LENOVO_WMI_CAPDATA");
MODULE_IMPORT_NS("LENOVO_WMI_HELPERS");
MODULE_DEVICE_TABLE(wmi, lwmi_other_id_table);
MODULE_AUTHOR("Derek J. Clark <derekjohn.clark@gmail.com>");