예제 #1
0
/*
 * jpegdma_device_remove - Jpegdma device remove method.
 * @pdev: Pointer jpegdma platform device.
 */
static int jpegdma_device_remove(struct platform_device *pdev)
{
	struct msm_jpegdma_device *dma;

	dma = platform_get_drvdata(pdev);
	if (NULL == dma) {
		dev_err(&pdev->dev, "Can not get jpeg dma drvdata\n");
		return 0;
	}
	video_unregister_device(&dma->video);
	v4l2_device_unregister(&dma->v4l2_dev);
	v4l2_m2m_release(dma->m2m_dev);
	msm_jpegdma_hw_release_irq(dma);
	msm_jpegdma_hw_put_clocks(dma);
	msm_jpegdma_hw_put_regulators(dma);
	msm_jpegdma_hw_release_mem_resources(dma);
	kfree(dma);

	return 0;
}
/*
 * msm_jpegdma_hw_get_mem_resources - Get memory resources.
 * @pdev: Pointer to dma platform device.
 * @dma: Pointer to dma device.
 *
 * Get and ioremap platform memory resources.
 */
int msm_jpegdma_hw_get_mem_resources(struct platform_device *pdev,
	struct msm_jpegdma_device *dma)
{
	int i;
	int ret = 0;
	char *dev_name;
	int reserve_mem_flag;

	/* Prepare memory resources */
	for (i = 0; i < MSM_JPEGDMA_IOMEM_LAST; i++) {

		switch (i) {
		case MSM_JPEGDMA_IOMEM_CORE:
			dev_name = "jpeg_hw";
			reserve_mem_flag = true;
			break;
		case MSM_JPEGDMA_IOMEM_VBIF:
			dev_name = "jpeg_vbif";
			reserve_mem_flag = false;
			break;
		default:
			pr_err("%s: Invalid device : %d\n", __func__, i);
			return -EINVAL;
		}
		/* get the device address base */
		dma->iomem_base[i] =
			msm_camera_get_reg_base(pdev, dev_name,
				reserve_mem_flag);
		if (!dma->iomem_base[i]) {
			dev_err(dma->dev, "%s can not remap region\n",
				dev_name);
			ret = -ENODEV;
			break;
		}
	}

	if (ret < 0)
		msm_jpegdma_hw_release_mem_resources(dma);

	return ret;
}
예제 #3
0
/*
 * jpegdma_probe - Dma device probe method.
 * @pdev: Pointer Dma platform device.
 */
static int jpegdma_probe(struct platform_device *pdev)
{
	struct msm_jpegdma_device *jpegdma;
	int ret;

	dev_dbg(&pdev->dev, "jpeg v4l2 DMA probed\n");
	/* Jpeg dma device struct */
	jpegdma = kzalloc(sizeof(struct msm_jpegdma_device), GFP_KERNEL);
	if (!jpegdma)
		return -ENOMEM;

	mutex_init(&jpegdma->lock);

	init_completion(&jpegdma->hw_reset_completion);
	init_completion(&jpegdma->hw_halt_completion);
	jpegdma->dev = &pdev->dev;

	/* Get resources */
	ret = msm_jpegdma_hw_get_mem_resources(pdev, jpegdma);
	if (ret < 0)
		goto error_mem_resources;

	ret = msm_jpegdma_hw_get_regulators(jpegdma);
	if (ret < 0)
		goto error_get_regulators;

	ret = msm_jpegdma_hw_get_clocks(jpegdma);
	if (ret < 0)
		goto error_get_clocks;

	ret = msm_jpegdma_hw_get_qos(jpegdma);
	if (ret < 0)
		goto error_qos_get;

	ret = msm_jpegdma_hw_get_vbif(jpegdma);
	if (ret < 0)
		goto error_vbif_get;

	ret = msm_jpegdma_hw_get_prefetch(jpegdma);
	if (ret < 0)
		goto error_prefetch_get;

	ret = msm_jpegdma_hw_request_irq(pdev, jpegdma);
	if (ret < 0)
		goto error_hw_get_request_irq;

	ret = msm_jpegdma_hw_get_capabilities(jpegdma);
	if (ret < 0)
		goto error_hw_get_request_irq;

	/* mem2mem device */
	jpegdma->m2m_dev = v4l2_m2m_init(&msm_jpegdma_m2m_ops);
	if (IS_ERR(jpegdma->m2m_dev)) {
		dev_err(&pdev->dev, "Failed to init mem2mem device\n");
		ret = PTR_ERR(jpegdma->m2m_dev);
		goto error_m2m_init;
	}

	/* v4l2 device */
	ret = v4l2_device_register(&pdev->dev, &jpegdma->v4l2_dev);
	if (ret < 0) {
		dev_err(&pdev->dev, "Failed to register v4l2 device\n");
		goto error_v4l2_register;
	}

	jpegdma->video.fops = &fd_fops;
	jpegdma->video.ioctl_ops = &fd_ioctl_ops;
	jpegdma->video.minor = -1;
	jpegdma->video.release = video_device_release;
	jpegdma->video.v4l2_dev = &jpegdma->v4l2_dev;
	jpegdma->video.vfl_dir = VFL_DIR_M2M;
	jpegdma->video.vfl_type = VFL_TYPE_GRABBER;
	strlcpy(jpegdma->video.name, MSM_JPEGDMA_DRV_NAME,
		sizeof(jpegdma->video.name));

	ret = video_register_device(&jpegdma->video, VFL_TYPE_GRABBER, -1);
	if (ret < 0) {
		dev_err(&pdev->dev, "Failed to register video device\n");
		goto error_video_register;
	}

	video_set_drvdata(&jpegdma->video, jpegdma);

	platform_set_drvdata(pdev, jpegdma);

	dev_dbg(&pdev->dev, "jpeg v4l2 DMA probe success\n");
	return 0;

error_video_register:
	v4l2_device_unregister(&jpegdma->v4l2_dev);
error_v4l2_register:
	v4l2_m2m_release(jpegdma->m2m_dev);
error_m2m_init:
	msm_jpegdma_hw_release_irq(jpegdma);
error_hw_get_request_irq:
	msm_jpegdma_hw_put_prefetch(jpegdma);
error_prefetch_get:
	msm_jpegdma_hw_put_vbif(jpegdma);
error_vbif_get:
	msm_jpegdma_hw_put_qos(jpegdma);
error_qos_get:
	msm_jpegdma_hw_put_clocks(jpegdma);
error_get_clocks:
	msm_jpegdma_hw_put_regulators(jpegdma);
error_get_regulators:
	msm_jpegdma_hw_release_mem_resources(jpegdma);
error_mem_resources:
	kfree(jpegdma);
	return ret;
}