From 28e00cb53bf2d5f7bf80a84156202fa2ab8fadd7 Mon Sep 17 00:00:00 2001 From: Philipp Zabel Date: Thu, 30 Mar 2023 14:46:40 +0200 Subject: firmware: Add request/release_firmware() calls 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 Reviewed-by: Ahmad Fatoum Link: https://lore.barebox.org/20230330124643.3562397-1-p.zabel@pengutronix.de Signed-off-by: Sascha Hauer --- common/firmware.c | 32 ++++++++++++++++++++++++++++++++ include/firmware.h | 16 ++++++++++++++++ include/linux/remoteproc.h | 5 ----- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/common/firmware.c b/common/firmware.c index e4ad6ac867..6dc621d308 100644 --- a/common/firmware.c +++ b/common/firmware.c @@ -304,6 +304,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 05433f2f78..93c800e11b 100644 --- a/include/firmware.h +++ b/include/firmware.h @@ -13,6 +13,11 @@ #include #include +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 -EINVAL; +} + +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 170fff7987..33fe2f81b7 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 { -- cgit v1.2.1