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>
This commit is contained in:
parent
8a7d95f95c
commit
46239902ec
1 changed files with 21 additions and 19 deletions
|
@ -835,6 +835,26 @@ static struct bin_attribute firmware_attr_data = {
|
||||||
.write = firmware_data_write,
|
.write = firmware_data_write,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct attribute *fw_dev_attrs[] = {
|
||||||
|
&dev_attr_loading.attr,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bin_attribute *fw_dev_bin_attrs[] = {
|
||||||
|
&firmware_attr_data,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct attribute_group fw_dev_attr_group = {
|
||||||
|
.attrs = fw_dev_attrs,
|
||||||
|
.bin_attrs = fw_dev_bin_attrs,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct attribute_group *fw_dev_attr_groups[] = {
|
||||||
|
&fw_dev_attr_group,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
static struct firmware_priv *
|
static struct firmware_priv *
|
||||||
fw_create_instance(struct firmware *firmware, const char *fw_name,
|
fw_create_instance(struct firmware *firmware, const char *fw_name,
|
||||||
struct device *device, unsigned int opt_flags)
|
struct device *device, unsigned int opt_flags)
|
||||||
|
@ -856,6 +876,7 @@ fw_create_instance(struct firmware *firmware, const char *fw_name,
|
||||||
dev_set_name(f_dev, "%s", fw_name);
|
dev_set_name(f_dev, "%s", fw_name);
|
||||||
f_dev->parent = device;
|
f_dev->parent = device;
|
||||||
f_dev->class = &firmware_class;
|
f_dev->class = &firmware_class;
|
||||||
|
f_dev->groups = fw_dev_attr_groups;
|
||||||
exit:
|
exit:
|
||||||
return fw_priv;
|
return fw_priv;
|
||||||
}
|
}
|
||||||
|
@ -879,25 +900,10 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
|
||||||
goto err_put_dev;
|
goto err_put_dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = device_create_bin_file(f_dev, &firmware_attr_data);
|
|
||||||
if (retval) {
|
|
||||||
dev_err(f_dev, "%s: sysfs_create_bin_file failed\n", __func__);
|
|
||||||
goto err_del_dev;
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_lock(&fw_lock);
|
mutex_lock(&fw_lock);
|
||||||
list_add(&buf->pending_list, &pending_fw_head);
|
list_add(&buf->pending_list, &pending_fw_head);
|
||||||
mutex_unlock(&fw_lock);
|
mutex_unlock(&fw_lock);
|
||||||
|
|
||||||
retval = device_create_file(f_dev, &dev_attr_loading);
|
|
||||||
if (retval) {
|
|
||||||
mutex_lock(&fw_lock);
|
|
||||||
list_del_init(&buf->pending_list);
|
|
||||||
mutex_unlock(&fw_lock);
|
|
||||||
dev_err(f_dev, "%s: device_create_file failed\n", __func__);
|
|
||||||
goto err_del_bin_attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (opt_flags & FW_OPT_UEVENT) {
|
if (opt_flags & FW_OPT_UEVENT) {
|
||||||
buf->need_uevent = true;
|
buf->need_uevent = true;
|
||||||
dev_set_uevent_suppress(f_dev, false);
|
dev_set_uevent_suppress(f_dev, false);
|
||||||
|
@ -920,10 +926,6 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
|
||||||
else if (!buf->data)
|
else if (!buf->data)
|
||||||
retval = -ENOMEM;
|
retval = -ENOMEM;
|
||||||
|
|
||||||
device_remove_file(f_dev, &dev_attr_loading);
|
|
||||||
err_del_bin_attr:
|
|
||||||
device_remove_bin_file(f_dev, &firmware_attr_data);
|
|
||||||
err_del_dev:
|
|
||||||
device_del(f_dev);
|
device_del(f_dev);
|
||||||
err_put_dev:
|
err_put_dev:
|
||||||
put_device(f_dev);
|
put_device(f_dev);
|
||||||
|
|
Loading…
Reference in a new issue