root/drivers/media/platform/amd/isp4/isp4_video.h
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (C) 2025 Advanced Micro Devices, Inc.
 */

#ifndef _ISP4_VIDEO_H_
#define _ISP4_VIDEO_H_

#include <media/v4l2-dev.h>
#include <media/videobuf2-memops.h>

#include "isp4_interface.h"

struct isp4vid_capture_buffer {
        /*
         * struct vb2_v4l2_buffer must be the first element
         * the videobuf2 framework will allocate this struct based on
         * buf_struct_size and use the first sizeof(struct vb2_buffer) bytes of
         * memory as a vb2_buffer
         */
        struct vb2_v4l2_buffer vb2;
        struct isp4if_img_buf_info img_buf;
        struct list_head list;
        struct dma_buf *dbuf;
        void *bo;
        u64 gpu_addr;
};

struct isp4vid_dev {
        struct video_device vdev;
        struct media_pad vdev_pad;
        struct v4l2_pix_format format;

        /* mutex that protects vbq */
        struct mutex vbq_lock;
        struct vb2_queue vbq;

        /* mutex that protects buf_list */
        struct mutex buf_list_lock;
        struct list_head buf_list;

        u32 sequence;
        bool stream_started;

        struct device *dev;
        struct v4l2_subdev *isp_sdev;
        struct v4l2_fract timeperframe;
};

int isp4vid_dev_init(struct isp4vid_dev *isp_vdev, struct v4l2_subdev *isp_sd);

void isp4vid_dev_deinit(struct isp4vid_dev *isp_vdev);

void isp4vid_handle_frame_done(struct isp4vid_dev *isp_vdev,
                               const struct isp4if_img_buf_info *img_buf);

#endif /* _ISP4_VIDEO_H_ */