[PATCH v3] media: add a VEU MEM2MEM format conversion and scaling driver

2012-10-05 Thread Guennadi Liakhovetski
Video Engine Unit (VEU) is an IP block, found in multiple SuperH and ARM-
based sh-mobile and r-mobile SoCs, capable of processing video data. It
can perform colour-space conversion, scaling and several filtering
transformations. This patch adds an initial implementation of a mem2mem
V4L2 driver for VEU. So far only conversion from NV12 to RGB565 is
supported. Further functionality shall be added in the future.

This driver is based on a VEU vidix driver by Magnus Damm.

Signed-off-by: Guennadi Liakhovetski g.liakhovet...@gmx.de
---

v3:
- compliance test is now happy apart from 2 warnings - CREATE_BUFS not 
implemented
- replaced EPERM with EBUSY
- use the device instance object as queue private data instead of a random 
first opening file private data
- S_FMT doesn't promote the caller to a stream owner

 drivers/media/platform/Kconfig  |9 +
 drivers/media/platform/Makefile |2 +
 drivers/media/platform/sh_veu.c | 1306 +++
 3 files changed, 1317 insertions(+), 0 deletions(-)
 create mode 100644 drivers/media/platform/sh_veu.c

diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig
index f588d62..6f08746 100644
--- a/drivers/media/platform/Kconfig
+++ b/drivers/media/platform/Kconfig
@@ -190,6 +190,15 @@ config VIDEO_SAMSUNG_EXYNOS_GSC
help
  This is a v4l2 driver for Samsung EXYNOS5 SoC G-Scaler.
 
+config VIDEO_SH_VEU
+   tristate SuperH VEU mem2mem video processing driver
+   depends on VIDEO_DEV  VIDEO_V4L2
+   select VIDEOBUF2_DMA_CONTIG
+   select V4L2_MEM2MEM_DEV
+   help
+   Support for the Video Engine Unit (VEU) on SuperH and
+   SH-Mobile SoCs.
+
 endif # V4L_MEM2MEM_DRIVERS
 
 menuconfig V4L_TEST_DRIVERS
diff --git a/drivers/media/platform/Makefile b/drivers/media/platform/Makefile
index baaa550..46669f6 100644
--- a/drivers/media/platform/Makefile
+++ b/drivers/media/platform/Makefile
@@ -27,6 +27,8 @@ obj-$(CONFIG_VIDEO_CODA)  += coda.o
 
 obj-$(CONFIG_VIDEO_MEM2MEM_DEINTERLACE)+= m2m-deinterlace.o
 
+obj-$(CONFIG_VIDEO_SH_VEU) += sh_veu.o
+
 obj-$(CONFIG_VIDEO_SAMSUNG_S5P_FIMC)   += s5p-fimc/
 obj-$(CONFIG_VIDEO_SAMSUNG_S5P_JPEG)   += s5p-jpeg/
 obj-$(CONFIG_VIDEO_SAMSUNG_S5P_MFC)+= s5p-mfc/
diff --git a/drivers/media/platform/sh_veu.c b/drivers/media/platform/sh_veu.c
new file mode 100644
index 000..dbb773b
--- /dev/null
+++ b/drivers/media/platform/sh_veu.c
@@ -0,0 +1,1306 @@
+/*
+ * sh-mobile VEU mem2mem driver
+ *
+ * Copyright (C) 2012 Renesas Electronics Corporation
+ * Author: Guennadi Liakhovetski, g.liakhovet...@gmx.de
+ * Copyright (C) 2008 Magnus Damm
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the version 2 of the GNU General Public License as
+ * published by the Free Software Foundation
+ */
+
+#include linux/fs.h
+#include linux/kernel.h
+#include linux/module.h
+#include linux/interrupt.h
+#include linux/io.h
+#include linux/platform_device.h
+#include linux/pm_runtime.h
+#include linux/slab.h
+#include linux/types.h
+#include linux/videodev2.h
+
+#include media/v4l2-dev.h
+#include media/v4l2-device.h
+#include media/v4l2-ioctl.h
+#include media/v4l2-mem2mem.h
+#include media/videobuf2-dma-contig.h
+
+#define VEU_STR 0x00 /* start register */
+#define VEU_SWR 0x10 /* src: line length */
+#define VEU_SSR 0x14 /* src: image size */
+#define VEU_SAYR 0x18 /* src: y/rgb plane address */
+#define VEU_SACR 0x1c /* src: c plane address */
+#define VEU_BSSR 0x20 /* bundle mode register */
+#define VEU_EDWR 0x30 /* dst: line length */
+#define VEU_DAYR 0x34 /* dst: y/rgb plane address */
+#define VEU_DACR 0x38 /* dst: c plane address */
+#define VEU_TRCR 0x50 /* transform control */
+#define VEU_RFCR 0x54 /* resize scale */
+#define VEU_RFSR 0x58 /* resize clip */
+#define VEU_ENHR 0x5c /* enhance */
+#define VEU_FMCR 0x70 /* filter mode */
+#define VEU_VTCR 0x74 /* lowpass vertical */
+#define VEU_HTCR 0x78 /* lowpass horizontal */
+#define VEU_APCR 0x80 /* color match */
+#define VEU_ECCR 0x84 /* color replace */
+#define VEU_AFXR 0x90 /* fixed mode */
+#define VEU_SWPR 0x94 /* swap */
+#define VEU_EIER 0xa0 /* interrupt mask */
+#define VEU_EVTR 0xa4 /* interrupt event */
+#define VEU_STAR 0xb0 /* status */
+#define VEU_BSRR 0xb4 /* reset */
+
+#define VEU_MCR00 0x200 /* color conversion matrix coefficient 00 */
+#define VEU_MCR01 0x204 /* color conversion matrix coefficient 01 */
+#define VEU_MCR02 0x208 /* color conversion matrix coefficient 02 */
+#define VEU_MCR10 0x20c /* color conversion matrix coefficient 10 */
+#define VEU_MCR11 0x210 /* color conversion matrix coefficient 11 */
+#define VEU_MCR12 0x214 /* color conversion matrix coefficient 12 */
+#define VEU_MCR20 0x218 /* color conversion matrix coefficient 20 */
+#define VEU_MCR21 0x21c /* color conversion matrix coefficient 21 */
+#define VEU_MCR22 0x220 /* color conversion matrix coefficient 22 */

Re: [PATCH v3] media: add a VEU MEM2MEM format conversion and scaling driver

2012-10-05 Thread Hans Verkuil
Hi Guennadi,

A few more small comments...

On Fri October 5 2012 11:16:06 Guennadi Liakhovetski wrote:
 Video Engine Unit (VEU) is an IP block, found in multiple SuperH and ARM-
 based sh-mobile and r-mobile SoCs, capable of processing video data. It
 can perform colour-space conversion, scaling and several filtering
 transformations. This patch adds an initial implementation of a mem2mem
 V4L2 driver for VEU. So far only conversion from NV12 to RGB565 is
 supported. Further functionality shall be added in the future.
 
 This driver is based on a VEU vidix driver by Magnus Damm.
 
 Signed-off-by: Guennadi Liakhovetski g.liakhovet...@gmx.de
 ---
 
 v3:
 - compliance test is now happy apart from 2 warnings - CREATE_BUFS not 
 implemented
 - replaced EPERM with EBUSY
 - use the device instance object as queue private data instead of a random 
 first opening file private data
 - S_FMT doesn't promote the caller to a stream owner
 
  drivers/media/platform/Kconfig  |9 +
  drivers/media/platform/Makefile |2 +
  drivers/media/platform/sh_veu.c | 1306 
 +++
  3 files changed, 1317 insertions(+), 0 deletions(-)
  create mode 100644 drivers/media/platform/sh_veu.c
 
 diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig
 index f588d62..6f08746 100644
 --- a/drivers/media/platform/Kconfig
 +++ b/drivers/media/platform/Kconfig
 @@ -190,6 +190,15 @@ config VIDEO_SAMSUNG_EXYNOS_GSC
   help
 This is a v4l2 driver for Samsung EXYNOS5 SoC G-Scaler.
  
 +config VIDEO_SH_VEU
 + tristate SuperH VEU mem2mem video processing driver
 + depends on VIDEO_DEV  VIDEO_V4L2
 + select VIDEOBUF2_DMA_CONTIG
 + select V4L2_MEM2MEM_DEV
 + help
 + Support for the Video Engine Unit (VEU) on SuperH and
 + SH-Mobile SoCs.
 +
  endif # V4L_MEM2MEM_DRIVERS
  
  menuconfig V4L_TEST_DRIVERS
 diff --git a/drivers/media/platform/Makefile b/drivers/media/platform/Makefile
 index baaa550..46669f6 100644
 --- a/drivers/media/platform/Makefile
 +++ b/drivers/media/platform/Makefile
 @@ -27,6 +27,8 @@ obj-$(CONFIG_VIDEO_CODA)+= coda.o
  
  obj-$(CONFIG_VIDEO_MEM2MEM_DEINTERLACE)  += m2m-deinterlace.o
  
 +obj-$(CONFIG_VIDEO_SH_VEU)   += sh_veu.o
 +
  obj-$(CONFIG_VIDEO_SAMSUNG_S5P_FIMC) += s5p-fimc/
  obj-$(CONFIG_VIDEO_SAMSUNG_S5P_JPEG) += s5p-jpeg/
  obj-$(CONFIG_VIDEO_SAMSUNG_S5P_MFC)  += s5p-mfc/
 diff --git a/drivers/media/platform/sh_veu.c b/drivers/media/platform/sh_veu.c
 new file mode 100644
 index 000..dbb773b
 --- /dev/null
 +++ b/drivers/media/platform/sh_veu.c
 @@ -0,0 +1,1306 @@
 +/*
 + * sh-mobile VEU mem2mem driver
 + *
 + * Copyright (C) 2012 Renesas Electronics Corporation
 + * Author: Guennadi Liakhovetski, g.liakhovet...@gmx.de
 + * Copyright (C) 2008 Magnus Damm
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the version 2 of the GNU General Public License as
 + * published by the Free Software Foundation
 + */
 +
 +#include linux/fs.h
 +#include linux/kernel.h
 +#include linux/module.h
 +#include linux/interrupt.h
 +#include linux/io.h
 +#include linux/platform_device.h
 +#include linux/pm_runtime.h
 +#include linux/slab.h
 +#include linux/types.h
 +#include linux/videodev2.h
 +
 +#include media/v4l2-dev.h
 +#include media/v4l2-device.h
 +#include media/v4l2-ioctl.h
 +#include media/v4l2-mem2mem.h
 +#include media/videobuf2-dma-contig.h
 +
 +#define VEU_STR 0x00 /* start register */
 +#define VEU_SWR 0x10 /* src: line length */
 +#define VEU_SSR 0x14 /* src: image size */
 +#define VEU_SAYR 0x18 /* src: y/rgb plane address */
 +#define VEU_SACR 0x1c /* src: c plane address */
 +#define VEU_BSSR 0x20 /* bundle mode register */
 +#define VEU_EDWR 0x30 /* dst: line length */
 +#define VEU_DAYR 0x34 /* dst: y/rgb plane address */
 +#define VEU_DACR 0x38 /* dst: c plane address */
 +#define VEU_TRCR 0x50 /* transform control */
 +#define VEU_RFCR 0x54 /* resize scale */
 +#define VEU_RFSR 0x58 /* resize clip */
 +#define VEU_ENHR 0x5c /* enhance */
 +#define VEU_FMCR 0x70 /* filter mode */
 +#define VEU_VTCR 0x74 /* lowpass vertical */
 +#define VEU_HTCR 0x78 /* lowpass horizontal */
 +#define VEU_APCR 0x80 /* color match */
 +#define VEU_ECCR 0x84 /* color replace */
 +#define VEU_AFXR 0x90 /* fixed mode */
 +#define VEU_SWPR 0x94 /* swap */
 +#define VEU_EIER 0xa0 /* interrupt mask */
 +#define VEU_EVTR 0xa4 /* interrupt event */
 +#define VEU_STAR 0xb0 /* status */
 +#define VEU_BSRR 0xb4 /* reset */
 +
 +#define VEU_MCR00 0x200 /* color conversion matrix coefficient 00 */
 +#define VEU_MCR01 0x204 /* color conversion matrix coefficient 01 */
 +#define VEU_MCR02 0x208 /* color conversion matrix coefficient 02 */
 +#define VEU_MCR10 0x20c /* color conversion matrix coefficient 10 */
 +#define VEU_MCR11 0x210 /* color conversion matrix coefficient 11 */
 +#define VEU_MCR12 0x214 /* color conversion matrix coefficient 12 */