mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-22 20:23:57 +08:00
a2c25b444e
This is the display driver for Texas Instruments's DM644X family SoC. This patch contains the main implementation of the driver with the V4L2 interface. The driver implements the streaming model with support for both kernel allocated buffers and user pointers. It also implements all of the necessary IOCTLs necessary and supported by the video display device. Signed-off-by: Manjunath Hadli <manjunath.hadli@ti.com> Acked-by: Muralidharan Karicheri <m-karicheri2@ti.com> Acked-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
148 lines
4.4 KiB
C
148 lines
4.4 KiB
C
/*
|
|
* Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation version 2.
|
|
*
|
|
* This program is distributed WITHOUT ANY WARRANTY of any
|
|
* kind, whether express or implied; without even the implied warranty
|
|
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
#ifndef VPBE_DISPLAY_H
|
|
#define VPBE_DISPLAY_H
|
|
|
|
/* Header files */
|
|
#include <linux/videodev2.h>
|
|
#include <media/v4l2-common.h>
|
|
#include <media/videobuf-dma-contig.h>
|
|
#include <media/davinci/vpbe_types.h>
|
|
#include <media/davinci/vpbe_osd.h>
|
|
#include <media/davinci/vpbe.h>
|
|
|
|
#define VPBE_DISPLAY_MAX_DEVICES 2
|
|
|
|
enum vpbe_display_device_id {
|
|
VPBE_DISPLAY_DEVICE_0,
|
|
VPBE_DISPLAY_DEVICE_1
|
|
};
|
|
|
|
#define VPBE_DISPLAY_DRV_NAME "vpbe-display"
|
|
|
|
#define VPBE_DISPLAY_MAJOR_RELEASE 1
|
|
#define VPBE_DISPLAY_MINOR_RELEASE 0
|
|
#define VPBE_DISPLAY_BUILD 1
|
|
#define VPBE_DISPLAY_VERSION_CODE ((VPBE_DISPLAY_MAJOR_RELEASE << 16) | \
|
|
(VPBE_DISPLAY_MINOR_RELEASE << 8) | \
|
|
VPBE_DISPLAY_BUILD)
|
|
|
|
#define VPBE_DISPLAY_VALID_FIELD(field) ((V4L2_FIELD_NONE == field) || \
|
|
(V4L2_FIELD_ANY == field) || (V4L2_FIELD_INTERLACED == field))
|
|
|
|
/* Exp ratio numerator and denominator constants */
|
|
#define VPBE_DISPLAY_H_EXP_RATIO_N 9
|
|
#define VPBE_DISPLAY_H_EXP_RATIO_D 8
|
|
#define VPBE_DISPLAY_V_EXP_RATIO_N 6
|
|
#define VPBE_DISPLAY_V_EXP_RATIO_D 5
|
|
|
|
/* Zoom multiplication factor */
|
|
#define VPBE_DISPLAY_ZOOM_4X 4
|
|
#define VPBE_DISPLAY_ZOOM_2X 2
|
|
|
|
/* Structures */
|
|
struct display_layer_info {
|
|
int enable;
|
|
/* Layer ID used by Display Manager */
|
|
enum osd_layer id;
|
|
struct osd_layer_config config;
|
|
enum osd_zoom_factor h_zoom;
|
|
enum osd_zoom_factor v_zoom;
|
|
enum osd_h_exp_ratio h_exp;
|
|
enum osd_v_exp_ratio v_exp;
|
|
};
|
|
|
|
/* vpbe display object structure */
|
|
struct vpbe_layer {
|
|
/* number of buffers in fbuffers */
|
|
unsigned int numbuffers;
|
|
/* Pointer to the vpbe_display */
|
|
struct vpbe_display *disp_dev;
|
|
/* Pointer pointing to current v4l2_buffer */
|
|
struct videobuf_buffer *cur_frm;
|
|
/* Pointer pointing to next v4l2_buffer */
|
|
struct videobuf_buffer *next_frm;
|
|
/* videobuf specific parameters
|
|
* Buffer queue used in video-buf
|
|
*/
|
|
struct videobuf_queue buffer_queue;
|
|
/* Queue of filled frames */
|
|
struct list_head dma_queue;
|
|
/* Used in video-buf */
|
|
spinlock_t irqlock;
|
|
/* V4l2 specific parameters */
|
|
/* Identifies video device for this layer */
|
|
struct video_device video_dev;
|
|
/* This field keeps track of type of buffer exchange mechanism user
|
|
* has selected
|
|
*/
|
|
enum v4l2_memory memory;
|
|
/* Used to keep track of state of the priority */
|
|
struct v4l2_prio_state prio;
|
|
/* Used to store pixel format */
|
|
struct v4l2_pix_format pix_fmt;
|
|
enum v4l2_field buf_field;
|
|
/* Video layer configuration params */
|
|
struct display_layer_info layer_info;
|
|
/* vpbe specific parameters
|
|
* enable window for display
|
|
*/
|
|
unsigned char window_enable;
|
|
/* number of open instances of the layer */
|
|
unsigned int usrs;
|
|
/* number of users performing IO */
|
|
unsigned int io_usrs;
|
|
/* Indicates id of the field which is being displayed */
|
|
unsigned int field_id;
|
|
/* Indicates whether streaming started */
|
|
unsigned char started;
|
|
/* Identifies device object */
|
|
enum vpbe_display_device_id device_id;
|
|
/* facilitation of ioctl ops lock by v4l2*/
|
|
struct mutex opslock;
|
|
u8 layer_first_int;
|
|
};
|
|
|
|
/* vpbe device structure */
|
|
struct vpbe_display {
|
|
/* layer specific parameters */
|
|
/* lock for isr updates to buf layers*/
|
|
spinlock_t dma_queue_lock;
|
|
/* C-Plane offset from start of y-plane */
|
|
unsigned int cbcr_ofst;
|
|
struct vpbe_layer *dev[VPBE_DISPLAY_MAX_DEVICES];
|
|
struct vpbe_device *vpbe_dev;
|
|
struct osd_state *osd_device;
|
|
};
|
|
|
|
/* File handle structure */
|
|
struct vpbe_fh {
|
|
/* vpbe device structure */
|
|
struct vpbe_display *disp_dev;
|
|
/* pointer to layer object for opened device */
|
|
struct vpbe_layer *layer;
|
|
/* Indicates whether this file handle is doing IO */
|
|
unsigned char io_allowed;
|
|
/* Used to keep track priority of this instance */
|
|
enum v4l2_priority prio;
|
|
};
|
|
|
|
struct buf_config_params {
|
|
unsigned char min_numbuffers;
|
|
unsigned char numbuffers[VPBE_DISPLAY_MAX_DEVICES];
|
|
unsigned int min_bufsize[VPBE_DISPLAY_MAX_DEVICES];
|
|
unsigned int layer_bufsize[VPBE_DISPLAY_MAX_DEVICES];
|
|
};
|
|
|
|
#endif /* VPBE_DISPLAY_H */
|