platform_set_drvdata(ghes_dev, ghes);
 
-       ghes_edac_register(ghes, &ghes_dev->dev);
-
        ghes->dev = &ghes_dev->dev;
 
        mutex_lock(&ghes_devs_mutex);
 
        ghes_fini(ghes);
 
-       ghes_edac_unregister(ghes);
-
        mutex_lock(&ghes_devs_mutex);
        list_del(&ghes->elist);
        mutex_unlock(&ghes_devs_mutex);
 
          has been initialized.
 
 config EDAC_GHES
-       bool "Output ACPI APEI/GHES BIOS detected errors via EDAC"
-       depends on ACPI_APEI_GHES && (EDAC=y)
+       tristate "Output ACPI APEI/GHES BIOS detected errors via EDAC"
+       depends on ACPI_APEI_GHES
        select UEFI_CPER
        help
          Not all machines support hardware-driven error report. Some of those
 
 
 static bool system_scanned;
 
+static struct list_head *ghes_devs;
+
 /* Memory Device - Type 17 of SMBIOS spec */
 struct memdev_dmi_entry {
        u8 type;
        .priority       = 0,
 };
 
-int ghes_edac_register(struct ghes *ghes, struct device *dev)
+static int ghes_edac_register(struct device *dev)
 {
        bool fake = false;
        struct mem_ctl_info *mci;
        return rc;
 }
 
-void ghes_edac_unregister(struct ghes *ghes)
+static void ghes_edac_unregister(struct ghes *ghes)
 {
        struct mem_ctl_info *mci;
        unsigned long flags;
 unlock:
        mutex_unlock(&ghes_reg_mutex);
 }
+
+static int __init ghes_edac_init(void)
+{
+       struct ghes *g, *g_tmp;
+
+       ghes_devs = ghes_get_devices();
+       if (!ghes_devs)
+               return -ENODEV;
+
+       if (list_empty(ghes_devs)) {
+               pr_info("GHES probing device list is empty");
+               return -ENODEV;
+       }
+
+       list_for_each_entry_safe(g, g_tmp, ghes_devs, elist) {
+               ghes_edac_register(g->dev);
+       }
+
+       return 0;
+}
+module_init(ghes_edac_init);
+
+static void __exit ghes_edac_exit(void)
+{
+       struct ghes *g, *g_tmp;
+
+       list_for_each_entry_safe(g, g_tmp, ghes_devs, elist) {
+               ghes_edac_unregister(g);
+       }
+}
+module_exit(ghes_edac_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Output ACPI APEI/GHES BIOS detected errors via EDAC");
 
  * @nb: pointer to the notifier_block structure of the vendor record handler.
  */
 void ghes_unregister_vendor_record_notifier(struct notifier_block *nb);
-#endif
-
-int ghes_estatus_pool_init(int num_ghes);
-
-/* From drivers/edac/ghes_edac.c */
-
-#ifdef CONFIG_EDAC_GHES
-int ghes_edac_register(struct ghes *ghes, struct device *dev);
-
-void ghes_edac_unregister(struct ghes *ghes);
 
 struct list_head *ghes_get_devices(void);
-
 #else
-static inline int ghes_edac_register(struct ghes *ghes, struct device *dev)
-{
-       return -ENODEV;
-}
-
-static inline void ghes_edac_unregister(struct ghes *ghes)
-{
-}
-
 static inline struct list_head *ghes_get_devices(void) { return NULL; }
 #endif
 
+int ghes_estatus_pool_init(int num_ghes);
+
 static inline int acpi_hest_get_version(struct acpi_hest_generic_data *gdata)
 {
        return gdata->revision >> 8;