#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/module.h>
+#include <linux/mod_devicetable.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
+#include <linux/dmi.h>
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/acpi.h>
 #include <linux/slab.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;
 module_param(nowayout, bool, 0);
 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
        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)
 {
-       int address;
        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);
        if (address < 0)
                address = sch56xx_find(0x2e, &name);