@@ -257,6 +257,18 @@ W: http://www.adaptec.com/
F: Documentation/scsi/aacraid.rst
F: drivers/scsi/aacraid/
+AAEON DEVICE DRIVER WITH WMI INTERFACE
+M: Edward Lin<edward1_lin@asus.com>
+M: Kunyang Fan <kunyang_fan@asus.com>
+M: Frank Hsieh <frank2_hsieh@asus.com>
+M: Jacob Wu <jacob_wu@asus.com>
+S: Supported
+F: drivers/gpio/gpio-aaeon.c
+F: drivers/hwmon/hwmon-aaeon.c
+F: drivers/leds/leds-aaeon.c
+F: drivers/mfd/mfd-aaeon.c
+F: drivers/watchdog/wdt_aaeon.c
+
ABI/API
L: linux-api@vger.kernel.org
F: include/linux/syscalls.h
@@ -2105,6 +2105,18 @@ config MFD_ACER_A500_EC
The controller itself is ENE KB930, it is running firmware
customized for the specific needs of the Acer A500 hardware.
+config MFD_AAEON
+ tristate "AAEON WMI MFD devices"
+ depends on ASUS_WMI
+ depends on UBUNTU_ODM_DRIVERS
+ help
+ Say yes here to support mltiple IO devices on Single Board Computers
+ produced by AAEON.
+
+ This driver leverages the ASUS WMI interface to access device
+ resources.
+
+
menu "Multimedia Capabilities Port drivers"
depends on ARCH_SA1100
@@ -271,3 +271,4 @@ obj-$(CONFIG_MFD_INTEL_M10_BMC) += intel-m10-bmc.o
obj-$(CONFIG_MFD_ATC260X) += atc260x-core.o
obj-$(CONFIG_MFD_ATC260X_I2C) += atc260x-i2c.o
+obj-$(CONFIG_MFD_AAEON) += mfd-aaeon.o
new file mode 100644
@@ -0,0 +1,77 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * UP Board main platform driver and FPGA configuration support
+ *
+ * Copyright (c) 2021, AAEON Ltd.
+ *
+ * Author: Kunyang_Fan <knuyang_fan@aaeon.com.tw>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/acpi.h>
+#include <linux/gpio.h>
+#include <linux/kernel.h>
+#include <linux/mfd/core.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/leds.h>
+#include <linux/wmi.h>
+
+#define AAEON_WMI_MGMT_GUID "97845ED0-4E6D-11DE-8A39-0800200C9A66"
+
+struct aaeon_wmi_priv {
+ const struct mfd_cell *cells;
+ size_t ncells;
+};
+
+static const struct mfd_cell aaeon_mfd_cells[] = {
+ { .name = "gpio-aaeon" },
+ { .name = "hwmon-aaeon"},
+ { .name = "leds-aaeon"},
+ { .name = "wdt-aaeon"},
+};
+
+static const struct aaeon_wmi_priv aaeon_wmi_priv_data = {
+ .cells = aaeon_mfd_cells,
+ .ncells = ARRAY_SIZE(aaeon_mfd_cells),
+};
+
+static int aaeon_wmi_probe(struct wmi_device *wdev, const void *context)
+{
+ struct aaeon_wmi_priv *priv;
+
+ if (!wmi_has_guid(AAEON_WMI_MGMT_GUID)) {
+ dev_info(&wdev->dev, "AAEON Management GUID not found\n");
+ return -ENODEV;
+ }
+
+
+ priv = (struct aaeon_wmi_priv *)context;
+ dev_set_drvdata(&wdev->dev, priv);
+
+ return devm_mfd_add_devices(&wdev->dev, 0, priv->cells,
+ priv->ncells, NULL, 0, NULL);
+}
+
+static const struct wmi_device_id aaeon_wmi_id_table[] = {
+ { AAEON_WMI_MGMT_GUID, (void *)&aaeon_wmi_priv_data },
+ {}
+};
+
+static struct wmi_driver aaeon_wmi_driver = {
+ .driver = {
+ .name = "mfd-aaeon",
+ },
+ .id_table = aaeon_wmi_id_table,
+ .probe = aaeon_wmi_probe,
+};
+
+module_wmi_driver(aaeon_wmi_driver);
+
+MODULE_DEVICE_TABLE(wmi, aaeon_wmi_id_table);
+MODULE_AUTHOR("Kunyang Fan <kunyang_fan@aaeon.com.tw>");
+MODULE_DESCRIPTION("AAEON Board WMI driver");
+MODULE_LICENSE("GPL v2");