diff --git a/drivers/bus/mhi/core/mhi_boot.c b/drivers/bus/mhi/core/mhi_boot.c index e90237b19b89..d324f0a0c9bc 100644 --- a/drivers/bus/mhi/core/mhi_boot.c +++ b/drivers/bus/mhi/core/mhi_boot.c @@ -566,8 +566,21 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl) ret = request_firmware(&firmware, fw_name, mhi_cntrl->dev); if (ret) { - MHI_ERR("Error loading firmware, ret:%d\n", ret); - return; + if (!mhi_cntrl->fw_image_fallback) { + MHI_ERR("Error loading fw, ret:%d\n", ret); + return; + } + + /* re-try with fall back fw image */ + ret = request_firmware(&firmware, mhi_cntrl->fw_image_fallback, + mhi_cntrl->dev); + if (ret) { + MHI_ERR("Error loading fw_fb, ret:%d\n", ret); + return; + } + + mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data, + MHI_CB_FW_FALLBACK_IMG); } size = (mhi_cntrl->fbc_download) ? mhi_cntrl->sbl_size : firmware->size; diff --git a/include/linux/mhi.h b/include/linux/mhi.h index cc9c4f57f436..ca2b00005b9a 100644 --- a/include/linux/mhi.h +++ b/include/linux/mhi.h @@ -45,6 +45,7 @@ enum MHI_CB { MHI_CB_EE_MISSION_MODE, MHI_CB_SYS_ERROR, MHI_CB_FATAL_ERROR, + MHI_CB_FW_FALLBACK_IMG, }; /** @@ -288,6 +289,7 @@ struct mhi_controller { /* fw images */ const char *fw_image; + const char *fw_image_fallback; const char *edl_image; /* mhi host manages downloading entire fbc images */