1 /* 2 * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License as 6 * published by the Free Software Foundation version 2. 7 * 8 * This program is distributed WITHOUT ANY WARRANTY of any 9 * kind, whether express or implied; without even the implied warranty 10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 */ 13 #ifndef VPBE_DISPLAY_H 14 #define VPBE_DISPLAY_H 15 16 /* Header files */ 17 #include <linux/videodev2.h> 18 #include <media/v4l2-common.h> 19 #include <media/videobuf-dma-contig.h> 20 #include <media/davinci/vpbe_types.h> 21 #include <media/davinci/vpbe_osd.h> 22 #include <media/davinci/vpbe.h> 23 24 #define VPBE_DISPLAY_MAX_DEVICES 2 25 26 enum vpbe_display_device_id { 27 VPBE_DISPLAY_DEVICE_0, 28 VPBE_DISPLAY_DEVICE_1 29 }; 30 31 #define VPBE_DISPLAY_DRV_NAME "vpbe-display" 32 33 #define VPBE_DISPLAY_MAJOR_RELEASE 1 34 #define VPBE_DISPLAY_MINOR_RELEASE 0 35 #define VPBE_DISPLAY_BUILD 1 36 #define VPBE_DISPLAY_VERSION_CODE ((VPBE_DISPLAY_MAJOR_RELEASE << 16) | \ 37 (VPBE_DISPLAY_MINOR_RELEASE << 8) | \ 38 VPBE_DISPLAY_BUILD) 39 40 #define VPBE_DISPLAY_VALID_FIELD(field) ((V4L2_FIELD_NONE == field) || \ 41 (V4L2_FIELD_ANY == field) || (V4L2_FIELD_INTERLACED == field)) 42 43 /* Exp ratio numerator and denominator constants */ 44 #define VPBE_DISPLAY_H_EXP_RATIO_N 9 45 #define VPBE_DISPLAY_H_EXP_RATIO_D 8 46 #define VPBE_DISPLAY_V_EXP_RATIO_N 6 47 #define VPBE_DISPLAY_V_EXP_RATIO_D 5 48 49 /* Zoom multiplication factor */ 50 #define VPBE_DISPLAY_ZOOM_4X 4 51 #define VPBE_DISPLAY_ZOOM_2X 2 52 53 /* Structures */ 54 struct display_layer_info { 55 int enable; 56 /* Layer ID used by Display Manager */ 57 enum osd_layer id; 58 struct osd_layer_config config; 59 enum osd_zoom_factor h_zoom; 60 enum osd_zoom_factor v_zoom; 61 enum osd_h_exp_ratio h_exp; 62 enum osd_v_exp_ratio v_exp; 63 }; 64 65 /* vpbe display object structure */ 66 struct vpbe_layer { 67 /* number of buffers in fbuffers */ 68 unsigned int numbuffers; 69 /* Pointer to the vpbe_display */ 70 struct vpbe_display *disp_dev; 71 /* Pointer pointing to current v4l2_buffer */ 72 struct videobuf_buffer *cur_frm; 73 /* Pointer pointing to next v4l2_buffer */ 74 struct videobuf_buffer *next_frm; 75 /* videobuf specific parameters 76 * Buffer queue used in video-buf 77 */ 78 struct videobuf_queue buffer_queue; 79 /* Queue of filled frames */ 80 struct list_head dma_queue; 81 /* Used in video-buf */ 82 spinlock_t irqlock; 83 /* V4l2 specific parameters */ 84 /* Identifies video device for this layer */ 85 struct video_device video_dev; 86 /* This field keeps track of type of buffer exchange mechanism user 87 * has selected 88 */ 89 enum v4l2_memory memory; 90 /* Used to keep track of state of the priority */ 91 struct v4l2_prio_state prio; 92 /* Used to store pixel format */ 93 struct v4l2_pix_format pix_fmt; 94 enum v4l2_field buf_field; 95 /* Video layer configuration params */ 96 struct display_layer_info layer_info; 97 /* vpbe specific parameters 98 * enable window for display 99 */ 100 unsigned char window_enable; 101 /* number of open instances of the layer */ 102 unsigned int usrs; 103 /* number of users performing IO */ 104 unsigned int io_usrs; 105 /* Indicates id of the field which is being displayed */ 106 unsigned int field_id; 107 /* Indicates whether streaming started */ 108 unsigned char started; 109 /* Identifies device object */ 110 enum vpbe_display_device_id device_id; 111 /* facilitation of ioctl ops lock by v4l2*/ 112 struct mutex opslock; 113 u8 layer_first_int; 114 }; 115 116 /* vpbe device structure */ 117 struct vpbe_display { 118 /* layer specific parameters */ 119 /* lock for isr updates to buf layers*/ 120 spinlock_t dma_queue_lock; 121 /* C-Plane offset from start of y-plane */ 122 unsigned int cbcr_ofst; 123 struct vpbe_layer *dev[VPBE_DISPLAY_MAX_DEVICES]; 124 struct vpbe_device *vpbe_dev; 125 struct osd_state *osd_device; 126 }; 127 128 /* File handle structure */ 129 struct vpbe_fh { 130 /* vpbe device structure */ 131 struct vpbe_display *disp_dev; 132 /* pointer to layer object for opened device */ 133 struct vpbe_layer *layer; 134 /* Indicates whether this file handle is doing IO */ 135 unsigned char io_allowed; 136 /* Used to keep track priority of this instance */ 137 enum v4l2_priority prio; 138 }; 139 140 struct buf_config_params { 141 unsigned char min_numbuffers; 142 unsigned char numbuffers[VPBE_DISPLAY_MAX_DEVICES]; 143 unsigned int min_bufsize[VPBE_DISPLAY_MAX_DEVICES]; 144 unsigned int layer_bufsize[VPBE_DISPLAY_MAX_DEVICES]; 145 }; 146 147 #endif /* VPBE_DISPLAY_H */ 148