diff options
Diffstat (limited to 'drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c')
-rw-r--r-- | drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c index 9bfe5f08f4a3..9c425ac91863 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c @@ -12,6 +12,7 @@ #include <linux/clk.h> #include <drm/drm_vblank.h> #include <drm/drm_print.h> +#include <linux/delay.h> #include "cdns-mhdp-imx.h" @@ -571,13 +572,6 @@ int cdns_mhdp_firmware_write_section(struct imx_mhdp_device *imx_mhdp, return 0; } -static void cdns_mhdp_firmware_load_cont(const struct firmware *fw, void *context) -{ - struct imx_mhdp_device *imx_mhdp = context; - - imx_mhdp->fw = fw; -} - static int cdns_mhdp_firmware_load(struct imx_mhdp_device *imx_mhdp) { const u8 *iram; @@ -597,23 +591,25 @@ static int cdns_mhdp_firmware_load(struct imx_mhdp_device *imx_mhdp) goto out; if (!imx_mhdp->fw) { - ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOHOTPLUG, + ret = request_firmware_direct(&imx_mhdp->fw, imx_mhdp->firmware_name, - imx_mhdp->mhdp.dev, GFP_KERNEL, - imx_mhdp, - cdns_mhdp_firmware_load_cont); + imx_mhdp->mhdp.dev); if (ret < 0) { DRM_ERROR("failed to load firmware\n"); - return -ENOENT; + /* Maybe U-Boot loaded the firmware. Therefore, still try to + * reset the controller */ + goto out; } - } else { - iram = imx_mhdp->fw->data + FW_IRAM_OFFSET; - dram = iram + FW_IRAM_SIZE; - - cdns_mhdp_firmware_write_section(imx_mhdp, iram, FW_IRAM_SIZE, ADDR_IMEM); - cdns_mhdp_firmware_write_section(imx_mhdp, dram, FW_DRAM_SIZE, ADDR_DMEM); } + iram = imx_mhdp->fw->data + FW_IRAM_OFFSET; + dram = iram + FW_IRAM_SIZE; + + cdns_mhdp_firmware_write_section(imx_mhdp, iram, + FW_IRAM_SIZE, ADDR_IMEM); + cdns_mhdp_firmware_write_section(imx_mhdp, dram, + FW_DRAM_SIZE, ADDR_DMEM); + out: /* un-reset ucpu */ cdns_mhdp_bus_write(0, &imx_mhdp->mhdp, APB_CTRL); |