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 31 enum stf_v_line_id { 32 STF_V_LINE_WR = 0, 33 STF_V_LINE_ISP, 34 STF_V_LINE_MAX, 35 }; 36 37 enum stf_capture_type { 38 STF_CAPTURE_RAW = 0, 39 STF_CAPTURE_YUV, 40 STF_CAPTURE_NUM, 41 }; 42 43 struct stfcamss_buffer { 44 struct vb2_v4l2_buffer vb; 45 dma_addr_t addr[2]; 46 struct list_head queue; 47 }; 48 49 struct 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 */ 62 struct stfcamss_format_info { 63 u32 code; 64 u32 pixelformat; 65 u8 planes; 66 u8 vsub[3]; 67 u8 bpp; 68 }; 69 70 struct 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 86 struct 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 95 int stf_video_register(struct stfcamss_video *video, 96 struct v4l2_device *v4l2_dev, const char *name); 97 98 void stf_video_unregister(struct stfcamss_video *video); 99 100 #endif /* STF_VIDEO_H */ 101