Hi Sachin, On Tue, May 20, 2014 at 5:15 PM, Sachin Kamat <sachin.kamat@xxxxxxxxxx> wrote: > Hi Arun, > > On 20 May 2014 15:47, Arun Kumar K <arun.kk@xxxxxxxxxxx> wrote: >> For MFC firmwares, improved versions with bug fixes and >> feature additions are released keeping the firmware version >> including major and minor number same. The issue came with >> the release of a new MFCv6 firmware with an interface change. >> This patch adds the support of accepting multiple firmware >> binaries for every version with the driver trying to load >> firmwares starting from latest. This ensures full backward >> compatibility regardless of which firmware version and kernel >> version is used. >> >> Signed-off-by: Arun Kumar K <arun.kk@xxxxxxxxxxx> >> --- >> drivers/media/platform/s5p-mfc/s5p_mfc.c | 9 +++++---- >> drivers/media/platform/s5p-mfc/s5p_mfc_common.h | 11 ++++++++++- >> drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c | 15 ++++++++++++--- >> 3 files changed, 27 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c >> index 8da4c23..514e7ec 100644 >> --- a/drivers/media/platform/s5p-mfc/s5p_mfc.c >> +++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c >> @@ -1343,7 +1343,7 @@ static struct s5p_mfc_variant mfc_drvdata_v5 = { >> .port_num = MFC_NUM_PORTS, >> .buf_size = &buf_size_v5, >> .buf_align = &mfc_buf_align_v5, >> - .fw_name = "s5p-mfc.fw", >> + .fw_name[0] = "s5p-mfc.fw", >> }; >> >> struct s5p_mfc_buf_size_v6 mfc_buf_size_v6 = { >> @@ -1370,7 +1370,8 @@ static struct s5p_mfc_variant mfc_drvdata_v6 = { >> .port_num = MFC_NUM_PORTS_V6, >> .buf_size = &buf_size_v6, >> .buf_align = &mfc_buf_align_v6, >> - .fw_name = "s5p-mfc-v6.fw", >> + .fw_name[0] = "s5p-mfc-v6.fw", >> + .fw_name[1] = "s5p-mfc-v6-v2.fw", > > Probably a simple 1 line comment about the difference between the > versions would help. > Ok will add. >> }; >> >> struct s5p_mfc_buf_size_v6 mfc_buf_size_v7 = { >> @@ -1397,7 +1398,7 @@ static struct s5p_mfc_variant mfc_drvdata_v7 = { >> .port_num = MFC_NUM_PORTS_V7, >> .buf_size = &buf_size_v7, >> .buf_align = &mfc_buf_align_v7, >> - .fw_name = "s5p-mfc-v7.fw", >> + .fw_name[0] = "s5p-mfc-v7.fw", >> }; >> >> struct s5p_mfc_buf_size_v6 mfc_buf_size_v8 = { >> @@ -1424,7 +1425,7 @@ static struct s5p_mfc_variant mfc_drvdata_v8 = { >> .port_num = MFC_NUM_PORTS_V8, >> .buf_size = &buf_size_v8, >> .buf_align = &mfc_buf_align_v8, >> - .fw_name = "s5p-mfc-v8.fw", >> + .fw_name[0] = "s5p-mfc-v8.fw", >> }; >> >> static struct platform_device_id mfc_driver_ids[] = { >> diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h >> index 89681c3..de60185 100644 >> --- a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h >> +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h >> @@ -38,6 +38,8 @@ >> #define MFC_BANK2_ALIGN_ORDER 13 >> #define MFC_BASE_ALIGN_ORDER 17 >> >> +#define MFC_FW_MAX_VERSIONS 2 >> + >> #include <media/videobuf2-dma-contig.h> >> >> static inline dma_addr_t s5p_mfc_mem_cookie(void *a, void *b) >> @@ -163,6 +165,11 @@ enum s5p_mfc_decode_arg { >> MFC_DEC_RES_CHANGE, >> }; >> >> +enum s5p_mfc_fw_ver { >> + MFC_FW_V1, >> + MFC_FW_V2, >> +}; >> + >> #define MFC_BUF_FLAG_USED (1 << 0) >> #define MFC_BUF_FLAG_EOS (1 << 1) >> >> @@ -225,7 +232,7 @@ struct s5p_mfc_variant { >> u32 version_bit; >> struct s5p_mfc_buf_size *buf_size; >> struct s5p_mfc_buf_align *buf_align; >> - char *fw_name; >> + char *fw_name[MFC_FW_MAX_VERSIONS]; >> }; >> >> /** >> @@ -287,6 +294,7 @@ struct s5p_mfc_priv_buf { >> * @warn_start: hardware error code from which warnings start >> * @mfc_ops: ops structure holding HW operation function pointers >> * @mfc_cmds: cmd structure holding HW commands function pointers >> + * @fw_ver: loaded firmware sub-version >> * >> */ >> struct s5p_mfc_dev { >> @@ -331,6 +339,7 @@ struct s5p_mfc_dev { >> struct s5p_mfc_hw_ops *mfc_ops; >> struct s5p_mfc_hw_cmds *mfc_cmds; >> const struct s5p_mfc_regs *mfc_regs; >> + enum s5p_mfc_fw_ver fw_ver; >> }; >> >> /** >> diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c b/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c >> index c97c7c8..7aabcdb 100644 >> --- a/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c >> +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c >> @@ -78,14 +78,23 @@ int s5p_mfc_alloc_firmware(struct s5p_mfc_dev *dev) >> int s5p_mfc_load_firmware(struct s5p_mfc_dev *dev) >> { >> struct firmware *fw_blob; >> - int err; >> + int err = -EINVAL, i; > > nit: Please use either > int i, err = -EINVAL; > or > int i; > int err = -EINVAL; > Ok >> >> /* Firmare has to be present as a separate file or compiled >> * into kernel. */ >> mfc_debug_enter(); >> >> - err = request_firmware((const struct firmware **)&fw_blob, >> - dev->variant->fw_name, dev->v4l2_dev.dev); >> + for (i = MFC_FW_MAX_VERSIONS - 1; i >= 0; i--) { >> + if (!dev->variant->fw_name[i]) >> + continue; >> + err = request_firmware((const struct firmware **)&fw_blob, >> + dev->variant->fw_name[i], dev->v4l2_dev.dev); >> + if (!err) { >> + dev->fw_ver = (enum s5p_mfc_fw_ver) i; > > Where is this getting used? > Its used in the next patch in the series for init buffer options. Regards Arun > > -- > With warm regards, > Sachin -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html