aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-02-04 05:48:52 -0500
committerBorislav Petkov <bp@suse.de>2015-02-23 07:07:41 -0500
commit4e8d230de9c1dff8e587ae769e46fcddb3d98f1c (patch)
tree3a94888ddd239d04aab3ff1458cd3f3f4afa08f3
parent2c1946b6d6290c74c6ad8d0915590d64f33a034d (diff)
EDAC: Allow to pass driver-specific attribute groups
Add edac_mc_add_mc_with_groups() for initializing the mem_ctl_info object with the optional attribute groups. This allows drivers to pass additional sysfs entries without manual (and racy) device_create_file() and co calls. edac_mc_add_mc() is kept as is, just calling edac_mc_add_with_groups() with NULL groups. Signed-off-by: Takashi Iwai <tiwai@suse.de> Link: http://lkml.kernel.org/r/1423046938-18111-3-git-send-email-tiwai@suse.de Signed-off-by: Borislav Petkov <bp@suse.de>
-rw-r--r--drivers/edac/edac_core.h4
-rw-r--r--drivers/edac/edac_mc.c12
-rw-r--r--drivers/edac/edac_mc_sysfs.c4
-rw-r--r--drivers/edac/edac_module.h3
4 files changed, 15 insertions, 8 deletions
diff --git a/drivers/edac/edac_core.h b/drivers/edac/edac_core.h
index 6c9f381e8fe6..ad42587c3f4d 100644
--- a/drivers/edac/edac_core.h
+++ b/drivers/edac/edac_core.h
@@ -446,7 +446,9 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
446 unsigned n_layers, 446 unsigned n_layers,
447 struct edac_mc_layer *layers, 447 struct edac_mc_layer *layers,
448 unsigned sz_pvt); 448 unsigned sz_pvt);
449extern int edac_mc_add_mc(struct mem_ctl_info *mci); 449extern int edac_mc_add_mc_with_groups(struct mem_ctl_info *mci,
450 const struct attribute_group **groups);
451#define edac_mc_add_mc(mci) edac_mc_add_mc_with_groups(mci, NULL)
450extern void edac_mc_free(struct mem_ctl_info *mci); 452extern void edac_mc_free(struct mem_ctl_info *mci);
451extern struct mem_ctl_info *edac_mc_find(int idx); 453extern struct mem_ctl_info *edac_mc_find(int idx);
452extern struct mem_ctl_info *find_mci_by_dev(struct device *dev); 454extern struct mem_ctl_info *find_mci_by_dev(struct device *dev);
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
index 1747906f10ce..af3be1914dbb 100644
--- a/drivers/edac/edac_mc.c
+++ b/drivers/edac/edac_mc.c
@@ -710,9 +710,10 @@ struct mem_ctl_info *edac_mc_find(int idx)
710EXPORT_SYMBOL(edac_mc_find); 710EXPORT_SYMBOL(edac_mc_find);
711 711
712/** 712/**
713 * edac_mc_add_mc: Insert the 'mci' structure into the mci global list and 713 * edac_mc_add_mc_with_groups: Insert the 'mci' structure into the mci
714 * create sysfs entries associated with mci structure 714 * global list and create sysfs entries associated with mci structure
715 * @mci: pointer to the mci structure to be added to the list 715 * @mci: pointer to the mci structure to be added to the list
716 * @groups: optional attribute groups for the driver-specific sysfs entries
716 * 717 *
717 * Return: 718 * Return:
718 * 0 Success 719 * 0 Success
@@ -720,7 +721,8 @@ EXPORT_SYMBOL(edac_mc_find);
720 */ 721 */
721 722
722/* FIXME - should a warning be printed if no error detection? correction? */ 723/* FIXME - should a warning be printed if no error detection? correction? */
723int edac_mc_add_mc(struct mem_ctl_info *mci) 724int edac_mc_add_mc_with_groups(struct mem_ctl_info *mci,
725 const struct attribute_group **groups)
724{ 726{
725 int ret = -EINVAL; 727 int ret = -EINVAL;
726 edac_dbg(0, "\n"); 728 edac_dbg(0, "\n");
@@ -771,7 +773,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci)
771 773
772 mci->bus = &mc_bus[mci->mc_idx]; 774 mci->bus = &mc_bus[mci->mc_idx];
773 775
774 if (edac_create_sysfs_mci_device(mci)) { 776 if (edac_create_sysfs_mci_device(mci, groups)) {
775 edac_mc_printk(mci, KERN_WARNING, 777 edac_mc_printk(mci, KERN_WARNING,
776 "failed to create sysfs device\n"); 778 "failed to create sysfs device\n");
777 goto fail1; 779 goto fail1;
@@ -805,7 +807,7 @@ fail0:
805 mutex_unlock(&mem_ctls_mutex); 807 mutex_unlock(&mem_ctls_mutex);
806 return ret; 808 return ret;
807} 809}
808EXPORT_SYMBOL_GPL(edac_mc_add_mc); 810EXPORT_SYMBOL_GPL(edac_mc_add_mc_with_groups);
809 811
810/** 812/**
811 * edac_mc_del_mc: Remove sysfs entries for specified mci structure and 813 * edac_mc_del_mc: Remove sysfs entries for specified mci structure and
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index 0bcd64234a03..3a283819970b 100644
--- a/drivers/edac/edac_mc_sysfs.c
+++ b/drivers/edac/edac_mc_sysfs.c
@@ -974,7 +974,8 @@ nomem:
974 * 0 Success 974 * 0 Success
975 * !0 Failure 975 * !0 Failure
976 */ 976 */
977int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) 977int edac_create_sysfs_mci_device(struct mem_ctl_info *mci,
978 const struct attribute_group **groups)
978{ 979{
979 int i, err; 980 int i, err;
980 981
@@ -998,6 +999,7 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
998 999
999 mci->dev.parent = mci_pdev; 1000 mci->dev.parent = mci_pdev;
1000 mci->dev.bus = mci->bus; 1001 mci->dev.bus = mci->bus;
1002 mci->dev.groups = groups;
1001 dev_set_name(&mci->dev, "mc%d", mci->mc_idx); 1003 dev_set_name(&mci->dev, "mc%d", mci->mc_idx);
1002 dev_set_drvdata(&mci->dev, mci); 1004 dev_set_drvdata(&mci->dev, mci);
1003 pm_runtime_forbid(&mci->dev); 1005 pm_runtime_forbid(&mci->dev);
diff --git a/drivers/edac/edac_module.h b/drivers/edac/edac_module.h
index f2118bfcf8df..26ecc52e073d 100644
--- a/drivers/edac/edac_module.h
+++ b/drivers/edac/edac_module.h
@@ -22,7 +22,8 @@
22 /* on edac_mc_sysfs.c */ 22 /* on edac_mc_sysfs.c */
23int edac_mc_sysfs_init(void); 23int edac_mc_sysfs_init(void);
24void edac_mc_sysfs_exit(void); 24void edac_mc_sysfs_exit(void);
25extern int edac_create_sysfs_mci_device(struct mem_ctl_info *mci); 25extern int edac_create_sysfs_mci_device(struct mem_ctl_info *mci,
26 const struct attribute_group **groups);
26extern void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci); 27extern void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci);
27void edac_unregister_sysfs(struct mem_ctl_info *mci); 28void edac_unregister_sysfs(struct mem_ctl_info *mci);
28extern int edac_get_log_ue(void); 29extern int edac_get_log_ue(void);