/* * Copyright (C) 2013 - 2014 Texas Instruments, Inc. * * Benoit Parrot * Lad, Prabhakar * * This program is free software; you may redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef AM437X_VPFE_H #define AM437X_VPFE_H #include #include #include #include #include #include #include #include #include #include #include #include "am437x-vpfe_regs.h" enum vpfe_pin_pol { VPFE_PINPOL_POSITIVE = 0, VPFE_PINPOL_NEGATIVE, }; enum vpfe_hw_if_type { /* Raw Bayer */ VPFE_RAW_BAYER = 0, /* BT656 - 8 bit */ VPFE_BT656, /* BT656 - 10 bit */ VPFE_BT656_10BIT, /* YCbCr - 8 bit with external sync */ VPFE_YCBCR_SYNC_8, /* YCbCr - 16 bit with external sync */ VPFE_YCBCR_SYNC_16, }; /* interface description */ struct vpfe_hw_if_param { enum vpfe_hw_if_type if_type; enum vpfe_pin_pol hdpol; enum vpfe_pin_pol vdpol; unsigned int bus_width; }; #define VPFE_MAX_SUBDEV 1 #define VPFE_MAX_INPUTS 1 struct vpfe_pixel_format { struct v4l2_fmtdesc fmtdesc; /* bytes per pixel */ int bpp; }; struct vpfe_std_info { int active_pixels; int active_lines; /* current frame format */ int frame_format; }; struct vpfe_route { u32 input; u32 output; }; struct vpfe_subdev_info { /* Sub device group id */ int grp_id; /* inputs available at the sub device */ struct v4l2_input inputs[VPFE_MAX_INPUTS]; /* Sub dev routing information for each input */ struct vpfe_route *routes; /* check if sub dev supports routing */ int can_route; /* ccdc bus/interface configuration */ struct vpfe_hw_if_param vpfe_param; struct v4l2_subdev *sd; }; struct vpfe_config { /* information about each subdev */ struct vpfe_subdev_info sub_devs[VPFE_MAX_SUBDEV]; /* Flat array, arranged in groups */ struct v4l2_async_subdev *asd[VPFE_MAX_SUBDEV]; }; struct vpfe_cap_buffer { struct vb2_v4l2_buffer vb; struct list_head list; }; enum ccdc_pixfmt { CCDC_PIXFMT_RAW = 0, CCDC_PIXFMT_YCBCR_16BIT, CCDC_PIXFMT_YCBCR_8BIT, }; enum ccdc_frmfmt { CCDC_FRMFMT_PROGRESSIVE = 0, CCDC_FRMFMT_INTERLACED, }; /* PIXEL ORDER IN MEMORY from LSB to MSB */ /* only applicable for 8-bit input mode */ enum ccdc_pixorder { CCDC_PIXORDER_YCBYCR, CCDC_PIXORDER_CBYCRY, }; enum ccdc_buftype { CCDC_BUFTYPE_FLD_INTERLEAVED, CCDC_BUFTYPE_FLD_SEPARATED }; /* returns the highest bit used for the gamma */ static inline u8 ccdc_gamma_width_max_bit(enum vpfe_ccdc_gamma_width width) { return 15 - width; } /* returns the highest bit used for this data size */ static inline u8 ccdc_data_size_max_bit(enum vpfe_ccdc_data_size sz) { return sz == VPFE_CCDC_DATA_8BITS ? 7 : 15 - sz; } /* Structure for CCDC configuration parameters for raw capture mode */ struct ccdc_params_raw { /* pixel format */ enum ccdc_pixfmt pix_fmt; /* progressive or interlaced frame */ enum ccdc_frmfmt frm_fmt; struct v4l2_rect win; /* Current Format Bytes Per Pixels */ unsigned int bytesperpixel; /* Current Format Bytes per Lines * (Aligned to 32 bytes) used for HORZ_INFO */ unsigned int bytesperline; /* field id polarity */ enum vpfe_pin_pol fid_pol; /* vertical sync polarity */ enum vpfe_pin_pol vd_pol; /* horizontal sync polarity */ enum vpfe_pin_pol hd_pol; /* interleaved or separated fields */ enum ccdc_buftype buf_type; /* * enable to store the image in inverse * order in memory(bottom to top) */ unsigned char image_invert_enable; /* configurable parameters */ struct vpfe_ccdc_config_params_raw config_params; }; struct ccdc_params_ycbcr { /* pixel format */ enum ccdc_pixfmt pix_fmt; /* progressive or interlaced frame */ enum ccdc_frmfmt frm_fmt; struct v4l2_rect win; /* Current Format Bytes Per Pixels */ unsigned int bytesperpixel; /* Current Format Bytes per Lines * (Aligned to 32 bytes) used for HORZ_INFO */ unsigned int bytesperline; /* field id polarity */ enum vpfe_pin_pol fid_pol; /* vertical sync polarity */ enum vpfe_pin_pol vd_pol; /* horizontal sync polarity */ enum vpfe_pin_pol hd_pol; /* enable BT.656 embedded sync mode */ int bt656_enable; /* cb:y:cr:y or y:cb:y:cr in memory */ enum ccdc_pixorder pix_order; /* interleaved or separated fields */ enum ccdc_buftype buf_type; }; /* * CCDC operational configuration */ struct ccdc_config { /* CCDC interface type */ enum vpfe_hw_if_type if_type; /* Raw Bayer configuration */ struct ccdc_params_raw bayer; /* YCbCr configuration */ struct ccdc_params_ycbcr ycbcr; /* ccdc base address */ void __iomem *base_addr; }; struct vpfe_ccdc { struct ccdc_config ccdc_cfg; u32 ccdc_ctx[VPFE_REG_END / sizeof(u32)]; }; struct vpfe_device { /* V4l2 specific parameters */ /* Identifies video device for this channel */ struct video_device video_dev; /* sub devices */ struct v4l2_subdev **sd; /* vpfe cfg */ struct vpfe_config *cfg; /* V4l2 device */ struct v4l2_device v4l2_dev; /* parent device */ struct device *pdev; /* subdevice async Notifier */ struct v4l2_async_notifier notifier; /* Indicates id of the field which is being displayed */ unsigned field; unsigned sequence; /* current interface type */ struct vpfe_hw_if_param vpfe_if_params; /* ptr to currently selected sub device */ struct vpfe_subdev_info *current_subdev; /* current input at the sub device */ int current_input; /* Keeps track of the information about the standard */ struct vpfe_std_info std_info; /* std index into std table */ int std_index; /* IRQs used when CCDC output to SDRAM */ unsigned int irq; /* Pointer pointing to current v4l2_buffer */ struct vpfe_cap_buffer *cur_frm; /* Pointer pointing to next v4l2_buffer */ struct vpfe_cap_buffer *next_frm; /* Used to store pixel format */ struct v4l2_format fmt; /* Used to store current bytes per pixel based on current format */ unsigned int bpp; /* * used when IMP is chained to store the crop window which * is different from the image window */ struct v4l2_rect crop; /* Buffer queue used in video-buf */ struct vb2_queue buffer_queue; /* Allocator-specific contexts for each plane */ struct vb2_alloc_ctx *alloc_ctx; /* Queue of filled frames */ struct list_head dma_queue; /* IRQ lock for DMA queue */ spinlock_t dma_queue_lock; /* lock used to access this structure */ struct mutex lock; /* * offset where second field starts from the starting of the * buffer for field separated YCbCr formats */ u32 field_off; struct vpfe_ccdc ccdc; }; #endif /* AM437X_VPFE_H */