aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-02-04 09:18:07 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-03-25 09:41:48 -0400
commit46239902ecddd4690b6d800da258d0ab65a5cb78 (patch)
treea5d84db6300867e108f1aef7129ae919988eec30 /drivers/base
parent8a7d95f95c95f396decbd4cda6d4903fc4664946 (diff)
firmware: Avoid manual device_create_file() calls
Use the static attribute groups assigned to the device instead of manual device_create_file() & co calls. It simplifies the code and can avoid possible races, too. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/firmware_class.c40
1 files changed, 21 insertions, 19 deletions
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index 710540f5ba7e..1b5bfd7cf6b6 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -835,6 +835,26 @@ static struct bin_attribute firmware_attr_data = {
835 .write = firmware_data_write, 835 .write = firmware_data_write,
836}; 836};
837 837
838static struct attribute *fw_dev_attrs[] = {
839 &dev_attr_loading.attr,
840 NULL
841};
842
843static struct bin_attribute *fw_dev_bin_attrs[] = {
844 &firmware_attr_data,
845 NULL
846};
847
848static const struct attribute_group fw_dev_attr_group = {
849 .attrs = fw_dev_attrs,
850 .bin_attrs = fw_dev_bin_attrs,
851};
852
853static const struct attribute_group *fw_dev_attr_groups[] = {
854 &fw_dev_attr_group,
855 NULL
856};
857
838static struct firmware_priv * 858static struct firmware_priv *
839fw_create_instance(struct firmware *firmware, const char *fw_name, 859fw_create_instance(struct firmware *firmware, const char *fw_name,
840 struct device *device, unsigned int opt_flags) 860 struct device *device, unsigned int opt_flags)
@@ -856,6 +876,7 @@ fw_create_instance(struct firmware *firmware, const char *fw_name,
856 dev_set_name(f_dev, "%s", fw_name); 876 dev_set_name(f_dev, "%s", fw_name);
857 f_dev->parent = device; 877 f_dev->parent = device;
858 f_dev->class = &firmware_class; 878 f_dev->class = &firmware_class;
879 f_dev->groups = fw_dev_attr_groups;
859exit: 880exit:
860 return fw_priv; 881 return fw_priv;
861} 882}
@@ -879,25 +900,10 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
879 goto err_put_dev; 900 goto err_put_dev;
880 } 901 }
881 902
882 retval = device_create_bin_file(f_dev, &firmware_attr_data);
883 if (retval) {
884 dev_err(f_dev, "%s: sysfs_create_bin_file failed\n", __func__);
885 goto err_del_dev;
886 }
887
888 mutex_lock(&fw_lock); 903 mutex_lock(&fw_lock);
889 list_add(&buf->pending_list, &pending_fw_head); 904 list_add(&buf->pending_list, &pending_fw_head);
890 mutex_unlock(&fw_lock); 905 mutex_unlock(&fw_lock);
891 906
892 retval = device_create_file(f_dev, &dev_attr_loading);
893 if (retval) {
894 mutex_lock(&fw_lock);
895 list_del_init(&buf->pending_list);
896 mutex_unlock(&fw_lock);
897 dev_err(f_dev, "%s: device_create_file failed\n", __func__);
898 goto err_del_bin_attr;
899 }
900
901 if (opt_flags & FW_OPT_UEVENT) { 907 if (opt_flags & FW_OPT_UEVENT) {
902 buf->need_uevent = true; 908 buf->need_uevent = true;
903 dev_set_uevent_suppress(f_dev, false); 909 dev_set_uevent_suppress(f_dev, false);
@@ -920,10 +926,6 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
920 else if (!buf->data) 926 else if (!buf->data)
921 retval = -ENOMEM; 927 retval = -ENOMEM;
922 928
923 device_remove_file(f_dev, &dev_attr_loading);
924err_del_bin_attr:
925 device_remove_bin_file(f_dev, &firmware_attr_data);
926err_del_dev:
927 device_del(f_dev); 929 device_del(f_dev);
928err_put_dev: 930err_put_dev:
929 put_device(f_dev); 931 put_device(f_dev);