/* * 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 #include #include #include #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__ */