Commit 393935ba authored by Armin Wolf's avatar Armin Wolf Committed by Guenter Roeck

hwmon: (sch56xx-common) Add automatic module loading on supported devices

This patch enables the sch56xx-common module to get automatically
loaded on supported machines.
If a machine supports Fujitsu's SCH56XX-based hardware monitoring
solutions, it contains a "Antiope"/" Antiope" dmi onboard device
in case of the sch5627 or a "Theseus"/" Theseus" dmi onboard device
in case of the sch5636.
Since some machines like the Esprimo C700 have a seemingly faulty
DMI table containing both onboard devices, the driver still needs
to probe for the individual superio chip, which in presence of at
least one DMI onboard device however can be considered safe.
Also add a module parameter allowing for bypassing the
DMI check.

Tested on a Fujitsu Esprimo P720.
Signed-off-by: default avatarArmin Wolf <W_Armin@gmx.de>
Link: https://lore.kernel.org/r/20220131211935.3656-3-W_Armin@gmx.deReviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 4db3c092
...@@ -7,8 +7,10 @@ ...@@ -7,8 +7,10 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dmi.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/acpi.h> #include <linux/acpi.h>
...@@ -19,7 +21,10 @@ ...@@ -19,7 +21,10 @@
#include <linux/slab.h> #include <linux/slab.h>
#include "sch56xx-common.h" #include "sch56xx-common.h"
/* Insmod parameters */ static bool ignore_dmi;
module_param(ignore_dmi, bool, 0);
MODULE_PARM_DESC(ignore_dmi, "Omit DMI check for supported devices (default=0)");
static bool nowayout = WATCHDOG_NOWAYOUT; static bool nowayout = WATCHDOG_NOWAYOUT;
module_param(nowayout, bool, 0); module_param(nowayout, bool, 0);
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
...@@ -518,11 +523,42 @@ static int __init sch56xx_device_add(int address, const char *name) ...@@ -518,11 +523,42 @@ static int __init sch56xx_device_add(int address, const char *name)
return PTR_ERR_OR_ZERO(sch56xx_pdev); return PTR_ERR_OR_ZERO(sch56xx_pdev);
} }
/* For autoloading only */
static const struct dmi_system_id sch56xx_dmi_table[] __initconst = {
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
},
},
{ }
};
MODULE_DEVICE_TABLE(dmi, sch56xx_dmi_table);
static int __init sch56xx_init(void) static int __init sch56xx_init(void)
{ {
int address;
const char *name = NULL; const char *name = NULL;
int address;
if (!ignore_dmi) {
if (!dmi_check_system(sch56xx_dmi_table))
return -ENODEV;
/*
* Some machines like the Esprimo P720 and Esprimo C700 have
* onboard devices named " Antiope"/" Theseus" instead of
* "Antiope"/"Theseus", so we need to check for both.
*/
if (!dmi_find_device(DMI_DEV_TYPE_OTHER, "Antiope", NULL) &&
!dmi_find_device(DMI_DEV_TYPE_OTHER, " Antiope", NULL) &&
!dmi_find_device(DMI_DEV_TYPE_OTHER, "Theseus", NULL) &&
!dmi_find_device(DMI_DEV_TYPE_OTHER, " Theseus", NULL))
return -ENODEV;
}
/*
* Some devices like the Esprimo C700 have both onboard devices,
* so we still have to check manually
*/
address = sch56xx_find(0x4e, &name); address = sch56xx_find(0x4e, &name);
if (address < 0) if (address < 0)
address = sch56xx_find(0x2e, &name); address = sch56xx_find(0x2e, &name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment