1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2013 - 2014 Texas Instruments, Inc. 4 * 5 * Benoit Parrot <bparrot@ti.com> 6 * Lad, Prabhakar <prabhakar.csengg@gmail.com> 7 */ 8 9 #ifndef AM437X_VPFE_H 10 #define AM437X_VPFE_H 11 12 #include <linux/am437x-vpfe.h> 13 #include <linux/clk.h> 14 #include <linux/completion.h> 15 #include <linux/device.h> 16 #include <linux/io.h> 17 #include <linux/i2c.h> 18 #include <linux/videodev2.h> 19 20 #include <media/v4l2-dev.h> 21 #include <media/v4l2-device.h> 22 #include <media/v4l2-ioctl.h> 23 #include <media/videobuf2-v4l2.h> 24 #include <media/videobuf2-dma-contig.h> 25 26 #include "am437x-vpfe_regs.h" 27 28 enum vpfe_pin_pol { 29 VPFE_PINPOL_POSITIVE = 0, 30 VPFE_PINPOL_NEGATIVE, 31 }; 32 33 enum vpfe_hw_if_type { 34 /* Raw Bayer */ 35 VPFE_RAW_BAYER = 0, 36 /* BT656 - 8 bit */ 37 VPFE_BT656, 38 /* BT656 - 10 bit */ 39 VPFE_BT656_10BIT, 40 /* YCbCr - 8 bit with external sync */ 41 VPFE_YCBCR_SYNC_8, 42 /* YCbCr - 16 bit with external sync */ 43 VPFE_YCBCR_SYNC_16, 44 }; 45 46 /* interface description */ 47 struct vpfe_hw_if_param { 48 enum vpfe_hw_if_type if_type; 49 enum vpfe_pin_pol hdpol; 50 enum vpfe_pin_pol vdpol; 51 unsigned int bus_width; 52 }; 53 54 #define VPFE_MAX_SUBDEV 1 55 #define VPFE_MAX_INPUTS 1 56 57 struct vpfe_std_info { 58 int active_pixels; 59 int active_lines; 60 /* current frame format */ 61 int frame_format; 62 }; 63 64 struct vpfe_route { 65 u32 input; 66 u32 output; 67 }; 68 69 struct vpfe_subdev_info { 70 /* Sub device group id */ 71 int grp_id; 72 /* inputs available at the sub device */ 73 struct v4l2_input inputs[VPFE_MAX_INPUTS]; 74 /* Sub dev routing information for each input */ 75 struct vpfe_route *routes; 76 /* check if sub dev supports routing */ 77 int can_route; 78 /* ccdc bus/interface configuration */ 79 struct vpfe_hw_if_param vpfe_param; 80 struct v4l2_subdev *sd; 81 }; 82 83 struct vpfe_config { 84 /* information about each subdev */ 85 struct vpfe_subdev_info sub_devs[VPFE_MAX_SUBDEV]; 86 /* Flat array, arranged in groups */ 87 struct v4l2_async_subdev *asd[VPFE_MAX_SUBDEV]; 88 }; 89 90 struct vpfe_cap_buffer { 91 struct vb2_v4l2_buffer vb; 92 struct list_head list; 93 }; 94 95 enum ccdc_pixfmt { 96 CCDC_PIXFMT_RAW = 0, 97 CCDC_PIXFMT_YCBCR_16BIT, 98 CCDC_PIXFMT_YCBCR_8BIT, 99 }; 100 101 enum ccdc_frmfmt { 102 CCDC_FRMFMT_PROGRESSIVE = 0, 103 CCDC_FRMFMT_INTERLACED, 104 }; 105 106 /* PIXEL ORDER IN MEMORY from LSB to MSB */ 107 /* only applicable for 8-bit input mode */ 108 enum ccdc_pixorder { 109 CCDC_PIXORDER_YCBYCR, 110 CCDC_PIXORDER_CBYCRY, 111 }; 112 113 enum ccdc_buftype { 114 CCDC_BUFTYPE_FLD_INTERLEAVED, 115 CCDC_BUFTYPE_FLD_SEPARATED 116 }; 117 118 119 /* returns the highest bit used for the gamma */ 120 static inline u8 ccdc_gamma_width_max_bit(enum vpfe_ccdc_gamma_width width) 121 { 122 return 15 - width; 123 } 124 125 /* returns the highest bit used for this data size */ 126 static inline u8 ccdc_data_size_max_bit(enum vpfe_ccdc_data_size sz) 127 { 128 return sz == VPFE_CCDC_DATA_8BITS ? 7 : 15 - sz; 129 } 130 131 /* Structure for CCDC configuration parameters for raw capture mode */ 132 struct ccdc_params_raw { 133 /* pixel format */ 134 enum ccdc_pixfmt pix_fmt; 135 /* progressive or interlaced frame */ 136 enum ccdc_frmfmt frm_fmt; 137 struct v4l2_rect win; 138 /* Current Format Bytes Per Pixels */ 139 unsigned int bytesperpixel; 140 /* Current Format Bytes per Lines 141 * (Aligned to 32 bytes) used for HORZ_INFO 142 */ 143 unsigned int bytesperline; 144 /* field id polarity */ 145 enum vpfe_pin_pol fid_pol; 146 /* vertical sync polarity */ 147 enum vpfe_pin_pol vd_pol; 148 /* horizontal sync polarity */ 149 enum vpfe_pin_pol hd_pol; 150 /* interleaved or separated fields */ 151 enum ccdc_buftype buf_type; 152 /* 153 * enable to store the image in inverse 154 * order in memory(bottom to top) 155 */ 156 unsigned char image_invert_enable; 157 /* configurable parameters */ 158 struct vpfe_ccdc_config_params_raw config_params; 159 }; 160 161 struct ccdc_params_ycbcr { 162 /* pixel format */ 163 enum ccdc_pixfmt pix_fmt; 164 /* progressive or interlaced frame */ 165 enum ccdc_frmfmt frm_fmt; 166 struct v4l2_rect win; 167 /* Current Format Bytes Per Pixels */ 168 unsigned int bytesperpixel; 169 /* Current Format Bytes per Lines 170 * (Aligned to 32 bytes) used for HORZ_INFO 171 */ 172 unsigned int bytesperline; 173 /* field id polarity */ 174 enum vpfe_pin_pol fid_pol; 175 /* vertical sync polarity */ 176 enum vpfe_pin_pol vd_pol; 177 /* horizontal sync polarity */ 178 enum vpfe_pin_pol hd_pol; 179 /* enable BT.656 embedded sync mode */ 180 int bt656_enable; 181 /* cb:y:cr:y or y:cb:y:cr in memory */ 182 enum ccdc_pixorder pix_order; 183 /* interleaved or separated fields */ 184 enum ccdc_buftype buf_type; 185 }; 186 187 /* 188 * CCDC operational configuration 189 */ 190 struct ccdc_config { 191 /* CCDC interface type */ 192 enum vpfe_hw_if_type if_type; 193 /* Raw Bayer configuration */ 194 struct ccdc_params_raw bayer; 195 /* YCbCr configuration */ 196 struct ccdc_params_ycbcr ycbcr; 197 /* ccdc base address */ 198 void __iomem *base_addr; 199 }; 200 201 struct vpfe_ccdc { 202 struct ccdc_config ccdc_cfg; 203 u32 ccdc_ctx[VPFE_REG_END / sizeof(u32)]; 204 }; 205 206 /* 207 * struct vpfe_fmt - VPFE media bus format information 208 * fourcc: V4L2 pixel format code 209 * code: V4L2 media bus format code 210 * bitsperpixel: Bits per pixel over the bus 211 */ 212 struct vpfe_fmt { 213 u32 fourcc; 214 u32 code; 215 u32 bitsperpixel; 216 }; 217 218 /* 219 * When formats[] is modified make sure to adjust this value also. 220 * Expect compile time warnings if VPFE_NUM_FORMATS is smaller then 221 * the number of elements in formats[]. 222 */ 223 #define VPFE_NUM_FORMATS 10 224 225 struct vpfe_device { 226 /* V4l2 specific parameters */ 227 /* Identifies video device for this channel */ 228 struct video_device video_dev; 229 /* sub devices */ 230 struct v4l2_subdev **sd; 231 /* vpfe cfg */ 232 struct vpfe_config *cfg; 233 /* V4l2 device */ 234 struct v4l2_device v4l2_dev; 235 /* parent device */ 236 struct device *pdev; 237 /* subdevice async Notifier */ 238 struct v4l2_async_notifier notifier; 239 /* Indicates id of the field which is being displayed */ 240 unsigned field; 241 unsigned sequence; 242 /* current interface type */ 243 struct vpfe_hw_if_param vpfe_if_params; 244 /* ptr to currently selected sub device */ 245 struct vpfe_subdev_info *current_subdev; 246 /* current input at the sub device */ 247 int current_input; 248 /* Keeps track of the information about the standard */ 249 struct vpfe_std_info std_info; 250 /* std index into std table */ 251 int std_index; 252 /* IRQs used when CCDC output to SDRAM */ 253 unsigned int irq; 254 /* Pointer pointing to current v4l2_buffer */ 255 struct vpfe_cap_buffer *cur_frm; 256 /* Pointer pointing to next v4l2_buffer */ 257 struct vpfe_cap_buffer *next_frm; 258 /* Used to store pixel format */ 259 struct v4l2_format fmt; 260 /* Used to keep a reference to the current vpfe_fmt */ 261 struct vpfe_fmt *current_vpfe_fmt; 262 struct vpfe_fmt *active_fmt[VPFE_NUM_FORMATS]; 263 unsigned int num_active_fmt; 264 265 /* 266 * used when IMP is chained to store the crop window which 267 * is different from the image window 268 */ 269 struct v4l2_rect crop; 270 /* Buffer queue used in video-buf */ 271 struct vb2_queue buffer_queue; 272 /* Queue of filled frames */ 273 struct list_head dma_queue; 274 /* IRQ lock for DMA queue */ 275 spinlock_t dma_queue_lock; 276 /* lock used to access this structure */ 277 struct mutex lock; 278 /* 279 * offset where second field starts from the starting of the 280 * buffer for field separated YCbCr formats 281 */ 282 u32 field_off; 283 struct vpfe_ccdc ccdc; 284 int stopping; 285 struct completion capture_stop; 286 }; 287 288 #endif /* AM437X_VPFE_H */ 289