edac: fix device removal on a few drivers

The removal logic was broken by the patch that added support for
struct device. Fix it.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
index 99f4c32..9851a1a 100644
--- a/drivers/edac/amd64_edac.c
+++ b/drivers/edac/amd64_edac.c
@@ -2452,6 +2452,14 @@
 	return 0;
 }
 
+static void del_mc_sysfs_attrs(struct mem_ctl_info *mci)
+{
+	amd64_remove_sysfs_dbg_files(mci);
+
+	if (boot_cpu_data.x86 >= 0x10)
+		amd64_remove_sysfs_inject_files(mci);
+}
+
 static void setup_mci_misc_attrs(struct mem_ctl_info *mci,
 				 struct amd64_family_type *fam)
 {
@@ -2669,6 +2677,8 @@
 	struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
 	struct ecc_settings *s = ecc_stngs[nid];
 
+	mci = find_mci_by_dev(&pdev->dev);
+	del_mc_sysfs_attrs(mci);
 	/* Remove from EDAC CORE tracking list */
 	mci = edac_mc_del_mc(&pdev->dev);
 	if (!mci)
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h
index df902ff..628c2d9 100644
--- a/drivers/edac/amd64_edac.h
+++ b/drivers/edac/amd64_edac.h
@@ -414,20 +414,30 @@
 
 #ifdef CONFIG_EDAC_DEBUG
 int amd64_create_sysfs_dbg_files(struct mem_ctl_info *mci);
+void amd64_remove_sysfs_dbg_files(struct mem_ctl_info *mci);
+
 #else
 static int amd64_create_sysfs_dbg_files(struct mem_ctl_info *mci)
 {
 	return 0;
 }
+void amd64_remove_sysfs_dbg_files(struct mem_ctl_info *mci)
+{
+}
 #endif
 
 #ifdef CONFIG_EDAC_AMD64_ERROR_INJECTION
 int amd64_create_sysfs_inject_files(struct mem_ctl_info *mci);
+void amd64_remove_sysfs_inject_files(struct mem_ctl_info *mci);
+
 #else
 static int amd64_create_sysfs_inject_files(struct mem_ctl_info *mci)
 {
 	return 0;
 }
+static void amd64_remove_sysfs_inject_files(struct mem_ctl_info *mci)
+{
+}
 #endif
 
 /*
diff --git a/drivers/edac/amd64_edac_dbg.c b/drivers/edac/amd64_edac_dbg.c
index a7cd553..2c1bbf7 100644
--- a/drivers/edac/amd64_edac_dbg.c
+++ b/drivers/edac/amd64_edac_dbg.c
@@ -62,3 +62,12 @@
 
 	return 0;
 }
+
+void amd64_remove_sysfs_dbg_files(struct mem_ctl_info *mci)
+{
+	device_remove_file(&mci->dev, &dev_attr_dhar);
+	device_remove_file(&mci->dev, &dev_attr_dbam);
+	device_remove_file(&mci->dev, &dev_attr_topmem);
+	device_remove_file(&mci->dev, &dev_attr_topmem2);
+	device_remove_file(&mci->dev, &dev_attr_dram_hole);
+}
diff --git a/drivers/edac/amd64_edac_inj.c b/drivers/edac/amd64_edac_inj.c
index 1129e7a..ef1ff4e 100644
--- a/drivers/edac/amd64_edac_inj.c
+++ b/drivers/edac/amd64_edac_inj.c
@@ -222,3 +222,12 @@
 
 	return 0;
 }
+
+void amd64_remove_sysfs_inject_files(struct mem_ctl_info *mci)
+{
+	device_remove_file(&mci->dev, &dev_attr_inject_section);
+	device_remove_file(&mci->dev, &dev_attr_inject_word);
+	device_remove_file(&mci->dev, &dev_attr_inject_ecc_vector);
+	device_remove_file(&mci->dev, &dev_attr_inject_write);
+	device_remove_file(&mci->dev, &dev_attr_inject_read);
+}
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index 8e10e8e..4ab2e19 100644
--- a/drivers/edac/edac_mc_sysfs.c
+++ b/drivers/edac/edac_mc_sysfs.c
@@ -1029,15 +1029,14 @@
 
 void edac_unregister_sysfs(struct mem_ctl_info *mci)
 {
-	debugf1("Unregistering device %s\n", __func__,
-		dev_name(&mci->dev));
+	debugf1("Unregistering device %s\n", dev_name(&mci->dev));
 	put_device(&mci->dev);
 	device_del(&mci->dev);
 }
 
 static void mc_attr_release(struct device *device)
 {
-	debugf1("Releasing device %s\n", __func__, dev_name(device));
+	debugf1("Releasing device %s\n", dev_name(device));
 }
 
 static struct device_type mc_attr_type = {
diff --git a/drivers/edac/edac_stub.c b/drivers/edac/edac_stub.c
index 4dea0af..670c448 100644
--- a/drivers/edac/edac_stub.c
+++ b/drivers/edac/edac_stub.c
@@ -65,7 +65,6 @@
 {
 	int err = 0;
 
-
 	if (atomic_read(&edac_subsys_valid))
 		goto out;
 
@@ -78,20 +77,14 @@
 
 out:
 	atomic_inc(&edac_subsys_valid);
-
-printk("%s() edac instance %d\n",
-	__func__, atomic_read(&edac_subsys_valid));
-
 	return &edac_subsys;
 }
 EXPORT_SYMBOL_GPL(edac_get_sysfs_subsys);
 
 void edac_put_sysfs_subsys(void)
 {
-		/* last user unregisters it */
+	/* last user unregisters it */
 	if (atomic_dec_and_test(&edac_subsys_valid))
 		bus_unregister(&edac_subsys);
-printk("%s() edac instance %d\n",
-	__func__, atomic_read(&edac_subsys_valid));
 }
 EXPORT_SYMBOL_GPL(edac_put_sysfs_subsys);
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c
index 11253ef..9fd8ff5 100644
--- a/drivers/edac/i7core_edac.c
+++ b/drivers/edac/i7core_edac.c
@@ -1101,7 +1101,7 @@
 
 static void addrmatch_release(struct device *device)
 {
-	debugf1("Releasing device %s\n", __func__, dev_name(device));
+	debugf1("Releasing device %s\n", dev_name(device));
 }
 
 static struct device_type addrmatch_type = {
@@ -1131,7 +1131,7 @@
 
 static void all_channel_counts_release(struct device *device)
 {
-	debugf1("Releasing device %s\n", __func__, dev_name(device));
+	debugf1("Releasing device %s\n", dev_name(device));
 }
 
 static struct device_type all_channel_counts_type = {
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c
index 69ddefe..bf0d73a 100644
--- a/drivers/edac/mpc85xx_edac.c
+++ b/drivers/edac/mpc85xx_edac.c
@@ -149,6 +149,12 @@
 	return 0;
 }
 
+static void mpc85xx_remove_sysfs_attributes(struct mem_ctl_info *mci)
+{
+	device_remove_file(&mci->dev, &dev_attr_inject_data_hi);
+	device_remove_file(&mci->dev, &dev_attr_inject_data_lo);
+	device_remove_file(&mci->dev, &dev_attr_inject_ctrl);
+}
 
 /**************************** PCI Err device ***************************/
 #ifdef CONFIG_PCI
@@ -1127,6 +1133,7 @@
 		 orig_ddr_err_disable);
 	out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_SBE, orig_ddr_err_sbe);
 
+	mpc85xx_remove_sysfs_attributes(mci);
 	edac_mc_del_mc(&op->dev);
 	edac_mc_free(mci);
 	return 0;