163 lines · c
1/* SPDX-License-Identifier: GPL-2.0+ */2/*3 * Copyright (C) 2016 NextThing Co4 * Copyright (C) 2016-2019 Bootlin5 *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 0x0020 21#define CSI_CFG_REG 0x0422#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 0x0830#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 0x2836#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 0x3041#define CSI_INT_FRM_DONE BIT(1)42#define CSI_INT_CPT_DONE BIT(0)43 44#define CSI_INT_STA_REG 0x3445 46#define CSI_WIN_CTRL_W_REG 0x4047#define CSI_WIN_CTRL_W_ACTIVE(w) ((w) << 16)48 49#define CSI_WIN_CTRL_H_REG 0x4450#define CSI_WIN_CTRL_H_ACTIVE(h) ((h) << 16)51 52#define CSI_BUF_LEN_REG 0x4853 54#define CSI_MAX_BUFFER 255#define CSI_MAX_HEIGHT 8192U56#define CSI_MAX_WIDTH 8192U57 58enum csi_input {59 CSI_INPUT_RAW = 0,60 CSI_INPUT_BT656 = 2,61 CSI_INPUT_YUV = 3,62};63 64enum csi_output_raw {65 CSI_OUTPUT_RAW_PASSTHROUGH = 0,66};67 68enum 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 77enum 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 84enum csi_subdev_pads {85 CSI_SUBDEV_SINK,86 CSI_SUBDEV_SOURCE,87 88 CSI_SUBDEV_PADS,89};90 91extern const struct v4l2_subdev_ops sun4i_csi_subdev_ops;92extern const struct v4l2_subdev_internal_ops sun4i_csi_subdev_internal_ops;93 94struct sun4i_csi_format {95 u32 mbus;96 u32 fourcc;97 enum csi_input input;98 u32 output;99 unsigned int num_planes;100 u8 bpp[3];101 unsigned int hsub;102 unsigned int vsub;103};104 105const struct sun4i_csi_format *sun4i_csi_find_format(const u32 *fourcc,106 const u32 *mbus);107 108struct sun4i_csi {109 /* Device resources */110 struct device *dev;111 112 const struct sun4i_csi_traits *traits;113 114 void __iomem *regs;115 struct clk *bus_clk;116 struct clk *isp_clk;117 struct clk *ram_clk;118 struct reset_control *rst;119 120 struct vb2_v4l2_buffer *current_buf[CSI_MAX_BUFFER];121 122 struct {123 size_t size;124 void *vaddr;125 dma_addr_t paddr;126 } scratch;127 128 struct v4l2_mbus_config_parallel bus;129 130 /* Main Device */131 struct v4l2_device v4l;132 struct media_device mdev;133 struct video_device vdev;134 struct media_pad vdev_pad;135 struct v4l2_pix_format_mplane fmt;136 137 /* Local subdev */138 struct v4l2_subdev subdev;139 struct media_pad subdev_pads[CSI_SUBDEV_PADS];140 struct v4l2_mbus_framefmt subdev_fmt;141 142 /* V4L2 Async variables */143 struct v4l2_async_notifier notifier;144 struct v4l2_subdev *src_subdev;145 int src_pad;146 147 /* V4L2 variables */148 struct mutex lock;149 150 /* Videobuf2 */151 struct vb2_queue queue;152 struct list_head buf_list;153 spinlock_t qlock;154 unsigned int sequence;155};156 157int sun4i_csi_dma_register(struct sun4i_csi *csi, int irq);158void sun4i_csi_dma_unregister(struct sun4i_csi *csi);159 160int sun4i_csi_v4l2_register(struct sun4i_csi *csi);161 162#endif /* _SUN4I_CSI_H_ */163