[PATCHv5] mx2_camera: Add soc_camera support for i.MX25/i.MX27
Uwe Kleine-König
u.kleine-koenig at pengutronix.de
Thu Jul 1 08:28:03 EDT 2010
On Thu, Jul 01, 2010 at 02:03:19PM +0300, Baruch Siach wrote:
> This is the soc_camera support developed by Sascha Hauer for the i.MX27. Alan
> Carvalho de Assis modified the original driver to get it working on more recent
> kernels. I modified it further to add support for i.MX25. This driver has been
> tested on i.MX25 and i.MX27 based platforms.
>
> Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> Acked-by: Guennadi Liakhovetski <g.liakhovetski at gmx.de>
> ---
> Changes v4 -> v5
> Comments from Uwe Kleine-König:
>
> Enclose mx27 DMA related stuff in #ifdefs since the dma-mx1-mx2.h is no
> longer accessible to mx25 builds
>
> s/MX2_VIDEO/VIDEO_MX2_HOSTSUPPORT/
>
> Changes v3 -> v4
> Address more comments from Guennadi Liakhovetski, including:
>
> * Fix the double trigger handling of mx27 eMMA
>
> * Add a FIXME comment in the code of eMMA overflow handling
>
> Changes v2 -> v3
> Address more comments from Guennadi Liakhovetski.
>
> Applied part of Sashca's patch that I forgot in v2.
>
> Changes v1 -> v2
> Addressed the comments of Guennadi Liakhovetski except from the following:
>
> 1. The mclk_get_divisor implementation, since I don't know what this code
> is good for
>
> 2. mx2_videobuf_release should not set pcdev->active on i.MX27, because
> mx27_camera_frame_done needs this pointer
>
> 3. In mx27_camera_emma_buf_init I don't know the meaning of those hard
> coded magic numbers
>
> Applied i.MX27 fixes from Sascha.
>
> arch/arm/plat-mxc/include/mach/memory.h | 4 +-
> arch/arm/plat-mxc/include/mach/mx2_cam.h | 46 +
> drivers/media/video/Kconfig | 13 +
> drivers/media/video/Makefile | 1 +
> drivers/media/video/mx2_camera.c | 1513 ++++++++++++++++++++++++++++++
> 5 files changed, 1575 insertions(+), 2 deletions(-)
> create mode 100644 arch/arm/plat-mxc/include/mach/mx2_cam.h
> create mode 100644 drivers/media/video/mx2_camera.c
>
> diff --git a/arch/arm/plat-mxc/include/mach/memory.h b/arch/arm/plat-mxc/include/mach/memory.h
> index c4b40c3..849d891 100644
> --- a/arch/arm/plat-mxc/include/mach/memory.h
> +++ b/arch/arm/plat-mxc/include/mach/memory.h
> @@ -44,12 +44,12 @@
> */
> #define CONSISTENT_DMA_SIZE SZ_8M
>
> -#elif defined(CONFIG_MX1_VIDEO)
> +#elif defined(CONFIG_MX1_VIDEO) || defined(CONFIG_VIDEO_MX2_HOSTSUPPORT)
> /*
> * Increase size of DMA-consistent memory region.
> * This is required for i.MX camera driver to capture at least four VGA frames.
> */
> #define CONSISTENT_DMA_SIZE SZ_4M
> -#endif /* CONFIG_MX1_VIDEO */
> +#endif /* CONFIG_MX1_VIDEO || CONFIG_MX2_VIDEO */
s/CONFIG_MX2_VIDEO/CONFIG_VIDEO_MX2_HOSTSUPPORT/ please
> #endif /* __ASM_ARCH_MXC_MEMORY_H__ */
> diff --git a/arch/arm/plat-mxc/include/mach/mx2_cam.h b/arch/arm/plat-mxc/include/mach/mx2_cam.h
> new file mode 100644
> index 0000000..3c080a3
> --- /dev/null
> +++ b/arch/arm/plat-mxc/include/mach/mx2_cam.h
Do you expect users of this header other than your driver? If not you
can fold it into the latter.
[...snip...]
> diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
> index bdbc9d3..27e2acc 100644
> --- a/drivers/media/video/Kconfig
> +++ b/drivers/media/video/Kconfig
> @@ -969,6 +969,19 @@ config VIDEO_OMAP2
> ---help---
> This is a v4l2 driver for the TI OMAP2 camera capture interface
>
> +config VIDEO_MX2_HOSTSUPPORT
> + bool
> +
> +config VIDEO_MX2
> + tristate "i.MX27/i.MX25 Camera Sensor Interface driver"
> + depends on VIDEO_DEV && SOC_CAMERA && (MACH_MX27 || ARCH_MX25)
> + select VIDEOBUF_DMA_CONTIG
CONTIG?
[...snap...]
> diff --git a/drivers/media/video/mx2_camera.c b/drivers/media/video/mx2_camera.c
> new file mode 100644
> index 0000000..98c93fa
> --- /dev/null
> +++ b/drivers/media/video/mx2_camera.c
> @@ -0,0 +1,1513 @@
[...snip...]
> +static int __devexit mx2_camera_remove(struct platform_device *pdev)
> +{
> + struct soc_camera_host *soc_host = to_soc_camera_host(&pdev->dev);
> + struct mx2_camera_dev *pcdev = container_of(soc_host,
> + struct mx2_camera_dev, soc_host);
> + struct resource *res;
> +
> + clk_put(pcdev->clk_csi);
> +#ifdef CONFIG_MACH_MX27
> + if (cpu_is_mx27())
> + imx_dma_free(pcdev->dma);
> +#endif /* CONFIG_MACH_MX27 */
> + free_irq(pcdev->irq_csi, pcdev);
> + if (mx27_camera_emma(pcdev))
> + free_irq(pcdev->irq_emma, pcdev);
> +
> + soc_camera_host_unregister(&pcdev->soc_host);
> +
> + iounmap(pcdev->base_csi);
> +
> + if (mx27_camera_emma(pcdev)) {
> + clk_disable(pcdev->clk_emma);
> + clk_put(pcdev->clk_emma);
> + iounmap(pcdev->base_emma);
> + res = pcdev->res_emma;
> + release_mem_region(res->start, resource_size(res));
> + }
> +
> + res = pcdev->res_csi;
> + release_mem_region(res->start, resource_size(res));
> +
> + kfree(pcdev);
> +
> + dev_info(&pdev->dev, "MX2 Camera driver unloaded\n");
> +
> + return 0;
> +}
> +
> +static struct platform_driver mx2_camera_driver = {
> + .driver = {
> + .name = MX2_CAM_DRV_NAME,
I'm always unsure if you need
.owner = THIS_MODULE,
here.
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
More information about the linux-arm-kernel
mailing list