Commit 256acbeb authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

media: omap_vout: convert to vb2



Convert omap_vout to the vb2 framework. After this change
'v4l2-compliance -s' passes all tests.

As usual, this vb2 conversion is a 'big bang' patch and hard to read.

Tested on a Pandaboard and a Beagle XM board.

Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 839b9d2c
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -10,8 +10,7 @@ config VIDEO_OMAP2_VOUT
	depends on FB_OMAP2 || (COMPILE_TEST && FB_OMAP2=n)
	depends on FB_OMAP2 || (COMPILE_TEST && FB_OMAP2=n)
	depends on ARCH_OMAP2 || ARCH_OMAP3 || COMPILE_TEST
	depends on ARCH_OMAP2 || ARCH_OMAP3 || COMPILE_TEST
	depends on VIDEO_V4L2
	depends on VIDEO_V4L2
	select VIDEOBUF_GEN
	select VIDEOBUF2_DMA_CONTIG
	select VIDEOBUF_DMA_CONTIG
	select OMAP2_VRFB if ARCH_OMAP2 || ARCH_OMAP3
	select OMAP2_VRFB if ARCH_OMAP2 || ARCH_OMAP3
	select FRAME_VECTOR
	select FRAME_VECTOR
	help
	help
+147 −710

File changed.

Preview size limit exceeded, changes collapsed.

+12 −14
Original line number Original line Diff line number Diff line
@@ -14,7 +14,6 @@
#include <linux/videodev2.h>
#include <linux/videodev2.h>
#include <linux/slab.h>
#include <linux/slab.h>


#include <media/videobuf-dma-contig.h>
#include <media/v4l2-device.h>
#include <media/v4l2-device.h>


#include <video/omapvrfb.h>
#include <video/omapvrfb.h>
@@ -40,7 +39,7 @@ static int omap_vout_allocate_vrfb_buffers(struct omap_vout_device *vout,
						&vout->smsshado_phy_addr[i]);
						&vout->smsshado_phy_addr[i]);
		}
		}
		if (!vout->smsshado_virt_addr[i] && startindex != -1) {
		if (!vout->smsshado_virt_addr[i] && startindex != -1) {
			if (V4L2_MEMORY_MMAP == vout->memory && i >= startindex)
			if (vout->vq.memory == V4L2_MEMORY_MMAP && i >= startindex)
				break;
				break;
		}
		}
		if (!vout->smsshado_virt_addr[i]) {
		if (!vout->smsshado_virt_addr[i]) {
@@ -109,8 +108,7 @@ int omap_vout_setup_vrfb_bufs(struct platform_device *pdev, int vid_num,
			dev_info(&pdev->dev, ": VRFB allocation failed\n");
			dev_info(&pdev->dev, ": VRFB allocation failed\n");
			for (j = 0; j < i; j++)
			for (j = 0; j < i; j++)
				omap_vrfb_release_ctx(&vout->vrfb_context[j]);
				omap_vrfb_release_ctx(&vout->vrfb_context[j]);
			ret = -ENOMEM;
			return -ENOMEM;
			goto free_buffers;
		}
		}
	}
	}


@@ -155,8 +153,10 @@ int omap_vout_setup_vrfb_bufs(struct platform_device *pdev, int vid_num,


	init_waitqueue_head(&vout->vrfb_dma_tx.wait);
	init_waitqueue_head(&vout->vrfb_dma_tx.wait);


	/* statically allocated the VRFB buffer is done through
	/*
	   commands line aruments */
	 * statically allocated the VRFB buffer is done through
	 * command line arguments
	 */
	if (static_vrfb_allocation) {
	if (static_vrfb_allocation) {
		if (omap_vout_allocate_vrfb_buffers(vout, &vrfb_num_bufs, -1)) {
		if (omap_vout_allocate_vrfb_buffers(vout, &vrfb_num_bufs, -1)) {
			ret =  -ENOMEM;
			ret =  -ENOMEM;
@@ -169,9 +169,6 @@ int omap_vout_setup_vrfb_bufs(struct platform_device *pdev, int vid_num,
release_vrfb_ctx:
release_vrfb_ctx:
	for (j = 0; j < VRFB_NUM_BUFS; j++)
	for (j = 0; j < VRFB_NUM_BUFS; j++)
		omap_vrfb_release_ctx(&vout->vrfb_context[j]);
		omap_vrfb_release_ctx(&vout->vrfb_context[j]);
free_buffers:
	omap_vout_free_buffers(vout);

	return ret;
	return ret;
}
}


@@ -231,13 +228,14 @@ int omap_vout_vrfb_buffer_setup(struct omap_vout_device *vout,
}
}


int omap_vout_prepare_vrfb(struct omap_vout_device *vout,
int omap_vout_prepare_vrfb(struct omap_vout_device *vout,
			   struct videobuf_buffer *vb)
			   struct vb2_buffer *vb)
{
{
	struct dma_async_tx_descriptor *tx;
	struct dma_async_tx_descriptor *tx;
	enum dma_ctrl_flags flags = DMA_PREP_INTERRUPT | DMA_CTRL_ACK;
	enum dma_ctrl_flags flags = DMA_PREP_INTERRUPT | DMA_CTRL_ACK;
	struct dma_chan *chan = vout->vrfb_dma_tx.chan;
	struct dma_chan *chan = vout->vrfb_dma_tx.chan;
	struct dma_interleaved_template *xt = vout->vrfb_dma_tx.xt;
	struct dma_interleaved_template *xt = vout->vrfb_dma_tx.xt;
	dma_cookie_t cookie;
	dma_cookie_t cookie;
	dma_addr_t buf_phy_addr = vb2_dma_contig_plane_dma_addr(vb, 0);
	enum dma_status status;
	enum dma_status status;
	enum dss_rotation rotation;
	enum dss_rotation rotation;
	size_t dst_icg;
	size_t dst_icg;
@@ -256,8 +254,8 @@ int omap_vout_prepare_vrfb(struct omap_vout_device *vout,
	dst_icg = ((MAX_PIXELS_PER_LINE * pixsize) -
	dst_icg = ((MAX_PIXELS_PER_LINE * pixsize) -
		  (vout->pix.width * vout->bpp)) + 1;
		  (vout->pix.width * vout->bpp)) + 1;


	xt->src_start = vout->buf_phy_addr[vb->i];
	xt->src_start = buf_phy_addr;
	xt->dst_start = vout->vrfb_context[vb->i].paddr[0];
	xt->dst_start = vout->vrfb_context[vb->index].paddr[0];


	xt->numf = vout->pix.height;
	xt->numf = vout->pix.height;
	xt->frame_size = 1;
	xt->frame_size = 1;
@@ -308,8 +306,8 @@ int omap_vout_prepare_vrfb(struct omap_vout_device *vout,
	/* Store buffers physical address into an array. Addresses
	/* Store buffers physical address into an array. Addresses
	 * from this array will be used to configure DSS */
	 * from this array will be used to configure DSS */
	rotation = calc_rotation(vout);
	rotation = calc_rotation(vout);
	vout->queued_buf_addr[vb->i] = (u8 *)
	vout->queued_buf_addr[vb->index] = (u8 *)
		vout->vrfb_context[vb->i].paddr[rotation];
		vout->vrfb_context[vb->index].paddr[rotation];
	return 0;
	return 0;
}
}


+2 −2
Original line number Original line Diff line number Diff line
@@ -20,7 +20,7 @@ void omap_vout_release_vrfb(struct omap_vout_device *vout);
int omap_vout_vrfb_buffer_setup(struct omap_vout_device *vout,
int omap_vout_vrfb_buffer_setup(struct omap_vout_device *vout,
			unsigned int *count, unsigned int startindex);
			unsigned int *count, unsigned int startindex);
int omap_vout_prepare_vrfb(struct omap_vout_device *vout,
int omap_vout_prepare_vrfb(struct omap_vout_device *vout,
			struct videobuf_buffer *vb);
			struct vb2_buffer *vb);
void omap_vout_calculate_vrfb_offset(struct omap_vout_device *vout);
void omap_vout_calculate_vrfb_offset(struct omap_vout_device *vout);
#else
#else
static inline void omap_vout_free_vrfb_buffers(struct omap_vout_device *vout) { };
static inline void omap_vout_free_vrfb_buffers(struct omap_vout_device *vout) { };
@@ -32,7 +32,7 @@ static inline int omap_vout_vrfb_buffer_setup(struct omap_vout_device *vout,
			unsigned int *count, unsigned int startindex)
			unsigned int *count, unsigned int startindex)
		{ return 0; };
		{ return 0; };
static inline int omap_vout_prepare_vrfb(struct omap_vout_device *vout,
static inline int omap_vout_prepare_vrfb(struct omap_vout_device *vout,
			struct videobuf_buffer *vb)
			struct vb2_buffer *vb)
		{ return 0; };
		{ return 0; };
static inline void omap_vout_calculate_vrfb_offset(struct omap_vout_device *vout) { };
static inline void omap_vout_calculate_vrfb_offset(struct omap_vout_device *vout) { };
#endif
#endif
+19 −26
Original line number Original line Diff line number Diff line
@@ -11,6 +11,7 @@
#ifndef OMAP_VOUTDEF_H
#ifndef OMAP_VOUTDEF_H
#define OMAP_VOUTDEF_H
#define OMAP_VOUTDEF_H


#include <media/videobuf2-dma-contig.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-ctrls.h>
#include <video/omapfb_dss.h>
#include <video/omapfb_dss.h>
#include <video/omapvrfb.h>
#include <video/omapvrfb.h>
@@ -113,6 +114,20 @@ struct omap2video_device {
	struct omap_overlay_manager *managers[MAX_MANAGERS];
	struct omap_overlay_manager *managers[MAX_MANAGERS];
};
};


/* buffer for one video frame */
struct omap_vout_buffer {
	/* common v4l buffer stuff -- must be first */
	struct vb2_v4l2_buffer		vbuf;
	struct list_head		queue;
};

static inline struct omap_vout_buffer *vb2_to_omap_vout_buffer(struct vb2_buffer *vb)
{
	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);

	return container_of(vbuf, struct omap_vout_buffer, vbuf);
}

/* per-device data structure */
/* per-device data structure */
struct omap_vout_device {
struct omap_vout_device {


@@ -121,29 +136,12 @@ struct omap_vout_device {
	struct omap2video_device *vid_dev;
	struct omap2video_device *vid_dev;
	struct v4l2_ctrl_handler ctrl_handler;
	struct v4l2_ctrl_handler ctrl_handler;
	int vid;
	int vid;
	int opened;


	/* we don't allow to change image fmt/size once buffer has
	 * been allocated
	 */
	int buffer_allocated;
	/* allow to reuse previously allocated buffer which is big enough */
	/* allow to reuse previously allocated buffer which is big enough */
	int buffer_size;
	int buffer_size;
	/* keep buffer info across opens */
	unsigned long buf_virt_addr[VIDEO_MAX_FRAME];
	unsigned long buf_phy_addr[VIDEO_MAX_FRAME];
	enum omap_color_mode dss_mode;
	enum omap_color_mode dss_mode;


	/* we don't allow to request new buffer when old buffers are
	u32 sequence;
	 * still mmapped
	 */
	int mmap_count;

	spinlock_t vbq_lock;		/* spinlock for videobuf queues */
	unsigned long field_count;	/* field counter for videobuf_buffer */

	/* non-NULL means streaming is in progress. */
	bool streaming;


	struct v4l2_pix_format pix;
	struct v4l2_pix_format pix;
	struct v4l2_rect crop;
	struct v4l2_rect crop;
@@ -169,19 +167,14 @@ struct omap_vout_device {
	unsigned char pos;
	unsigned char pos;


	int ps, vr_ps, line_length, first_int, field_id;
	int ps, vr_ps, line_length, first_int, field_id;
	enum v4l2_memory memory;
	struct omap_vout_buffer *cur_frm, *next_frm;
	struct videobuf_buffer *cur_frm, *next_frm;
	spinlock_t vbq_lock;            /* spinlock for dma_queue */
	struct list_head dma_queue;
	struct list_head dma_queue;
	u8 *queued_buf_addr[VIDEO_MAX_FRAME];
	u8 *queued_buf_addr[VIDEO_MAX_FRAME];
	u32 cropped_offset;
	u32 cropped_offset;
	s32 tv_field1_offset;
	s32 tv_field1_offset;
	void *isr_handle;
	void *isr_handle;

	struct vb2_queue vq;
	/* Buffer queue variables */
	struct omap_vout_device *vout;
	enum v4l2_buf_type type;
	struct videobuf_queue vbq;
	int io_allowed;


};
};