diff options
| author | David Keitel <dkeitel@codeaurora.org> | 2016-03-15 11:08:18 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:24:26 -0700 |
| commit | 286601f9a276ff82d3ccafdfd5de5c2bbcbb51c0 (patch) | |
| tree | e62f7c196d1e8922eb08529c5f88bc4eab13b2c9 /drivers/base/firmware_class.c | |
| parent | 881d8ec58a0687249a634c18348a7f33056ee1ef (diff) | |
firmware_class: fix direct firmware loading API support
The direct firmware class API support original relied
on the destination address to determine which file operations
to link to the data binary file. Since the 4.4 kernel version,
this was changed to an attribute group.
Fix this by adding a direct firmware API attribute group and
appropriately assign it when necessary.
Signed-off-by: David Keitel <dkeitel@codeaurora.org>
Diffstat (limited to 'drivers/base/firmware_class.c')
| -rw-r--r-- | drivers/base/firmware_class.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 0052affdca31..5645850cb4d3 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -855,13 +855,6 @@ out: return retval; } -static struct bin_attribute firmware_direct_attr_data = { - .attr = { .name = "data", .mode = 0644 }, - .size = 0, - .read = firmware_direct_read, - .write = firmware_direct_write, -}; - static ssize_t firmware_data_read(struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buffer, loff_t offset, size_t count) @@ -1011,6 +1004,13 @@ static struct bin_attribute firmware_attr_data = { .write = firmware_data_write, }; +static struct bin_attribute firmware_direct_attr_data = { + .attr = { .name = "data", .mode = 0644 }, + .size = 0, + .read = firmware_direct_read, + .write = firmware_direct_write, +}; + static struct attribute *fw_dev_attrs[] = { &dev_attr_loading.attr, NULL @@ -1026,11 +1026,26 @@ static const struct attribute_group fw_dev_attr_group = { .bin_attrs = fw_dev_bin_attrs, }; +static struct bin_attribute *fw_dev_direct_bin_attrs[] = { + &firmware_direct_attr_data, + NULL +}; + +static const struct attribute_group fw_dev_direct_attr_group = { + .attrs = fw_dev_attrs, + .bin_attrs = fw_dev_direct_bin_attrs, +}; + static const struct attribute_group *fw_dev_attr_groups[] = { &fw_dev_attr_group, NULL }; +static const struct attribute_group *fw_dev_direct_attr_groups[] = { + &fw_dev_direct_attr_group, + NULL +}; + static struct firmware_priv * fw_create_instance(struct firmware *firmware, struct fw_desc *desc) { @@ -1047,9 +1062,6 @@ fw_create_instance(struct firmware *firmware, struct fw_desc *desc) fw_priv->nowait = !!(desc->opt_flags & FW_OPT_NOWAIT); fw_priv->fw = firmware; - INIT_DELAYED_WORK(&fw_priv->timeout_work, - firmware_class_timeout_work); - f_dev = &fw_priv->dev; device_initialize(f_dev); @@ -1068,12 +1080,13 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, int retval = 0; struct device *f_dev = &fw_priv->dev; struct firmware_buf *buf = fw_priv->buf; - struct bin_attribute *fw_attr_data = buf->dest_addr ? - &firmware_direct_attr_data : &firmware_attr_data; /* fall back on userspace loading */ buf->is_paged_buf = buf->dest_addr ? false : true; + if (buf->dest_addr) + f_dev->groups = fw_dev_direct_attr_groups; + dev_set_uevent_suppress(f_dev, true); retval = device_add(f_dev); @@ -1082,12 +1095,6 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, goto err_put_dev; } - retval = device_create_bin_file(f_dev, fw_attr_data); - if (retval) { - dev_err(f_dev, "%s: sysfs_create_bin_file failed\n", __func__); - goto err_del_dev; - } - mutex_lock(&fw_lock); list_add(&buf->pending_list, &pending_fw_head); mutex_unlock(&fw_lock); @@ -1548,7 +1555,6 @@ _request_firmware_nowait( get_device(desc->device); INIT_WORK(&desc->work, request_firmware_work_func); - schedule_work(&desc->work); return 0; } |
