aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac/edac_device_sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/edac/edac_device_sysfs.c')
-rw-r--r--drivers/edac/edac_device_sysfs.c51
1 files changed, 46 insertions, 5 deletions
diff --git a/drivers/edac/edac_device_sysfs.c b/drivers/edac/edac_device_sysfs.c
index 849d569dd2ce..32b2a8e53dc7 100644
--- a/drivers/edac/edac_device_sysfs.c
+++ b/drivers/edac/edac_device_sysfs.c
@@ -9,8 +9,6 @@
9 * 9 *
10 */ 10 */
11 11
12#include <linux/module.h>
13#include <linux/sysdev.h>
14#include <linux/ctype.h> 12#include <linux/ctype.h>
15 13
16#include "edac_core.h" 14#include "edac_core.h"
@@ -622,6 +620,34 @@ static void edac_device_delete_instances(struct edac_device_ctl_info *edac_dev)
622/******************* edac_dev sysfs ctor/dtor code *************/ 620/******************* edac_dev sysfs ctor/dtor code *************/
623 621
624/* 622/*
623 * edac_device_add_sysfs_attributes
624 * add some attributes to this instance's main kobject
625 */
626static int edac_device_add_sysfs_attributes(
627 struct edac_device_ctl_info *edac_dev)
628{
629 int err;
630 struct edac_dev_sysfs_attribute *sysfs_attrib;
631
632 /* point to the start of the array and iterate over it
633 * adding each attribute listed to this mci instance's kobject
634 */
635 sysfs_attrib = edac_dev->sysfs_attributes;
636
637 while (sysfs_attrib->attr.name != NULL) {
638 err = sysfs_create_file(&edac_dev->kobj,
639 (struct attribute*) sysfs_attrib);
640 if (err) {
641 return err;
642 }
643
644 sysfs_attrib++;
645 }
646
647 return 0;
648}
649
650/*
625 * edac_device_create_sysfs() Constructor 651 * edac_device_create_sysfs() Constructor
626 * 652 *
627 * Create a new edac_device kobject instance, 653 * Create a new edac_device kobject instance,
@@ -642,6 +668,18 @@ int edac_device_create_sysfs(struct edac_device_ctl_info *edac_dev)
642 668
643 debugf0("%s() idx=%d\n", __func__, edac_dev->dev_idx); 669 debugf0("%s() idx=%d\n", __func__, edac_dev->dev_idx);
644 670
671 /* If the low level driver requests some sysfs entries
672 * then go create them here
673 */
674 if (edac_dev->sysfs_attributes != NULL) {
675 err = edac_device_add_sysfs_attributes(edac_dev);
676 if (err) {
677 debugf0("%s() failed to add sysfs attribs\n",
678 __func__);
679 goto err_unreg_object;
680 }
681 }
682
645 /* create a symlink from the edac device 683 /* create a symlink from the edac device
646 * to the platform 'device' being used for this 684 * to the platform 'device' being used for this
647 */ 685 */
@@ -650,7 +688,7 @@ int edac_device_create_sysfs(struct edac_device_ctl_info *edac_dev)
650 if (err) { 688 if (err) {
651 debugf0("%s() sysfs_create_link() returned err= %d\n", 689 debugf0("%s() sysfs_create_link() returned err= %d\n",
652 __func__, err); 690 __func__, err);
653 return err; 691 goto err_unreg_object;
654 } 692 }
655 693
656 debugf0("%s() calling create-instances, idx=%d\n", 694 debugf0("%s() calling create-instances, idx=%d\n",
@@ -659,14 +697,17 @@ int edac_device_create_sysfs(struct edac_device_ctl_info *edac_dev)
659 /* Create the first level instance directories */ 697 /* Create the first level instance directories */
660 err = edac_device_create_instances(edac_dev); 698 err = edac_device_create_instances(edac_dev);
661 if (err) { 699 if (err) {
662 goto error0; 700 goto err_remove_link;
663 } 701 }
664 702
665 return 0; 703 return 0;
666 704
667 /* Error unwind stack */ 705 /* Error unwind stack */
706err_remove_link:
707 /* remove the sym link */
708 sysfs_remove_link(&edac_dev->kobj, EDAC_DEVICE_SYMLINK);
668 709
669 error0: 710err_unreg_object:
670 edac_device_unregister_main_kobj(edac_dev); 711 edac_device_unregister_main_kobj(edac_dev);
671 712
672 return err; 713 return err;