diff options
Diffstat (limited to 'drivers/media/platform/soc_camera/rcar_vin.c')
| -rw-r--r-- | drivers/media/platform/soc_camera/rcar_vin.c | 22 | 
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/media/platform/soc_camera/rcar_vin.c b/drivers/media/platform/soc_camera/rcar_vin.c index d02a7e0b773..e594230e84d 100644 --- a/drivers/media/platform/soc_camera/rcar_vin.c +++ b/drivers/media/platform/soc_camera/rcar_vin.c @@ -16,6 +16,7 @@  #include <linux/delay.h>  #include <linux/interrupt.h> +#include <linux/io.h>  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/platform_data/camera-rcar.h> @@ -67,6 +68,8 @@  #define VNMC_YCAL		(1 << 19)  #define VNMC_INF_YUV8_BT656	(0 << 16)  #define VNMC_INF_YUV8_BT601	(1 << 16) +#define VNMC_INF_YUV10_BT656	(2 << 16) +#define VNMC_INF_YUV10_BT601	(3 << 16)  #define VNMC_INF_YUV16		(5 << 16)  #define VNMC_VUP		(1 << 10)  #define VNMC_IM_ODD		(0 << 3) @@ -105,6 +108,7 @@  #define VIN_MAX_HEIGHT		2048  enum chip_id { +	RCAR_GEN2,  	RCAR_H1,  	RCAR_M1,  	RCAR_E1, @@ -273,6 +277,12 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv)  		/* BT.656 8bit YCbCr422 or BT.601 8bit YCbCr422 */  		vnmc |= priv->pdata->flags & RCAR_VIN_BT656 ?  			VNMC_INF_YUV8_BT656 : VNMC_INF_YUV8_BT601; +		break; +	case V4L2_MBUS_FMT_YUYV10_2X10: +		/* BT.656 10bit YCbCr422 or BT.601 10bit YCbCr422 */ +		vnmc |= priv->pdata->flags & RCAR_VIN_BT656 ? +			VNMC_INF_YUV10_BT656 : VNMC_INF_YUV10_BT601; +		break;  	default:  		break;  	} @@ -300,7 +310,8 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv)  		dmr = 0;  		break;  	case V4L2_PIX_FMT_RGB32: -		if (priv->chip == RCAR_H1 || priv->chip == RCAR_E1) { +		if (priv->chip == RCAR_GEN2 || priv->chip == RCAR_H1 || +		    priv->chip == RCAR_E1) {  			dmr = VNDMR_EXRGB;  			break;  		} @@ -502,7 +513,7 @@ static int rcar_vin_videobuf_init(struct vb2_buffer *vb)  	return 0;  } -static int rcar_vin_stop_streaming(struct vb2_queue *vq) +static void rcar_vin_stop_streaming(struct vb2_queue *vq)  {  	struct soc_camera_device *icd = soc_camera_from_vb2q(vq);  	struct soc_camera_host *ici = to_soc_camera_host(icd->parent); @@ -513,8 +524,6 @@ static int rcar_vin_stop_streaming(struct vb2_queue *vq)  	list_for_each_safe(buf_head, tmp, &priv->capture)  		list_del_init(buf_head);  	spin_unlock_irq(&priv->lock); - -	return 0;  }  static struct vb2_ops rcar_vin_vb2_ops = { @@ -1000,6 +1009,7 @@ static int rcar_vin_get_formats(struct soc_camera_device *icd, unsigned int idx,  	switch (code) {  	case V4L2_MBUS_FMT_YUYV8_1X16:  	case V4L2_MBUS_FMT_YUYV8_2X8: +	case V4L2_MBUS_FMT_YUYV10_2X10:  		if (cam->extra_fmt)  			break; @@ -1357,7 +1367,7 @@ static int rcar_vin_init_videobuf2(struct vb2_queue *vq,  	vq->ops = &rcar_vin_vb2_ops;  	vq->mem_ops = &vb2_dma_contig_memops;  	vq->buf_struct_size = sizeof(struct rcar_vin_buffer); -	vq->timestamp_type  = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; +	vq->timestamp_flags  = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;  	return vb2_queue_init(vq);  } @@ -1381,6 +1391,8 @@ static struct soc_camera_host_ops rcar_vin_host_ops = {  };  static struct platform_device_id rcar_vin_id_table[] = { +	{ "r8a7791-vin",  RCAR_GEN2 }, +	{ "r8a7790-vin",  RCAR_GEN2 },  	{ "r8a7779-vin",  RCAR_H1 },  	{ "r8a7778-vin",  RCAR_M1 },  	{ "uPD35004-vin", RCAR_E1 },  | 
