linux/drivers/media/platform/am437x/am437x-vpfe.h
<<
>>
Prefs
   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
  28enum vpfe_pin_pol {
  29        VPFE_PINPOL_POSITIVE = 0,
  30        VPFE_PINPOL_NEGATIVE,
  31};
  32
  33enum 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 */
  47struct 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
  57struct vpfe_std_info {
  58        int active_pixels;
  59        int active_lines;
  60        /* current frame format */
  61        int frame_format;
  62};
  63
  64struct vpfe_route {
  65        u32 input;
  66        u32 output;
  67};
  68
  69struct 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
  83struct 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
  90struct vpfe_cap_buffer {
  91        struct vb2_v4l2_buffer vb;
  92        struct list_head list;
  93};
  94
  95enum ccdc_pixfmt {
  96        CCDC_PIXFMT_RAW = 0,
  97        CCDC_PIXFMT_YCBCR_16BIT,
  98        CCDC_PIXFMT_YCBCR_8BIT,
  99};
 100
 101enum 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  */
 108enum ccdc_pixorder {
 109        CCDC_PIXORDER_YCBYCR,
 110        CCDC_PIXORDER_CBYCRY,
 111};
 112
 113enum ccdc_buftype {
 114        CCDC_BUFTYPE_FLD_INTERLEAVED,
 115        CCDC_BUFTYPE_FLD_SEPARATED
 116};
 117
 118
 119/* returns the highest bit used for the gamma */
 120static 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 */
 126static 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 */
 132struct 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
 161struct 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 */
 190struct 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
 201struct 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 */
 212struct 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
 225struct 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