/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2022 MediaTek Inc.
 * Author: Ping-Hsun Wu <ping-hsun.wu@mediatek.com>
 */

#ifndef __MTK_MDP3_M2M_H__
#define __MTK_MDP3_M2M_H__

#include <media/v4l2-ctrls.h>
#include "mtk-mdp3-core.h"
#include "mtk-mdp3-vpu.h"
#include "mtk-mdp3-regs.h"

#define MDP_MAX_CTRLS	10

enum {
	MDP_M2M_SRC = 0,
	MDP_M2M_DST = 1,
	MDP_M2M_MAX,
};

struct mdp_m2m_ctrls {
	struct v4l2_ctrl	*hflip;
	struct v4l2_ctrl	*vflip;
	struct v4l2_ctrl	*rotate;
};

struct mdp_m2m_ctx {
	u32				id;
	struct mdp_dev			*mdp_dev;
	struct v4l2_fh			fh;
	struct v4l2_ctrl_handler	ctrl_handler;
	struct mdp_m2m_ctrls		ctrls;
	struct v4l2_m2m_ctx		*m2m_ctx;
	u32				frame_count[MDP_M2M_MAX];

	struct mdp_frameparam		curr_param;
	/* synchronization protect for mdp m2m context */
	struct mutex			ctx_lock;
};

int mdp_m2m_device_register(struct mdp_dev *mdp);
void mdp_m2m_device_unregister(struct mdp_dev *mdp);
void mdp_m2m_job_finish(struct mdp_m2m_ctx *ctx);

#endif  /* __MTK_MDP3_M2M_H__ */