Recent Ayaneo devices feature an ACPI mapped Embedded Controller (EC)
with standard addresses across models that provides access to fan
speed, fan control, battery charge limits, and controller power
controls. Introduce a new driver stub that will handle these driver
features.
Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev>
---
MAINTAINERS | 6 +++
drivers/platform/x86/Kconfig | 9 ++++
drivers/platform/x86/Makefile | 3 ++
drivers/platform/x86/ayaneo-ec.c | 90 ++++++++++++++++++++++++++++++++
4 files changed, 108 insertions(+)
create mode 100644 drivers/platform/x86/ayaneo-ec.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 545a4776795e..da9498d8cc89 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4187,6 +4187,12 @@ W: https://ez.analog.com/linux-software-drivers
F: Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml
F: drivers/pwm/pwm-axi-pwmgen.c
+AYANEO PLATFORM EC DRIVER
+M: Antheas Kapenekakis <lkml@antheas.dev>
+L: platform-driver-x86@vger.kernel.org
+S: Maintained
+F: drivers/platform/x86/ayaneo-ec.c
+
AZ6007 DVB DRIVER
M: Mauro Carvalho Chehab <mchehab@kernel.org>
L: linux-media@vger.kernel.org
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index 46e62feeda3c..ebe7d2ab8758 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -316,6 +316,15 @@ config ASUS_TF103C_DOCK
If you have an Asus TF103C tablet say Y or M here, for a generic x86
distro config say M here.
+config AYANEO_EC
+ tristate "Ayaneo EC platform control"
+ help
+ Enables support for the platform EC of Ayaneo devices. This
+ includes fan control, fan speed, charge limit, magic
+ module detection, and controller power control.
+
+ If you have an Ayaneo device, say Y or M here.
+
config MERAKI_MX100
tristate "Cisco Meraki MX100 Platform Driver"
depends on GPIOLIB
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
index c7db2a88c11a..274a685eb92d 100644
--- a/drivers/platform/x86/Makefile
+++ b/drivers/platform/x86/Makefile
@@ -39,6 +39,9 @@ obj-$(CONFIG_ASUS_TF103C_DOCK) += asus-tf103c-dock.o
obj-$(CONFIG_EEEPC_LAPTOP) += eeepc-laptop.o
obj-$(CONFIG_EEEPC_WMI) += eeepc-wmi.o
+# Ayaneo
+obj-$(CONFIG_AYANEO_EC) += ayaneo-ec.o
+
# Cisco/Meraki
obj-$(CONFIG_MERAKI_MX100) += meraki-mx100.o
diff --git a/drivers/platform/x86/ayaneo-ec.c b/drivers/platform/x86/ayaneo-ec.c
new file mode 100644
index 000000000000..2fe66c8a89f4
--- /dev/null
+++ b/drivers/platform/x86/ayaneo-ec.c
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Platform driver for the Embedded Controller (EC) of Ayaneo devices. Handles
+ * hwmon (fan speed, fan control), battery charge limits, and magic module
+ * control (connected modules, controller disconnection).
+ *
+ * Copyright (C) 2025 Antheas Kapenekakis <lkml@antheas.dev>
+ */
+
+#include <linux/dmi.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+struct ayaneo_ec_quirk {
+};
+
+struct ayaneo_ec_platform_data {
+ struct platform_device *pdev;
+ struct ayaneo_ec_quirk *quirks;
+};
+
+static const struct ayaneo_ec_quirk quirk_ayaneo3 = {
+};
+
+static const struct dmi_system_id dmi_table[] = {
+ {
+ .matches = {
+ DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+ DMI_EXACT_MATCH(DMI_BOARD_NAME, "AYANEO 3"),
+ },
+ .driver_data = (void *)&quirk_ayaneo3,
+ },
+ {},
+};
+
+static int ayaneo_ec_probe(struct platform_device *pdev)
+{
+ const struct dmi_system_id *dmi_entry;
+ struct ayaneo_ec_platform_data *data;
+
+ dmi_entry = dmi_first_match(dmi_table);
+ if (!dmi_entry)
+ return -ENODEV;
+
+ data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ data->pdev = pdev;
+ data->quirks = dmi_entry->driver_data;
+ platform_set_drvdata(pdev, data);
+
+ return 0;
+}
+
+static struct platform_driver ayaneo_platform_driver = {
+ .driver = {
+ .name = "ayaneo-ec",
+ },
+ .probe = ayaneo_ec_probe,
+};
+
+static struct platform_device *ayaneo_platform_device;
+
+static int __init ayaneo_ec_init(void)
+{
+ ayaneo_platform_device =
+ platform_create_bundle(&ayaneo_platform_driver,
+ ayaneo_ec_probe, NULL, 0, NULL, 0);
+
+ return PTR_ERR_OR_ZERO(ayaneo_platform_device);
+}
+
+static void __exit ayaneo_ec_exit(void)
+{
+ platform_device_unregister(ayaneo_platform_device);
+ platform_driver_unregister(&ayaneo_platform_driver);
+}
+
+MODULE_DEVICE_TABLE(dmi, dmi_table);
+
+module_init(ayaneo_ec_init);
+module_exit(ayaneo_ec_exit);
+
+MODULE_AUTHOR("Antheas Kapenekakis <lkml@antheas.dev>");
+MODULE_DESCRIPTION("Ayaneo Embedded Controller (EC) platform features");
+MODULE_LICENSE("GPL");
--
2.51.1
Am 31.10.25 um 17:36 schrieb Antheas Kapenekakis:
> Recent Ayaneo devices feature an ACPI mapped Embedded Controller (EC)
> with standard addresses across models that provides access to fan
> speed, fan control, battery charge limits, and controller power
> controls. Introduce a new driver stub that will handle these driver
> features.
>
> Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev>
> ---
> MAINTAINERS | 6 +++
> drivers/platform/x86/Kconfig | 9 ++++
> drivers/platform/x86/Makefile | 3 ++
> drivers/platform/x86/ayaneo-ec.c | 90 ++++++++++++++++++++++++++++++++
> 4 files changed, 108 insertions(+)
> create mode 100644 drivers/platform/x86/ayaneo-ec.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 545a4776795e..da9498d8cc89 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -4187,6 +4187,12 @@ W: https://ez.analog.com/linux-software-drivers
> F: Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml
> F: drivers/pwm/pwm-axi-pwmgen.c
>
> +AYANEO PLATFORM EC DRIVER
> +M: Antheas Kapenekakis <lkml@antheas.dev>
> +L: platform-driver-x86@vger.kernel.org
> +S: Maintained
> +F: drivers/platform/x86/ayaneo-ec.c
> +
> AZ6007 DVB DRIVER
> M: Mauro Carvalho Chehab <mchehab@kernel.org>
> L: linux-media@vger.kernel.org
> diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
> index 46e62feeda3c..ebe7d2ab8758 100644
> --- a/drivers/platform/x86/Kconfig
> +++ b/drivers/platform/x86/Kconfig
> @@ -316,6 +316,15 @@ config ASUS_TF103C_DOCK
> If you have an Asus TF103C tablet say Y or M here, for a generic x86
> distro config say M here.
>
> +config AYANEO_EC
> + tristate "Ayaneo EC platform control"
> + help
> + Enables support for the platform EC of Ayaneo devices. This
> + includes fan control, fan speed, charge limit, magic
> + module detection, and controller power control.
> +
> + If you have an Ayaneo device, say Y or M here.
> +
> config MERAKI_MX100
> tristate "Cisco Meraki MX100 Platform Driver"
> depends on GPIOLIB
> diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
> index c7db2a88c11a..274a685eb92d 100644
> --- a/drivers/platform/x86/Makefile
> +++ b/drivers/platform/x86/Makefile
> @@ -39,6 +39,9 @@ obj-$(CONFIG_ASUS_TF103C_DOCK) += asus-tf103c-dock.o
> obj-$(CONFIG_EEEPC_LAPTOP) += eeepc-laptop.o
> obj-$(CONFIG_EEEPC_WMI) += eeepc-wmi.o
>
> +# Ayaneo
> +obj-$(CONFIG_AYANEO_EC) += ayaneo-ec.o
> +
> # Cisco/Meraki
> obj-$(CONFIG_MERAKI_MX100) += meraki-mx100.o
>
> diff --git a/drivers/platform/x86/ayaneo-ec.c b/drivers/platform/x86/ayaneo-ec.c
> new file mode 100644
> index 000000000000..2fe66c8a89f4
> --- /dev/null
> +++ b/drivers/platform/x86/ayaneo-ec.c
> @@ -0,0 +1,90 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Platform driver for the Embedded Controller (EC) of Ayaneo devices. Handles
> + * hwmon (fan speed, fan control), battery charge limits, and magic module
> + * control (connected modules, controller disconnection).
> + *
> + * Copyright (C) 2025 Antheas Kapenekakis <lkml@antheas.dev>
> + */
> +
> +#include <linux/dmi.h>
> +#include <linux/err.h>
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +
> +struct ayaneo_ec_quirk {
> +};
> +
> +struct ayaneo_ec_platform_data {
> + struct platform_device *pdev;
> + struct ayaneo_ec_quirk *quirks;
> +};
> +
> +static const struct ayaneo_ec_quirk quirk_ayaneo3 = {
> +};
> +
> +static const struct dmi_system_id dmi_table[] = {
> + {
> + .matches = {
> + DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
> + DMI_EXACT_MATCH(DMI_BOARD_NAME, "AYANEO 3"),
> + },
> + .driver_data = (void *)&quirk_ayaneo3,
> + },
> + {},
> +};
MODULE_DEVICE_TABLE() is missing, please add it so that the driver will
automatically load on supported devices.
> +
> +static int ayaneo_ec_probe(struct platform_device *pdev)
> +{
> + const struct dmi_system_id *dmi_entry;
> + struct ayaneo_ec_platform_data *data;
> +
> + dmi_entry = dmi_first_match(dmi_table);
> + if (!dmi_entry)
> + return -ENODEV;
Please store the quirk inside a global variable and perform the DMI match
inside ayaneo_ec_init. This will allow you to mark the DMI table as __initconst.
Thanks,
Armin Wolf
> +
> + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
> + if (!data)
> + return -ENOMEM;
> +
> + data->pdev = pdev;
> + data->quirks = dmi_entry->driver_data;
> + platform_set_drvdata(pdev, data);
> +
> + return 0;
> +}
> +
> +static struct platform_driver ayaneo_platform_driver = {
> + .driver = {
> + .name = "ayaneo-ec",
> + },
> + .probe = ayaneo_ec_probe,
> +};
> +
> +static struct platform_device *ayaneo_platform_device;
> +
> +static int __init ayaneo_ec_init(void)
> +{
> + ayaneo_platform_device =
> + platform_create_bundle(&ayaneo_platform_driver,
> + ayaneo_ec_probe, NULL, 0, NULL, 0);
> +
> + return PTR_ERR_OR_ZERO(ayaneo_platform_device);
> +}
> +
> +static void __exit ayaneo_ec_exit(void)
> +{
> + platform_device_unregister(ayaneo_platform_device);
> + platform_driver_unregister(&ayaneo_platform_driver);
> +}
> +
> +MODULE_DEVICE_TABLE(dmi, dmi_table);
> +
> +module_init(ayaneo_ec_init);
> +module_exit(ayaneo_ec_exit);
> +
> +MODULE_AUTHOR("Antheas Kapenekakis <lkml@antheas.dev>");
> +MODULE_DESCRIPTION("Ayaneo Embedded Controller (EC) platform features");
> +MODULE_LICENSE("GPL");
Am 02.11.25 um 19:21 schrieb Armin Wolf:
> Am 31.10.25 um 17:36 schrieb Antheas Kapenekakis:
>
>> Recent Ayaneo devices feature an ACPI mapped Embedded Controller (EC)
>> with standard addresses across models that provides access to fan
>> speed, fan control, battery charge limits, and controller power
>> controls. Introduce a new driver stub that will handle these driver
>> features.
>>
>> Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev>
>> ---
>> MAINTAINERS | 6 +++
>> drivers/platform/x86/Kconfig | 9 ++++
>> drivers/platform/x86/Makefile | 3 ++
>> drivers/platform/x86/ayaneo-ec.c | 90 ++++++++++++++++++++++++++++++++
>> 4 files changed, 108 insertions(+)
>> create mode 100644 drivers/platform/x86/ayaneo-ec.c
>>
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index 545a4776795e..da9498d8cc89 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -4187,6 +4187,12 @@ W: https://ez.analog.com/linux-software-drivers
>> F: Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml
>> F: drivers/pwm/pwm-axi-pwmgen.c
>> +AYANEO PLATFORM EC DRIVER
>> +M: Antheas Kapenekakis <lkml@antheas.dev>
>> +L: platform-driver-x86@vger.kernel.org
>> +S: Maintained
>> +F: drivers/platform/x86/ayaneo-ec.c
>> +
>> AZ6007 DVB DRIVER
>> M: Mauro Carvalho Chehab <mchehab@kernel.org>
>> L: linux-media@vger.kernel.org
>> diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
>> index 46e62feeda3c..ebe7d2ab8758 100644
>> --- a/drivers/platform/x86/Kconfig
>> +++ b/drivers/platform/x86/Kconfig
>> @@ -316,6 +316,15 @@ config ASUS_TF103C_DOCK
>> If you have an Asus TF103C tablet say Y or M here, for a
>> generic x86
>> distro config say M here.
>> +config AYANEO_EC
>> + tristate "Ayaneo EC platform control"
I forgot to mention that you need to depend on DMI.
>> + help
>> + Enables support for the platform EC of Ayaneo devices. This
>> + includes fan control, fan speed, charge limit, magic
>> + module detection, and controller power control.
>> +
>> + If you have an Ayaneo device, say Y or M here.
>> +
>> config MERAKI_MX100
>> tristate "Cisco Meraki MX100 Platform Driver"
>> depends on GPIOLIB
>> diff --git a/drivers/platform/x86/Makefile
>> b/drivers/platform/x86/Makefile
>> index c7db2a88c11a..274a685eb92d 100644
>> --- a/drivers/platform/x86/Makefile
>> +++ b/drivers/platform/x86/Makefile
>> @@ -39,6 +39,9 @@ obj-$(CONFIG_ASUS_TF103C_DOCK) +=
>> asus-tf103c-dock.o
>> obj-$(CONFIG_EEEPC_LAPTOP) += eeepc-laptop.o
>> obj-$(CONFIG_EEEPC_WMI) += eeepc-wmi.o
>> +# Ayaneo
>> +obj-$(CONFIG_AYANEO_EC) += ayaneo-ec.o
>> +
>> # Cisco/Meraki
>> obj-$(CONFIG_MERAKI_MX100) += meraki-mx100.o
>> diff --git a/drivers/platform/x86/ayaneo-ec.c
>> b/drivers/platform/x86/ayaneo-ec.c
>> new file mode 100644
>> index 000000000000..2fe66c8a89f4
>> --- /dev/null
>> +++ b/drivers/platform/x86/ayaneo-ec.c
>> @@ -0,0 +1,90 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * Platform driver for the Embedded Controller (EC) of Ayaneo
>> devices. Handles
>> + * hwmon (fan speed, fan control), battery charge limits, and magic
>> module
>> + * control (connected modules, controller disconnection).
>> + *
>> + * Copyright (C) 2025 Antheas Kapenekakis <lkml@antheas.dev>
>> + */
>> +
>> +#include <linux/dmi.h>
>> +#include <linux/err.h>
>> +#include <linux/init.h>
>> +#include <linux/kernel.h>
>> +#include <linux/module.h>
>> +#include <linux/platform_device.h>
>> +
>> +struct ayaneo_ec_quirk {
>> +};
>> +
>> +struct ayaneo_ec_platform_data {
>> + struct platform_device *pdev;
>> + struct ayaneo_ec_quirk *quirks;
>> +};
>> +
>> +static const struct ayaneo_ec_quirk quirk_ayaneo3 = {
>> +};
>> +
>> +static const struct dmi_system_id dmi_table[] = {
>> + {
>> + .matches = {
>> + DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
>> + DMI_EXACT_MATCH(DMI_BOARD_NAME, "AYANEO 3"),
>> + },
>> + .driver_data = (void *)&quirk_ayaneo3,
>> + },
>> + {},
>> +};
>
> MODULE_DEVICE_TABLE() is missing, please add it so that the driver will
> automatically load on supported devices.
>
>> +
>> +static int ayaneo_ec_probe(struct platform_device *pdev)
>> +{
>> + const struct dmi_system_id *dmi_entry;
>> + struct ayaneo_ec_platform_data *data;
>> +
>> + dmi_entry = dmi_first_match(dmi_table);
>> + if (!dmi_entry)
>> + return -ENODEV;
>
> Please store the quirk inside a global variable and perform the DMI match
> inside ayaneo_ec_init. This will allow you to mark the DMI table as
> __initconst.
>
> Thanks,
> Armin Wolf
>
>> +
>> + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
>> + if (!data)
>> + return -ENOMEM;
>> +
>> + data->pdev = pdev;
>> + data->quirks = dmi_entry->driver_data;
>> + platform_set_drvdata(pdev, data);
>> +
>> + return 0;
>> +}
>> +
>> +static struct platform_driver ayaneo_platform_driver = {
>> + .driver = {
>> + .name = "ayaneo-ec",
>> + },
>> + .probe = ayaneo_ec_probe,
>> +};
>> +
>> +static struct platform_device *ayaneo_platform_device;
>> +
>> +static int __init ayaneo_ec_init(void)
>> +{
>> + ayaneo_platform_device =
>> + platform_create_bundle(&ayaneo_platform_driver,
>> + ayaneo_ec_probe, NULL, 0, NULL, 0);
>> +
>> + return PTR_ERR_OR_ZERO(ayaneo_platform_device);
>> +}
>> +
>> +static void __exit ayaneo_ec_exit(void)
>> +{
>> + platform_device_unregister(ayaneo_platform_device);
>> + platform_driver_unregister(&ayaneo_platform_driver);
>> +}
>> +
>> +MODULE_DEVICE_TABLE(dmi, dmi_table);
>> +
>> +module_init(ayaneo_ec_init);
>> +module_exit(ayaneo_ec_exit);
>> +
>> +MODULE_AUTHOR("Antheas Kapenekakis <lkml@antheas.dev>");
>> +MODULE_DESCRIPTION("Ayaneo Embedded Controller (EC) platform
>> features");
>> +MODULE_LICENSE("GPL");
>
© 2016 - 2026 Red Hat, Inc.