aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac/edac_mc_sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/edac/edac_mc_sysfs.c')
-rw-r--r--drivers/edac/edac_mc_sysfs.c56
1 files changed, 32 insertions, 24 deletions
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index ed0bc07b8503..0ca1ca71157f 100644
--- a/drivers/edac/edac_mc_sysfs.c
+++ b/drivers/edac/edac_mc_sysfs.c
@@ -180,6 +180,9 @@ static ssize_t csrow_size_show(struct device *dev,
180 int i; 180 int i;
181 u32 nr_pages = 0; 181 u32 nr_pages = 0;
182 182
183 if (csrow->mci->csbased)
184 return sprintf(data, "%u\n", PAGES_TO_MiB(csrow->nr_pages));
185
183 for (i = 0; i < csrow->nr_channels; i++) 186 for (i = 0; i < csrow->nr_channels; i++)
184 nr_pages += csrow->channels[i]->dimm->nr_pages; 187 nr_pages += csrow->channels[i]->dimm->nr_pages;
185 return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages)); 188 return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages));
@@ -373,6 +376,7 @@ static int edac_create_csrow_object(struct mem_ctl_info *mci,
373 csrow->dev.bus = &mci->bus; 376 csrow->dev.bus = &mci->bus;
374 device_initialize(&csrow->dev); 377 device_initialize(&csrow->dev);
375 csrow->dev.parent = &mci->dev; 378 csrow->dev.parent = &mci->dev;
379 csrow->mci = mci;
376 dev_set_name(&csrow->dev, "csrow%d", index); 380 dev_set_name(&csrow->dev, "csrow%d", index);
377 dev_set_drvdata(&csrow->dev, csrow); 381 dev_set_drvdata(&csrow->dev, csrow);
378 382
@@ -468,8 +472,7 @@ static void edac_delete_csrow_objects(struct mem_ctl_info *mci)
468 device_remove_file(&csrow->dev, 472 device_remove_file(&csrow->dev,
469 dynamic_csrow_ce_count_attr[chan]); 473 dynamic_csrow_ce_count_attr[chan]);
470 } 474 }
471 put_device(&mci->csrows[i]->dev); 475 device_unregister(&mci->csrows[i]->dev);
472 device_del(&mci->csrows[i]->dev);
473 } 476 }
474} 477}
475#endif 478#endif
@@ -777,10 +780,14 @@ static ssize_t mci_size_mb_show(struct device *dev,
777 for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) { 780 for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) {
778 struct csrow_info *csrow = mci->csrows[csrow_idx]; 781 struct csrow_info *csrow = mci->csrows[csrow_idx];
779 782
780 for (j = 0; j < csrow->nr_channels; j++) { 783 if (csrow->mci->csbased) {
781 struct dimm_info *dimm = csrow->channels[j]->dimm; 784 total_pages += csrow->nr_pages;
785 } else {
786 for (j = 0; j < csrow->nr_channels; j++) {
787 struct dimm_info *dimm = csrow->channels[j]->dimm;
782 788
783 total_pages += dimm->nr_pages; 789 total_pages += dimm->nr_pages;
790 }
784 } 791 }
785 } 792 }
786 793
@@ -838,14 +845,8 @@ static ssize_t edac_fake_inject_write(struct file *file,
838 return count; 845 return count;
839} 846}
840 847
841static int debugfs_open(struct inode *inode, struct file *file)
842{
843 file->private_data = inode->i_private;
844 return 0;
845}
846
847static const struct file_operations debug_fake_inject_fops = { 848static const struct file_operations debug_fake_inject_fops = {
848 .open = debugfs_open, 849 .open = simple_open,
849 .write = edac_fake_inject_write, 850 .write = edac_fake_inject_write,
850 .llseek = generic_file_llseek, 851 .llseek = generic_file_llseek,
851}; 852};
@@ -1053,11 +1054,9 @@ fail:
1053 struct dimm_info *dimm = mci->dimms[i]; 1054 struct dimm_info *dimm = mci->dimms[i];
1054 if (dimm->nr_pages == 0) 1055 if (dimm->nr_pages == 0)
1055 continue; 1056 continue;
1056 put_device(&dimm->dev); 1057 device_unregister(&dimm->dev);
1057 device_del(&dimm->dev);
1058 } 1058 }
1059 put_device(&mci->dev); 1059 device_unregister(&mci->dev);
1060 device_del(&mci->dev);
1061 bus_unregister(&mci->bus); 1060 bus_unregister(&mci->bus);
1062 kfree(mci->bus.name); 1061 kfree(mci->bus.name);
1063 return err; 1062 return err;
@@ -1084,16 +1083,14 @@ void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)
1084 if (dimm->nr_pages == 0) 1083 if (dimm->nr_pages == 0)
1085 continue; 1084 continue;
1086 edac_dbg(0, "removing device %s\n", dev_name(&dimm->dev)); 1085 edac_dbg(0, "removing device %s\n", dev_name(&dimm->dev));
1087 put_device(&dimm->dev); 1086 device_unregister(&dimm->dev);
1088 device_del(&dimm->dev);
1089 } 1087 }
1090} 1088}
1091 1089
1092void edac_unregister_sysfs(struct mem_ctl_info *mci) 1090void edac_unregister_sysfs(struct mem_ctl_info *mci)
1093{ 1091{
1094 edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev)); 1092 edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev));
1095 put_device(&mci->dev); 1093 device_unregister(&mci->dev);
1096 device_del(&mci->dev);
1097 bus_unregister(&mci->bus); 1094 bus_unregister(&mci->bus);
1098 kfree(mci->bus.name); 1095 kfree(mci->bus.name);
1099} 1096}
@@ -1124,10 +1121,15 @@ int __init edac_mc_sysfs_init(void)
1124 edac_subsys = edac_get_sysfs_subsys(); 1121 edac_subsys = edac_get_sysfs_subsys();
1125 if (edac_subsys == NULL) { 1122 if (edac_subsys == NULL) {
1126 edac_dbg(1, "no edac_subsys\n"); 1123 edac_dbg(1, "no edac_subsys\n");
1127 return -EINVAL; 1124 err = -EINVAL;
1125 goto out;
1128 } 1126 }
1129 1127
1130 mci_pdev = kzalloc(sizeof(*mci_pdev), GFP_KERNEL); 1128 mci_pdev = kzalloc(sizeof(*mci_pdev), GFP_KERNEL);
1129 if (!mci_pdev) {
1130 err = -ENOMEM;
1131 goto out_put_sysfs;
1132 }
1131 1133
1132 mci_pdev->bus = edac_subsys; 1134 mci_pdev->bus = edac_subsys;
1133 mci_pdev->type = &mc_attr_type; 1135 mci_pdev->type = &mc_attr_type;
@@ -1136,16 +1138,22 @@ int __init edac_mc_sysfs_init(void)
1136 1138
1137 err = device_add(mci_pdev); 1139 err = device_add(mci_pdev);
1138 if (err < 0) 1140 if (err < 0)
1139 return err; 1141 goto out_dev_free;
1140 1142
1141 edac_dbg(0, "device %s created\n", dev_name(mci_pdev)); 1143 edac_dbg(0, "device %s created\n", dev_name(mci_pdev));
1142 1144
1143 return 0; 1145 return 0;
1146
1147 out_dev_free:
1148 kfree(mci_pdev);
1149 out_put_sysfs:
1150 edac_put_sysfs_subsys();
1151 out:
1152 return err;
1144} 1153}
1145 1154
1146void __exit edac_mc_sysfs_exit(void) 1155void __exit edac_mc_sysfs_exit(void)
1147{ 1156{
1148 put_device(mci_pdev); 1157 device_unregister(mci_pdev);
1149 device_del(mci_pdev);
1150 edac_put_sysfs_subsys(); 1158 edac_put_sysfs_subsys();
1151} 1159}