/* * 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; }
/* * 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; }