if (ret)
goto err_ent;
- ret = video_register_device(vfd, VFL_TYPE_GRABBER, -1);
- if (ret) {
- v4l2_err(v4l2_dev, "Failed to register video device\n");
- goto err_vd_reg;
- }
-
- v4l2_info(v4l2_dev,
- "FIMC capture driver registered as /dev/video%d\n",
- vfd->num);
return 0;
-err_vd_reg:
- media_entity_cleanup(&vfd->entity);
err_ent:
video_device_release(vfd);
err_v4l2_reg:
if (vfd) {
media_entity_cleanup(&vfd->entity);
+ /* Can also be called if video device was
+ not registered */
video_unregister_device(vfd);
}
kfree(fimc->vid_cap.ctx);
+ fimc->vid_cap.ctx = NULL;
}
.job_abort = fimc_job_abort,
};
-static int fimc_register_m2m_device(struct fimc_dev *fimc)
+int fimc_register_m2m_device(struct fimc_dev *fimc)
{
struct video_device *vfd;
struct platform_device *pdev;
}
ret = media_entity_init(&vfd->entity, 0, NULL, 0);
- if (ret)
- goto err_m2m_r3;
-
- ret = video_register_device(vfd, VFL_TYPE_GRABBER, -1);
- if (ret) {
- v4l2_err(v4l2_dev,
- "%s(): failed to register video device\n", __func__);
- goto err_m2m_r4;
- }
- v4l2_info(v4l2_dev,
- "FIMC m2m driver registered as /dev/video%d\n", vfd->num);
+ if (!ret)
+ return 0;
- return 0;
-err_m2m_r4:
- media_entity_cleanup(&vfd->entity);
-err_m2m_r3:
v4l2_m2m_release(fimc->m2m.m2m_dev);
err_m2m_r2:
video_device_release(fimc->m2m.vfd);
return ret;
}
-static void fimc_unregister_m2m_device(struct fimc_dev *fimc)
+void fimc_unregister_m2m_device(struct fimc_dev *fimc)
{
- if (fimc == NULL)
+ if (!fimc)
return;
- v4l2_m2m_release(fimc->m2m.m2m_dev);
+ if (fimc->m2m.m2m_dev)
+ v4l2_m2m_release(fimc->m2m.m2m_dev);
v4l2_device_unregister(&fimc->m2m.v4l2_dev);
- media_entity_cleanup(&fimc->m2m.vfd->entity);
- video_unregister_device(fimc->m2m.vfd);
+ if (fimc->m2m.vfd) {
+ media_entity_cleanup(&fimc->m2m.vfd->entity);
+ /* Can also be called if video device wasn't registered */
+ video_unregister_device(fimc->m2m.vfd);
+ }
}
static void fimc_clk_put(struct fimc_dev *fimc)
goto err_pm;
}
- ret = fimc_register_m2m_device(fimc);
- if (ret)
- goto err_alloc;
-
- /* At least one camera sensor is required to register capture node */
- if (cap_input_index >= 0) {
- ret = fimc_register_capture_device(fimc);
- if (ret)
- goto err_m2m;
- }
-
- dev_dbg(&pdev->dev, "%s(): fimc-%d registered successfully\n",
- __func__, fimc->id);
+ dev_dbg(&pdev->dev, "FIMC.%d registered successfully\n", fimc->id);
pm_runtime_put(&pdev->dev);
return 0;
-err_m2m:
- fimc_unregister_m2m_device(fimc);
-err_alloc:
- vb2_dma_contig_cleanup_ctx(fimc->alloc_ctx);
err_pm:
pm_runtime_put(&pdev->dev);
err_irq:
kfree(fimc->regs_res);
err_info:
kfree(fimc);
-
return ret;
}
fimc_runtime_suspend(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
- fimc_unregister_m2m_device(fimc);
- fimc_unregister_capture_device(fimc);
-
vb2_dma_contig_cleanup_ctx(fimc->alloc_ctx);
clk_disable(fimc->clock[CLK_BUS]);