1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * stf_video.h 4 * 5 * StarFive Camera Subsystem - V4L2 device node 6 * 7 * Copyright (C) 2021-2023 StarFive Technology Co., Ltd. 8 */ 9 10#ifndef STF_VIDEO_H 11#define STF_VIDEO_H 12 13#include <linux/list.h> 14#include <linux/mutex.h> 15#include <linux/videodev2.h> 16#include <media/v4l2-dev.h> 17#include <media/v4l2-fh.h> 18#include <media/v4l2-ioctl.h> 19#include <media/videobuf2-v4l2.h> 20 21#define STFCAMSS_FRAME_MIN_WIDTH 64 22#define STFCAMSS_FRAME_MAX_WIDTH 1920 23#define STFCAMSS_FRAME_MIN_HEIGHT 64 24#define STFCAMSS_FRAME_MAX_HEIGHT 1080 25#define STFCAMSS_FRAME_WIDTH_ALIGN_8 8 26#define STFCAMSS_FRAME_WIDTH_ALIGN_128 128 27#define STFCAMSS_MIN_BUFFERS 2 28 29#define STFCAMSS_MAX_ENTITY_NAME_LEN 27 30 31enum stf_v_line_id { 32 STF_V_LINE_WR = 0, 33 STF_V_LINE_ISP, 34 STF_V_LINE_MAX, 35}; 36 37enum stf_capture_type { 38 STF_CAPTURE_RAW = 0, 39 STF_CAPTURE_YUV, 40 STF_CAPTURE_NUM, 41}; 42 43struct stfcamss_buffer { 44 struct vb2_v4l2_buffer vb; 45 dma_addr_t addr[2]; 46 struct list_head queue; 47}; 48 49struct fract { 50 u8 numerator; 51 u8 denominator; 52}; 53 54/* 55 * struct stfcamss_format_info - ISP media bus format information 56 * @code: V4L2 media bus format code 57 * @pixelformat: V4L2 pixel format FCC identifier 58 * @planes: Number of planes 59 * @vsub: Vertical subsampling (for each plane) 60 * @bpp: Bits per pixel when stored in memory (for each plane) 61 */ 62struct stfcamss_format_info { 63 u32 code; 64 u32 pixelformat; 65 u8 planes; 66 u8 vsub[3]; 67 u8 bpp; 68}; 69 70struct stfcamss_video { 71 struct stfcamss *stfcamss; 72 struct vb2_queue vb2_q; 73 struct video_device vdev; 74 struct media_pad pad; 75 struct v4l2_format active_fmt; 76 enum v4l2_buf_type type; 77 const struct stfcamss_video_ops *ops; 78 struct mutex lock; /* serialize device access */ 79 struct mutex q_lock; /* protects the queue */ 80 unsigned int bpl_alignment; 81 const struct stfcamss_format_info *formats; 82 unsigned int nformats; 83 struct v4l2_subdev *source_subdev; 84}; 85 86struct stfcamss_video_ops { 87 int (*queue_buffer)(struct stfcamss_video *video, 88 struct stfcamss_buffer *buf); 89 int (*flush_buffers)(struct stfcamss_video *video, 90 enum vb2_buffer_state state); 91 void (*start_streaming)(struct stfcamss_video *video); 92 void (*stop_streaming)(struct stfcamss_video *video); 93}; 94 95int stf_video_register(struct stfcamss_video *video, 96 struct v4l2_device *v4l2_dev, const char *name); 97 98void stf_video_unregister(struct stfcamss_video *video); 99 100#endif /* STF_VIDEO_H */ 101