1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2008-2009 Texas Instruments Inc 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _VPFE_CAPTURE_H 7*4882a593Smuzhiyun #define _VPFE_CAPTURE_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifdef __KERNEL__ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* Header files */ 12*4882a593Smuzhiyun #include <media/v4l2-dev.h> 13*4882a593Smuzhiyun #include <linux/videodev2.h> 14*4882a593Smuzhiyun #include <linux/clk.h> 15*4882a593Smuzhiyun #include <linux/i2c.h> 16*4882a593Smuzhiyun #include <media/v4l2-fh.h> 17*4882a593Smuzhiyun #include <media/v4l2-ioctl.h> 18*4882a593Smuzhiyun #include <media/v4l2-device.h> 19*4882a593Smuzhiyun #include <media/videobuf-dma-contig.h> 20*4882a593Smuzhiyun #include <media/davinci/vpfe_types.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define VPFE_CAPTURE_NUM_DECODERS 5 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* Macros */ 25*4882a593Smuzhiyun #define VPFE_MAJOR_RELEASE 0 26*4882a593Smuzhiyun #define VPFE_MINOR_RELEASE 0 27*4882a593Smuzhiyun #define VPFE_BUILD 1 28*4882a593Smuzhiyun #define VPFE_CAPTURE_VERSION_CODE ((VPFE_MAJOR_RELEASE << 16) | \ 29*4882a593Smuzhiyun (VPFE_MINOR_RELEASE << 8) | \ 30*4882a593Smuzhiyun VPFE_BUILD) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define CAPTURE_DRV_NAME "vpfe-capture" 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct vpfe_pixel_format { 35*4882a593Smuzhiyun u32 pixelformat; 36*4882a593Smuzhiyun /* bytes per pixel */ 37*4882a593Smuzhiyun int bpp; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct vpfe_std_info { 41*4882a593Smuzhiyun int active_pixels; 42*4882a593Smuzhiyun int active_lines; 43*4882a593Smuzhiyun /* current frame format */ 44*4882a593Smuzhiyun int frame_format; 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct vpfe_route { 48*4882a593Smuzhiyun u32 input; 49*4882a593Smuzhiyun u32 output; 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun struct vpfe_subdev_info { 53*4882a593Smuzhiyun /* Sub device name */ 54*4882a593Smuzhiyun char name[32]; 55*4882a593Smuzhiyun /* Sub device group id */ 56*4882a593Smuzhiyun int grp_id; 57*4882a593Smuzhiyun /* Number of inputs supported */ 58*4882a593Smuzhiyun int num_inputs; 59*4882a593Smuzhiyun /* inputs available at the sub device */ 60*4882a593Smuzhiyun struct v4l2_input *inputs; 61*4882a593Smuzhiyun /* Sub dev routing information for each input */ 62*4882a593Smuzhiyun struct vpfe_route *routes; 63*4882a593Smuzhiyun /* check if sub dev supports routing */ 64*4882a593Smuzhiyun int can_route; 65*4882a593Smuzhiyun /* ccdc bus/interface configuration */ 66*4882a593Smuzhiyun struct vpfe_hw_if_param ccdc_if_params; 67*4882a593Smuzhiyun /* i2c subdevice board info */ 68*4882a593Smuzhiyun struct i2c_board_info board_info; 69*4882a593Smuzhiyun }; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct vpfe_config { 72*4882a593Smuzhiyun /* Number of sub devices connected to vpfe */ 73*4882a593Smuzhiyun int num_subdevs; 74*4882a593Smuzhiyun /* i2c bus adapter no */ 75*4882a593Smuzhiyun int i2c_adapter_id; 76*4882a593Smuzhiyun /* information about each subdev */ 77*4882a593Smuzhiyun struct vpfe_subdev_info *sub_devs; 78*4882a593Smuzhiyun /* evm card info */ 79*4882a593Smuzhiyun char *card_name; 80*4882a593Smuzhiyun /* ccdc name */ 81*4882a593Smuzhiyun char *ccdc; 82*4882a593Smuzhiyun /* vpfe clock */ 83*4882a593Smuzhiyun struct clk *vpssclk; 84*4882a593Smuzhiyun struct clk *slaveclk; 85*4882a593Smuzhiyun /* Function for Clearing the interrupt */ 86*4882a593Smuzhiyun void (*clr_intr)(int vdint); 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct vpfe_device { 90*4882a593Smuzhiyun /* V4l2 specific parameters */ 91*4882a593Smuzhiyun /* Identifies video device for this channel */ 92*4882a593Smuzhiyun struct video_device video_dev; 93*4882a593Smuzhiyun /* sub devices */ 94*4882a593Smuzhiyun struct v4l2_subdev **sd; 95*4882a593Smuzhiyun /* vpfe cfg */ 96*4882a593Smuzhiyun struct vpfe_config *cfg; 97*4882a593Smuzhiyun /* V4l2 device */ 98*4882a593Smuzhiyun struct v4l2_device v4l2_dev; 99*4882a593Smuzhiyun /* parent device */ 100*4882a593Smuzhiyun struct device *pdev; 101*4882a593Smuzhiyun /* number of open instances of the channel */ 102*4882a593Smuzhiyun u32 usrs; 103*4882a593Smuzhiyun /* Indicates id of the field which is being displayed */ 104*4882a593Smuzhiyun u32 field_id; 105*4882a593Smuzhiyun /* flag to indicate whether decoder is initialized */ 106*4882a593Smuzhiyun u8 initialized; 107*4882a593Smuzhiyun /* current interface type */ 108*4882a593Smuzhiyun struct vpfe_hw_if_param vpfe_if_params; 109*4882a593Smuzhiyun /* ptr to currently selected sub device */ 110*4882a593Smuzhiyun struct vpfe_subdev_info *current_subdev; 111*4882a593Smuzhiyun /* current input at the sub device */ 112*4882a593Smuzhiyun int current_input; 113*4882a593Smuzhiyun /* Keeps track of the information about the standard */ 114*4882a593Smuzhiyun struct vpfe_std_info std_info; 115*4882a593Smuzhiyun /* std index into std table */ 116*4882a593Smuzhiyun int std_index; 117*4882a593Smuzhiyun /* CCDC IRQs used when CCDC/ISIF output to SDRAM */ 118*4882a593Smuzhiyun unsigned int ccdc_irq0; 119*4882a593Smuzhiyun unsigned int ccdc_irq1; 120*4882a593Smuzhiyun /* number of buffers in fbuffers */ 121*4882a593Smuzhiyun u32 numbuffers; 122*4882a593Smuzhiyun /* List of buffer pointers for storing frames */ 123*4882a593Smuzhiyun u8 *fbuffers[VIDEO_MAX_FRAME]; 124*4882a593Smuzhiyun /* Pointer pointing to current v4l2_buffer */ 125*4882a593Smuzhiyun struct videobuf_buffer *cur_frm; 126*4882a593Smuzhiyun /* Pointer pointing to next v4l2_buffer */ 127*4882a593Smuzhiyun struct videobuf_buffer *next_frm; 128*4882a593Smuzhiyun /* 129*4882a593Smuzhiyun * This field keeps track of type of buffer exchange mechanism 130*4882a593Smuzhiyun * user has selected 131*4882a593Smuzhiyun */ 132*4882a593Smuzhiyun enum v4l2_memory memory; 133*4882a593Smuzhiyun /* Used to store pixel format */ 134*4882a593Smuzhiyun struct v4l2_format fmt; 135*4882a593Smuzhiyun /* 136*4882a593Smuzhiyun * used when IMP is chained to store the crop window which 137*4882a593Smuzhiyun * is different from the image window 138*4882a593Smuzhiyun */ 139*4882a593Smuzhiyun struct v4l2_rect crop; 140*4882a593Smuzhiyun /* Buffer queue used in video-buf */ 141*4882a593Smuzhiyun struct videobuf_queue buffer_queue; 142*4882a593Smuzhiyun /* Queue of filled frames */ 143*4882a593Smuzhiyun struct list_head dma_queue; 144*4882a593Smuzhiyun /* Used in video-buf */ 145*4882a593Smuzhiyun spinlock_t irqlock; 146*4882a593Smuzhiyun /* IRQ lock for DMA queue */ 147*4882a593Smuzhiyun spinlock_t dma_queue_lock; 148*4882a593Smuzhiyun /* lock used to access this structure */ 149*4882a593Smuzhiyun struct mutex lock; 150*4882a593Smuzhiyun /* number of users performing IO */ 151*4882a593Smuzhiyun u32 io_usrs; 152*4882a593Smuzhiyun /* Indicates whether streaming started */ 153*4882a593Smuzhiyun u8 started; 154*4882a593Smuzhiyun /* 155*4882a593Smuzhiyun * offset where second field starts from the starting of the 156*4882a593Smuzhiyun * buffer for field separated YCbCr formats 157*4882a593Smuzhiyun */ 158*4882a593Smuzhiyun u32 field_off; 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* File handle structure */ 162*4882a593Smuzhiyun struct vpfe_fh { 163*4882a593Smuzhiyun struct v4l2_fh fh; 164*4882a593Smuzhiyun struct vpfe_device *vpfe_dev; 165*4882a593Smuzhiyun /* Indicates whether this file handle is doing IO */ 166*4882a593Smuzhiyun u8 io_allowed; 167*4882a593Smuzhiyun }; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun struct vpfe_config_params { 170*4882a593Smuzhiyun u8 min_numbuffers; 171*4882a593Smuzhiyun u8 numbuffers; 172*4882a593Smuzhiyun u32 min_bufsize; 173*4882a593Smuzhiyun u32 device_bufsize; 174*4882a593Smuzhiyun }; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #endif /* End of __KERNEL__ */ 177*4882a593Smuzhiyun #endif /* _DAVINCI_VPFE_H */ 178