root/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0+ */
   2 /*
   3  * Copyright (C) 2016 NextThing Co
   4  * Copyright (C) 2016-2019 Bootlin
   5  *
   6  * Author: Maxime Ripard <maxime.ripard@bootlin.com>
   7  */
   8 
   9 #ifndef _SUN4I_CSI_H_
  10 #define _SUN4I_CSI_H_
  11 
  12 #include <media/media-device.h>
  13 #include <media/v4l2-async.h>
  14 #include <media/v4l2-dev.h>
  15 #include <media/v4l2-device.h>
  16 #include <media/v4l2-fwnode.h>
  17 #include <media/videobuf2-core.h>
  18 
  19 #define CSI_EN_REG                      0x00
  20 
  21 #define CSI_CFG_REG                     0x04
  22 #define CSI_CFG_INPUT_FMT(fmt)                  ((fmt) << 20)
  23 #define CSI_CFG_OUTPUT_FMT(fmt)                 ((fmt) << 16)
  24 #define CSI_CFG_YUV_DATA_SEQ(seq)               ((seq) << 8)
  25 #define CSI_CFG_VREF_POL(pol)                   ((pol) << 2)
  26 #define CSI_CFG_HREF_POL(pol)                   ((pol) << 1)
  27 #define CSI_CFG_PCLK_POL(pol)                   ((pol) << 0)
  28 
  29 #define CSI_CPT_CTRL_REG                0x08
  30 #define CSI_CPT_CTRL_VIDEO_START                BIT(1)
  31 #define CSI_CPT_CTRL_IMAGE_START                BIT(0)
  32 
  33 #define CSI_BUF_ADDR_REG(fifo, buf)     (0x10 + (0x8 * (fifo)) + (0x4 * (buf)))
  34 
  35 #define CSI_BUF_CTRL_REG                0x28
  36 #define CSI_BUF_CTRL_DBN                        BIT(2)
  37 #define CSI_BUF_CTRL_DBS                        BIT(1)
  38 #define CSI_BUF_CTRL_DBE                        BIT(0)
  39 
  40 #define CSI_INT_EN_REG                  0x30
  41 #define CSI_INT_FRM_DONE                        BIT(1)
  42 #define CSI_INT_CPT_DONE                        BIT(0)
  43 
  44 #define CSI_INT_STA_REG                 0x34
  45 
  46 #define CSI_WIN_CTRL_W_REG              0x40
  47 #define CSI_WIN_CTRL_W_ACTIVE(w)                ((w) << 16)
  48 
  49 #define CSI_WIN_CTRL_H_REG              0x44
  50 #define CSI_WIN_CTRL_H_ACTIVE(h)                ((h) << 16)
  51 
  52 #define CSI_BUF_LEN_REG                 0x48
  53 
  54 #define CSI_MAX_BUFFER          2
  55 #define CSI_MAX_HEIGHT          8192U
  56 #define CSI_MAX_WIDTH           8192U
  57 
  58 enum csi_input {
  59         CSI_INPUT_RAW   = 0,
  60         CSI_INPUT_BT656 = 2,
  61         CSI_INPUT_YUV   = 3,
  62 };
  63 
  64 enum csi_output_raw {
  65         CSI_OUTPUT_RAW_PASSTHROUGH = 0,
  66 };
  67 
  68 enum csi_output_yuv {
  69         CSI_OUTPUT_YUV_422_PLANAR       = 0,
  70         CSI_OUTPUT_YUV_420_PLANAR       = 1,
  71         CSI_OUTPUT_YUV_422_UV           = 4,
  72         CSI_OUTPUT_YUV_420_UV           = 5,
  73         CSI_OUTPUT_YUV_422_MACRO        = 8,
  74         CSI_OUTPUT_YUV_420_MACRO        = 9,
  75 };
  76 
  77 enum csi_yuv_data_seq {
  78         CSI_YUV_DATA_SEQ_YUYV   = 0,
  79         CSI_YUV_DATA_SEQ_YVYU   = 1,
  80         CSI_YUV_DATA_SEQ_UYVY   = 2,
  81         CSI_YUV_DATA_SEQ_VYUY   = 3,
  82 };
  83 
  84 enum csi_subdev_pads {
  85         CSI_SUBDEV_SINK,
  86         CSI_SUBDEV_SOURCE,
  87 
  88         CSI_SUBDEV_PADS,
  89 };
  90 
  91 extern const struct v4l2_subdev_ops sun4i_csi_subdev_ops;
  92 
  93 struct sun4i_csi_format {
  94         u32                     mbus;
  95         u32                     fourcc;
  96         enum csi_input          input;
  97         u32                     output;
  98         unsigned int            num_planes;
  99         u8                      bpp[3];
 100         unsigned int            hsub;
 101         unsigned int            vsub;
 102 };
 103 
 104 const struct sun4i_csi_format *sun4i_csi_find_format(const u32 *fourcc,
 105                                                      const u32 *mbus);
 106 
 107 struct sun4i_csi {
 108         /* Device resources */
 109         struct device                   *dev;
 110 
 111         void __iomem                    *regs;
 112         struct clk                      *bus_clk;
 113         struct clk                      *isp_clk;
 114         struct clk                      *ram_clk;
 115         struct reset_control            *rst;
 116 
 117         struct vb2_v4l2_buffer          *current_buf[CSI_MAX_BUFFER];
 118 
 119         struct {
 120                 size_t                  size;
 121                 void                    *vaddr;
 122                 dma_addr_t              paddr;
 123         } scratch;
 124 
 125         struct v4l2_fwnode_bus_parallel bus;
 126 
 127         /* Main Device */
 128         struct v4l2_device              v4l;
 129         struct media_device             mdev;
 130         struct video_device             vdev;
 131         struct media_pad                vdev_pad;
 132         struct v4l2_pix_format_mplane   fmt;
 133 
 134         /* Local subdev */
 135         struct v4l2_subdev              subdev;
 136         struct media_pad                subdev_pads[CSI_SUBDEV_PADS];
 137         struct v4l2_mbus_framefmt       subdev_fmt;
 138 
 139         /* V4L2 Async variables */
 140         struct v4l2_async_subdev        asd;
 141         struct v4l2_async_notifier      notifier;
 142         struct v4l2_subdev              *src_subdev;
 143         int                             src_pad;
 144 
 145         /* V4L2 variables */
 146         struct mutex                    lock;
 147 
 148         /* Videobuf2 */
 149         struct vb2_queue                queue;
 150         struct list_head                buf_list;
 151         spinlock_t                      qlock;
 152         unsigned int                    sequence;
 153 };
 154 
 155 int sun4i_csi_dma_register(struct sun4i_csi *csi, int irq);
 156 void sun4i_csi_dma_unregister(struct sun4i_csi *csi);
 157 
 158 int sun4i_csi_v4l2_register(struct sun4i_csi *csi);
 159 
 160 #endif /* _SUN4I_CSI_H_ */

/* [<][>][^][v][top][bottom][index][help] */