Add request_firmware() and release_firmware() calls that allow drivers to load a firmware file. Also move the struct firmware definition from remoteproc.h into firmware.h. Signed-off-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> --- common/firmware.c | 33 +++++++++++++++++++++++++++++++++ include/firmware.h | 16 ++++++++++++++++ include/linux/remoteproc.h | 5 ----- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/common/firmware.c b/common/firmware.c index e4ad6ac867b0..c6668fd528b6 100644 --- a/common/firmware.c +++ b/common/firmware.c @@ -17,6 +17,7 @@ #include <linux/stat.h> #include <linux/err.h> #include <uncompress.h> +#include <unistd.h> #include <filetype.h> #define BUFSIZ 4096 @@ -304,6 +305,38 @@ out: return ret; } +/* + * request_firmware - load a firmware to a device + */ +int request_firmware(const struct firmware **out, const char *fw_name, struct device *dev) +{ + char fw_path[PATH_MAX + 1]; + struct firmware *fw; + int ret; + + fw = kzalloc(sizeof(struct firmware), GFP_KERNEL); + if (!fw) + return -ENOMEM; + + snprintf(fw_path, sizeof(fw_path), "%s/%s", firmware_path, fw_name); + + ret = read_file_2(fw_path, &fw->size, (void *)&fw->data, FILESIZE_MAX); + if (ret) { + kfree(fw); + return ret; + } + + *out = fw; + + return 0; +} + +void release_firmware(const struct firmware *fw) +{ + kfree_const(fw->data); + kfree_const(fw); +} + static int firmware_init(void) { firmware_path = strdup("/env/firmware"); diff --git a/include/firmware.h b/include/firmware.h index 05433f2f7858..b4fa40a3ab44 100644 --- a/include/firmware.h +++ b/include/firmware.h @@ -13,6 +13,11 @@ #include <debug_ll.h> #include <linux/kernel.h> +struct firmware { + size_t size; + const u8 *data; +}; + struct firmware_handler { char *id; /* unique identifier for this firmware device */ char *model; /* description for this device */ @@ -37,6 +42,8 @@ struct firmware_mgr *firmwaremgr_find_by_node(struct device_node *np); int firmwaremgr_load_file(struct firmware_mgr *, const char *path); char *firmware_get_searchpath(void); void firmware_set_searchpath(const char *path); +int request_firmware(const struct firmware **fw, const char *fw_name, struct device *dev); +void release_firmware(const struct firmware *fw); #else static inline struct firmware_mgr *firmwaremgr_find_by_node(struct device_node *np) { @@ -57,6 +64,15 @@ static inline void firmware_set_searchpath(const char *path) { } +static inline int request_firmware(const struct firmware **fw, const char *fw_name, + struct device *dev) +{ + return -EOPNOTSUPP; +} + +static inline void release_firmware(const struct firmware *fw) +{ +} #endif void firmwaremgr_list_handlers(void); diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h index 170fff7987fb..33fe2f81b748 100644 --- a/include/linux/remoteproc.h +++ b/include/linux/remoteproc.h @@ -18,11 +18,6 @@ struct resource_table { u32 offset[0]; } __packed; -struct firmware { - size_t size; - const u8 *data; -}; - struct rproc; struct rproc_ops { -- 2.39.2