Commit 4e8d230d authored by Takashi Iwai's avatar Takashi Iwai Committed by Borislav Petkov

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: default avatarTakashi Iwai <tiwai@suse.de>
Link: http://lkml.kernel.org/r/1423046938-18111-3-git-send-email-tiwai@suse.deSigned-off-by: default avatarBorislav Petkov <bp@suse.de>
parent 2c1946b6
...@@ -446,7 +446,9 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num, ...@@ -446,7 +446,9 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
unsigned n_layers, unsigned n_layers,
struct edac_mc_layer *layers, struct edac_mc_layer *layers,
unsigned sz_pvt); unsigned sz_pvt);
extern int edac_mc_add_mc(struct mem_ctl_info *mci); extern int edac_mc_add_mc_with_groups(struct mem_ctl_info *mci,
const struct attribute_group **groups);
#define edac_mc_add_mc(mci) edac_mc_add_mc_with_groups(mci, NULL)
extern void edac_mc_free(struct mem_ctl_info *mci); extern void edac_mc_free(struct mem_ctl_info *mci);
extern struct mem_ctl_info *edac_mc_find(int idx); extern struct mem_ctl_info *edac_mc_find(int idx);
extern struct mem_ctl_info *find_mci_by_dev(struct device *dev); extern struct mem_ctl_info *find_mci_by_dev(struct device *dev);
......
...@@ -710,9 +710,10 @@ struct mem_ctl_info *edac_mc_find(int idx) ...@@ -710,9 +710,10 @@ struct mem_ctl_info *edac_mc_find(int idx)
EXPORT_SYMBOL(edac_mc_find); EXPORT_SYMBOL(edac_mc_find);
/** /**
* edac_mc_add_mc: Insert the 'mci' structure into the mci global list and * edac_mc_add_mc_with_groups: Insert the 'mci' structure into the mci
* create sysfs entries associated with mci structure * global list and create sysfs entries associated with mci structure
* @mci: pointer to the mci structure to be added to the list * @mci: pointer to the mci structure to be added to the list
* @groups: optional attribute groups for the driver-specific sysfs entries
* *
* Return: * Return:
* 0 Success * 0 Success
...@@ -720,7 +721,8 @@ EXPORT_SYMBOL(edac_mc_find); ...@@ -720,7 +721,8 @@ EXPORT_SYMBOL(edac_mc_find);
*/ */
/* FIXME - should a warning be printed if no error detection? correction? */ /* FIXME - should a warning be printed if no error detection? correction? */
int edac_mc_add_mc(struct mem_ctl_info *mci) int edac_mc_add_mc_with_groups(struct mem_ctl_info *mci,
const struct attribute_group **groups)
{ {
int ret = -EINVAL; int ret = -EINVAL;
edac_dbg(0, "\n"); edac_dbg(0, "\n");
...@@ -771,7 +773,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci) ...@@ -771,7 +773,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci)
mci->bus = &mc_bus[mci->mc_idx]; mci->bus = &mc_bus[mci->mc_idx];
if (edac_create_sysfs_mci_device(mci)) { if (edac_create_sysfs_mci_device(mci, groups)) {
edac_mc_printk(mci, KERN_WARNING, edac_mc_printk(mci, KERN_WARNING,
"failed to create sysfs device\n"); "failed to create sysfs device\n");
goto fail1; goto fail1;
...@@ -805,7 +807,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci) ...@@ -805,7 +807,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci)
mutex_unlock(&mem_ctls_mutex); mutex_unlock(&mem_ctls_mutex);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(edac_mc_add_mc); EXPORT_SYMBOL_GPL(edac_mc_add_mc_with_groups);
/** /**
* edac_mc_del_mc: Remove sysfs entries for specified mci structure and * edac_mc_del_mc: Remove sysfs entries for specified mci structure and
......
...@@ -974,7 +974,8 @@ static int edac_create_debug_nodes(struct mem_ctl_info *mci) ...@@ -974,7 +974,8 @@ static int edac_create_debug_nodes(struct mem_ctl_info *mci)
* 0 Success * 0 Success
* !0 Failure * !0 Failure
*/ */
int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) int edac_create_sysfs_mci_device(struct mem_ctl_info *mci,
const struct attribute_group **groups)
{ {
int i, err; int i, err;
...@@ -998,6 +999,7 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) ...@@ -998,6 +999,7 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
mci->dev.parent = mci_pdev; mci->dev.parent = mci_pdev;
mci->dev.bus = mci->bus; mci->dev.bus = mci->bus;
mci->dev.groups = groups;
dev_set_name(&mci->dev, "mc%d", mci->mc_idx); dev_set_name(&mci->dev, "mc%d", mci->mc_idx);
dev_set_drvdata(&mci->dev, mci); dev_set_drvdata(&mci->dev, mci);
pm_runtime_forbid(&mci->dev); pm_runtime_forbid(&mci->dev);
......
...@@ -22,7 +22,8 @@ ...@@ -22,7 +22,8 @@
/* on edac_mc_sysfs.c */ /* on edac_mc_sysfs.c */
int edac_mc_sysfs_init(void); int edac_mc_sysfs_init(void);
void edac_mc_sysfs_exit(void); void edac_mc_sysfs_exit(void);
extern int edac_create_sysfs_mci_device(struct mem_ctl_info *mci); extern int edac_create_sysfs_mci_device(struct mem_ctl_info *mci,
const struct attribute_group **groups);
extern void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci); extern void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci);
void edac_unregister_sysfs(struct mem_ctl_info *mci); void edac_unregister_sysfs(struct mem_ctl_info *mci);
extern int edac_get_log_ue(void); extern int edac_get_log_ue(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment