diff options
| author | Takashi Iwai <tiwai@suse.de> | 2015-02-04 09:18:07 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-03-25 09:41:48 -0400 |
| commit | 46239902ecddd4690b6d800da258d0ab65a5cb78 (patch) | |
| tree | a5d84db6300867e108f1aef7129ae919988eec30 /drivers/base | |
| parent | 8a7d95f95c95f396decbd4cda6d4903fc4664946 (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.c | 40 |
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 | ||
| 838 | static struct attribute *fw_dev_attrs[] = { | ||
| 839 | &dev_attr_loading.attr, | ||
| 840 | NULL | ||
| 841 | }; | ||
| 842 | |||
| 843 | static struct bin_attribute *fw_dev_bin_attrs[] = { | ||
| 844 | &firmware_attr_data, | ||
| 845 | NULL | ||
| 846 | }; | ||
| 847 | |||
| 848 | static const struct attribute_group fw_dev_attr_group = { | ||
| 849 | .attrs = fw_dev_attrs, | ||
| 850 | .bin_attrs = fw_dev_bin_attrs, | ||
| 851 | }; | ||
| 852 | |||
| 853 | static const struct attribute_group *fw_dev_attr_groups[] = { | ||
| 854 | &fw_dev_attr_group, | ||
| 855 | NULL | ||
| 856 | }; | ||
| 857 | |||
| 838 | static struct firmware_priv * | 858 | static struct firmware_priv * |
| 839 | fw_create_instance(struct firmware *firmware, const char *fw_name, | 859 | fw_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; | ||
| 859 | exit: | 880 | exit: |
| 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); | ||
| 924 | err_del_bin_attr: | ||
| 925 | device_remove_bin_file(f_dev, &firmware_attr_data); | ||
| 926 | err_del_dev: | ||
| 927 | device_del(f_dev); | 929 | device_del(f_dev); |
| 928 | err_put_dev: | 930 | err_put_dev: |
| 929 | put_device(f_dev); | 931 | put_device(f_dev); |
