[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20251117132530.32460-6-wse@tuxedocomputers.com>
Date: Mon, 17 Nov 2025 14:24:02 +0100
From: Werner Sembach <wse@...edocomputers.com>
To: W_Armin@....de,
hansg@...nel.org,
ilpo.jarvinen@...ux.intel.com
Cc: platform-driver-x86@...r.kernel.org,
linux-kernel@...r.kernel.org,
Werner Sembach <wse@...edocomputers.com>
Subject: [PATCH 5/6] platform/x86/uniwill: Run callbacks of uniwill_dmi_table
The dmi_system_id uniwill_dmi_table[] has a callback field.
This patch calls these callbacks with EC read/write access. It also moves
the supported_features assignment further back into the code.
This enables the callbacks to dynamically determine supported_features
flags based on EC readouts.
Signed-off-by: Werner Sembach <wse@...edocomputers.com>
---
drivers/platform/x86/uniwill/uniwill-acpi.c | 29 ++++++++++++---------
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c
index 9412783698685..15a94c256f728 100644
--- a/drivers/platform/x86/uniwill/uniwill-acpi.c
+++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
@@ -335,6 +335,7 @@ struct uniwill_data {
struct mutex input_lock; /* Protects input sequence during notify */
struct input_dev *input_device;
struct notifier_block nb;
+ struct dmi_system_id id;
};
struct uniwill_battery_entry {
@@ -1767,6 +1768,7 @@ MODULE_DEVICE_TABLE(dmi, uniwill_dmi_table);
static int uniwill_probe(struct platform_device *pdev)
{
+ const struct dmi_system_id *id;
struct uniwill_data *data;
struct regmap *regmap;
acpi_handle handle;
@@ -1788,6 +1790,19 @@ static int uniwill_probe(struct platform_device *pdev)
if (IS_ERR(regmap))
return PTR_ERR(regmap);
+ if (force) {
+ /* Assume that the device supports all features */
+ supported_features = UINT_MAX;
+ pr_warn("Loading on a potentially unsupported device\n");
+ } else {
+ /* Match is guaranteed, otherwise init would have aborted */
+ id = dmi_first_match(uniwill_dmi_table);
+ memcpy(&data->id, id, sizeof(data->id));
+ if (data->id.callback)
+ data->id.callback(&data->id);
+ supported_features = (uintptr_t)data->id.driver_data;
+ }
+
data->regmap = regmap;
ret = devm_mutex_init(&pdev->dev, &data->super_key_lock);
if (ret < 0)
@@ -1938,20 +1953,10 @@ static struct platform_driver uniwill_driver = {
static int __init uniwill_init(void)
{
- const struct dmi_system_id *id;
int ret;
- id = dmi_first_match(uniwill_dmi_table);
- if (!id) {
- if (!force)
- return -ENODEV;
-
- /* Assume that the device supports all features */
- supported_features = UINT_MAX;
- pr_warn("Loading on a potentially unsupported device\n");
- } else {
- supported_features = (uintptr_t)id->driver_data;
- }
+ if (!dmi_first_match(uniwill_dmi_table) && !force)
+ return -ENODEV;
ret = platform_driver_register(&uniwill_driver);
if (ret < 0)
--
2.43.0
Powered by blists - more mailing lists