blob: b0b72ddf8492a9c2705f4a3199b2db9ae4461e6d [file] [log] [blame]
/*
* drivers/media/video/omapgfx/v4gfx.h
*
* Copyright (C) 2010 Texas Instruments.
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
* kind, whether express or implied.
*/
#ifndef __V4L2_GFX_H__
#define __V4L2_GFX_H__
#include <linux/version.h>
#include <media/videobuf-core.h>
#include <media/v4l2-device.h>
#include <asm/atomic.h>
#define MAX_VOUT_DEV 3
struct gbl_v4gfx {
struct mutex mtx;
int state;
struct v4l2_device v4l2_dev;
struct v4gfx_device *vouts[MAX_VOUT_DEV];
};
/* per-device data structure */
struct v4gfx_device {
struct video_device *vfd;
struct gbl_v4gfx *gbl_dev;
int bpp; /* bytes per pixel */
enum v4l2_buf_type type;
struct v4l2_pix_format pix;
struct v4l2_rect crop;
enum v4l2_memory memory; /* how memory is managed for the device */
/* we don't allow to change image fmt/size once buffer has
* been allocated
*/
int buffer_allocated; /* count of buffers allocated */
/* allow to reuse previously allocated buffer which is big enough */
int buffer_size;
unsigned long buf_phy_addr[VIDEO_MAX_FRAME];
unsigned long buf_phy_uv_addr[VIDEO_MAX_FRAME]; /* NV12 support*/
/* keep which buffers we actually allocated (via tiler) */
unsigned long buf_phy_uv_addr_alloced[VIDEO_MAX_FRAME];
unsigned long buf_phy_addr_alloced[VIDEO_MAX_FRAME];
/*
For each V4L2 buffer requested we will have an array of page addresses
to give through the buffer class API
*/
unsigned long **buf_phys_addr_array;
int mmap_count;
int opened; /* inc/dec on open/close of the device */
bool streaming; /* is streaming is in progress? */
struct mutex lock; /* protect shared data structures in ioctl */
struct videobuf_buffer *cur_frm;
struct videobuf_buffer *locked_frm;
struct videobuf_queue vbq;
/*
* Buffers added by QBUF from the producer application
*/
struct list_head dma_queue;
/*
* Buffers marked as done with by the consumer application but could
* still be being used by the GPU. DQBUF will examine this queue
* for available buffers.
*/
struct list_head sync_queue;
wait_queue_head_t sync_done;
unsigned long producer_ready;
wait_queue_head_t consumer_wait;
/*
* If acquire_timeout_ms is non-zero the acquire_timer will be reset
* when buffers are queued. If the timer expires ETIMEOUT will be
* returned via the V4L2_GFX_IOC_ACQ ioctl.
*/
struct timer_list acquire_timer;
unsigned int acquire_timeout_ms;
unsigned long acquire_timedout;
spinlock_t vbq_lock; /* spinlock for videobuf queues */
unsigned int producer_flags;
};
extern int debug;
#define GFXLOG(level, dev, fmt, arg...) \
do { \
if (debug >= level) \
printk(KERN_INFO "%s: " fmt, (dev)->name , ## arg); \
} while (0)
#define GFXLOGA(level, fmt, arg...) \
do { \
if (debug >= level) \
printk(KERN_INFO "v4l2-gfx: " fmt, ## arg); \
} while (0)
/*
* Convert local handle to v4l2_dev, currently only a global dev is supported
*/
#define V4L2DEV(vout) (&vout->gbl_dev->v4l2_dev)
/* tiler */
void v4gfx_tiler_buffer_free(
struct v4gfx_device *vout, unsigned int count,
unsigned int startindex);
int v4gfx_tiler_buffer_setup(struct v4gfx_device *vout,
unsigned int *count, unsigned int startindex,
struct v4l2_pix_format *pix);
void v4gfx_tiler_image_incr(struct v4gfx_device *vout,
int *cpu_pgwidth, int *tiler_increment);
void v4gfx_tiler_image_incr_uv(struct v4gfx_device *vout, int *tiler_increment);
/* v4gfx */
int v4gfx_try_format(struct v4l2_pix_format *pix);
void v4gfx_buffer_array_free(struct v4gfx_device *vout, int cnt);
extern struct v4l2_ioctl_ops v4gfx_ioctl_ops;
extern const struct v4l2_file_operations v4gfx_fops;
extern void v4gfx_acquire_timer(unsigned long arg);
/* Other stuff */
#define YUYV_BPP 2
#define RGB565_BPP 2
#define RGB24_BPP 3
#define RGB32_BPP 4
#define VOUT_NAME "v4gfx"
/* configuration macros */
#define VOUT_MAJOR_VERSION 0
#define VOUT_MINOR_VERSION 0
#define VOUT_RELEASE 0
#define VOUT_VERSION \
KERNEL_VERSION(VOUT_MAJOR_VERSION, VOUT_MINOR_VERSION, VOUT_RELEASE)
#endif /* ifndef __V4L2_GFX_H__ */