aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/base/class.c44
-rw-r--r--drivers/base/core.c45
2 files changed, 31 insertions, 58 deletions
diff --git a/drivers/base/class.c b/drivers/base/class.c
index 9cbfde23b9e3..4d2222618b78 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -312,9 +312,6 @@ static void class_dev_release(struct kobject * kobj)
312 312
313 pr_debug("device class '%s': release.\n", cd->class_id); 313 pr_debug("device class '%s': release.\n", cd->class_id);
314 314
315 kfree(cd->devt_attr);
316 cd->devt_attr = NULL;
317
318 if (cd->release) 315 if (cd->release)
319 cd->release(cd); 316 cd->release(cd);
320 else if (cls->release) 317 else if (cls->release)
@@ -547,6 +544,9 @@ static ssize_t show_dev(struct class_device *class_dev, char *buf)
547 return print_dev_t(buf, class_dev->devt); 544 return print_dev_t(buf, class_dev->devt);
548} 545}
549 546
547static struct class_device_attribute class_devt_attr =
548 __ATTR(dev, S_IRUGO, show_dev, NULL);
549
550static ssize_t store_uevent(struct class_device *class_dev, 550static ssize_t store_uevent(struct class_device *class_dev,
551 const char *buf, size_t count) 551 const char *buf, size_t count)
552{ 552{
@@ -554,6 +554,9 @@ static ssize_t store_uevent(struct class_device *class_dev,
554 return count; 554 return count;
555} 555}
556 556
557static struct class_device_attribute class_uevent_attr =
558 __ATTR(uevent, S_IWUSR, NULL, store_uevent);
559
557void class_device_initialize(struct class_device *class_dev) 560void class_device_initialize(struct class_device *class_dev)
558{ 561{
559 kobj_set_kset_s(class_dev, class_obj_subsys); 562 kobj_set_kset_s(class_dev, class_obj_subsys);
@@ -603,30 +606,15 @@ int class_device_add(struct class_device *class_dev)
603 &parent_class->subsys.kobj, "subsystem"); 606 &parent_class->subsys.kobj, "subsystem");
604 if (error) 607 if (error)
605 goto out3; 608 goto out3;
606 class_dev->uevent_attr.attr.name = "uevent"; 609
607 class_dev->uevent_attr.attr.mode = S_IWUSR; 610 error = class_device_create_file(class_dev, &class_uevent_attr);
608 class_dev->uevent_attr.store = store_uevent;
609 error = class_device_create_file(class_dev, &class_dev->uevent_attr);
610 if (error) 611 if (error)
611 goto out3; 612 goto out3;
612 613
613 if (MAJOR(class_dev->devt)) { 614 if (MAJOR(class_dev->devt)) {
614 struct class_device_attribute *attr; 615 error = class_device_create_file(class_dev, &class_devt_attr);
615 attr = kzalloc(sizeof(*attr), GFP_KERNEL); 616 if (error)
616 if (!attr) {
617 error = -ENOMEM;
618 goto out4;
619 }
620 attr->attr.name = "dev";
621 attr->attr.mode = S_IRUGO;
622 attr->show = show_dev;
623 error = class_device_create_file(class_dev, attr);
624 if (error) {
625 kfree(attr);
626 goto out4; 617 goto out4;
627 }
628
629 class_dev->devt_attr = attr;
630 } 618 }
631 619
632 error = class_device_add_attrs(class_dev); 620 error = class_device_add_attrs(class_dev);
@@ -669,10 +657,10 @@ int class_device_add(struct class_device *class_dev)
669 out6: 657 out6:
670 class_device_remove_attrs(class_dev); 658 class_device_remove_attrs(class_dev);
671 out5: 659 out5:
672 if (class_dev->devt_attr) 660 if (MAJOR(class_dev->devt))
673 class_device_remove_file(class_dev, class_dev->devt_attr); 661 class_device_remove_file(class_dev, &class_devt_attr);
674 out4: 662 out4:
675 class_device_remove_file(class_dev, &class_dev->uevent_attr); 663 class_device_remove_file(class_dev, &class_uevent_attr);
676 out3: 664 out3:
677 kobject_del(&class_dev->kobj); 665 kobject_del(&class_dev->kobj);
678 out2: 666 out2:
@@ -772,9 +760,9 @@ void class_device_del(struct class_device *class_dev)
772 sysfs_remove_link(&class_dev->kobj, "device"); 760 sysfs_remove_link(&class_dev->kobj, "device");
773 } 761 }
774 sysfs_remove_link(&class_dev->kobj, "subsystem"); 762 sysfs_remove_link(&class_dev->kobj, "subsystem");
775 class_device_remove_file(class_dev, &class_dev->uevent_attr); 763 class_device_remove_file(class_dev, &class_uevent_attr);
776 if (class_dev->devt_attr) 764 if (MAJOR(class_dev->devt))
777 class_device_remove_file(class_dev, class_dev->devt_attr); 765 class_device_remove_file(class_dev, &class_devt_attr);
778 class_device_remove_attrs(class_dev); 766 class_device_remove_attrs(class_dev);
779 class_device_remove_groups(class_dev); 767 class_device_remove_groups(class_dev);
780 768
diff --git a/drivers/base/core.c b/drivers/base/core.c
index e3fb87bfc6e1..0455aa78fa13 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -310,6 +310,9 @@ static ssize_t store_uevent(struct device *dev, struct device_attribute *attr,
310 return count; 310 return count;
311} 311}
312 312
313static struct device_attribute uevent_attr =
314 __ATTR(uevent, S_IRUGO | S_IWUSR, show_uevent, store_uevent);
315
313static int device_add_attributes(struct device *dev, 316static int device_add_attributes(struct device *dev,
314 struct device_attribute *attrs) 317 struct device_attribute *attrs)
315{ 318{
@@ -423,6 +426,9 @@ static ssize_t show_dev(struct device *dev, struct device_attribute *attr,
423 return print_dev_t(buf, dev->devt); 426 return print_dev_t(buf, dev->devt);
424} 427}
425 428
429static struct device_attribute devt_attr =
430 __ATTR(dev, S_IRUGO, show_dev, NULL);
431
426/* 432/*
427 * devices_subsys - structure to be registered with kobject core. 433 * devices_subsys - structure to be registered with kobject core.
428 */ 434 */
@@ -681,31 +687,14 @@ int device_add(struct device *dev)
681 blocking_notifier_call_chain(&dev->bus->bus_notifier, 687 blocking_notifier_call_chain(&dev->bus->bus_notifier,
682 BUS_NOTIFY_ADD_DEVICE, dev); 688 BUS_NOTIFY_ADD_DEVICE, dev);
683 689
684 dev->uevent_attr.attr.name = "uevent"; 690 error = device_create_file(dev, &uevent_attr);
685 dev->uevent_attr.attr.mode = S_IRUGO | S_IWUSR;
686 dev->uevent_attr.store = store_uevent;
687 dev->uevent_attr.show = show_uevent;
688 error = device_create_file(dev, &dev->uevent_attr);
689 if (error) 691 if (error)
690 goto attrError; 692 goto attrError;
691 693
692 if (MAJOR(dev->devt)) { 694 if (MAJOR(dev->devt)) {
693 struct device_attribute *attr; 695 error = device_create_file(dev, &devt_attr);
694 attr = kzalloc(sizeof(*attr), GFP_KERNEL); 696 if (error)
695 if (!attr) {
696 error = -ENOMEM;
697 goto ueventattrError;
698 }
699 attr->attr.name = "dev";
700 attr->attr.mode = S_IRUGO;
701 attr->show = show_dev;
702 error = device_create_file(dev, attr);
703 if (error) {
704 kfree(attr);
705 goto ueventattrError; 697 goto ueventattrError;
706 }
707
708 dev->devt_attr = attr;
709 } 698 }
710 699
711 if (dev->class) { 700 if (dev->class) {
@@ -766,10 +755,8 @@ int device_add(struct device *dev)
766 BUS_NOTIFY_DEL_DEVICE, dev); 755 BUS_NOTIFY_DEL_DEVICE, dev);
767 device_remove_attrs(dev); 756 device_remove_attrs(dev);
768 AttrsError: 757 AttrsError:
769 if (dev->devt_attr) { 758 if (MAJOR(dev->devt))
770 device_remove_file(dev, dev->devt_attr); 759 device_remove_file(dev, &devt_attr);
771 kfree(dev->devt_attr);
772 }
773 760
774 if (dev->class) { 761 if (dev->class) {
775 sysfs_remove_link(&dev->kobj, "subsystem"); 762 sysfs_remove_link(&dev->kobj, "subsystem");
@@ -791,7 +778,7 @@ int device_add(struct device *dev)
791 } 778 }
792 } 779 }
793 ueventattrError: 780 ueventattrError:
794 device_remove_file(dev, &dev->uevent_attr); 781 device_remove_file(dev, &uevent_attr);
795 attrError: 782 attrError:
796 kobject_uevent(&dev->kobj, KOBJ_REMOVE); 783 kobject_uevent(&dev->kobj, KOBJ_REMOVE);
797 kobject_del(&dev->kobj); 784 kobject_del(&dev->kobj);
@@ -868,10 +855,8 @@ void device_del(struct device * dev)
868 855
869 if (parent) 856 if (parent)
870 klist_del(&dev->knode_parent); 857 klist_del(&dev->knode_parent);
871 if (dev->devt_attr) { 858 if (MAJOR(dev->devt))
872 device_remove_file(dev, dev->devt_attr); 859 device_remove_file(dev, &devt_attr);
873 kfree(dev->devt_attr);
874 }
875 if (dev->class) { 860 if (dev->class) {
876 sysfs_remove_link(&dev->kobj, "subsystem"); 861 sysfs_remove_link(&dev->kobj, "subsystem");
877 /* If this is not a "fake" compatible device, remove the 862 /* If this is not a "fake" compatible device, remove the
@@ -925,7 +910,7 @@ void device_del(struct device * dev)
925 up(&dev->class->sem); 910 up(&dev->class->sem);
926 } 911 }
927 } 912 }
928 device_remove_file(dev, &dev->uevent_attr); 913 device_remove_file(dev, &uevent_attr);
929 device_remove_attrs(dev); 914 device_remove_attrs(dev);
930 bus_remove_device(dev); 915 bus_remove_device(dev);
931 916