| /* |
| * Copyright (C) 2013 - 2014 Texas Instruments, Inc. |
| * |
| * Benoit Parrot <bparrot@ti.com> |
| * Lad, Prabhakar <prabhakar.csengg@gmail.com> |
| * |
| * 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 <linux/am437x-vpfe.h> |
| #include <linux/clk.h> |
| #include <linux/device.h> |
| #include <linux/io.h> |
| #include <linux/i2c.h> |
| #include <linux/videodev2.h> |
| |
| #include <media/v4l2-dev.h> |
| #include <media/v4l2-device.h> |
| #include <media/v4l2-ioctl.h> |
| #include <media/videobuf2-dma-contig.h> |
| |
| #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 { |
| char name[32]; |
| /* 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_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 */ |