/* Load firmware to MFC */ int s5p_mfc_load_firmware(struct s5p_mfc_dev *dev) { struct firmware *fw_blob; unsigned int firmware_size; int err; if (!dev) { mfc_err("no mfc device to run\n"); return -EINVAL; } firmware_size = dev->variant->buf_size->firmware_code; /* Firmare has to be present as a separate file or compiled * into kernel. */ mfc_debug_enter(); mfc_info("Requesting fw\n"); err = request_firmware((const struct firmware **)&fw_blob, MFC_FW_NAME, dev->v4l2_dev.dev); if (err != 0) { mfc_err("Firmware is not present in the /lib/firmware directory nor compiled in kernel.\n"); return -EINVAL; } mfc_debug(2, "Ret of request_firmware: %d Size: %d\n", err, fw_blob->size); if (fw_blob->size > firmware_size) { mfc_err("MFC firmware is too big to be loaded.\n"); release_firmware(fw_blob); return -ENOMEM; } if (s5p_mfc_bitproc_buf == 0 || s5p_mfc_bitproc_phys == 0) { mfc_err("MFC firmware is not allocated or was not mapped correctly.\n"); release_firmware(fw_blob); return -EINVAL; } memcpy(s5p_mfc_bitproc_virt, fw_blob->data, fw_blob->size); /* s5p_mfc_bitproc_dma = dma_map_single(dev->v4l2_dev.dev, s5p_mfc_bitproc_virt, FIRMWARE_CODE_SIZE, DMA_TO_DEVICE); */ s5p_mfc_mem_clean_priv(s5p_mfc_bitproc_buf, s5p_mfc_bitproc_virt, 0, fw_blob->size); dev->fw.dva = s5p_mfc_bitproc_phys; dev->fw.kva = s5p_mfc_bitproc_virt; dev->fw.ctx = s5p_mfc_bitproc_buf; dev->fw.size = fw_blob->size; release_firmware(fw_blob); mfc_debug_leave(); return 0; }
/* Load firmware to MFC */ int s5p_mfc_load_firmware(struct s5p_mfc_dev *dev) { struct firmware *fw_blob; size_t firmware_size; int err; if (!dev) { mfc_err("no mfc device to run\n"); return -EINVAL; } firmware_size = dev->variant->buf_size->firmware_code; /* Firmare has to be present as a separate file or compiled * into kernel. */ mfc_debug_enter(); mfc_debug(2, "Requesting fw\n"); err = request_firmware((const struct firmware **)&fw_blob, MFC_FW_NAME, dev->v4l2_dev.dev); if (err != 0) { mfc_err_dev("Firmware is not present in the /lib/firmware directory nor compiled in kernel.\n"); return -EINVAL; } mfc_debug(2, "Ret of request_firmware: %d Size: %zu\n", err, fw_blob->size); if (fw_blob->size > firmware_size) { mfc_err_dev("MFC firmware is too big to be loaded.\n"); release_firmware(fw_blob); return -ENOMEM; } if (dev->fw_info.alloc == 0 || dev->fw_info.ofs == 0) { mfc_err_dev("MFC firmware is not allocated or was not mapped correctly.\n"); release_firmware(fw_blob); return -EINVAL; } dev->fw_size = fw_blob->size; memcpy(dev->fw_info.virt, fw_blob->data, fw_blob->size); s5p_mfc_mem_clean_priv(dev->fw_info.alloc, dev->fw_info.virt, 0, fw_blob->size); release_firmware(fw_blob); mfc_debug_leave(); return 0; }