Commit faa7a062 authored by kyrie wu's avatar kyrie wu Committed by Hans Verkuil
Browse files

mtk-jpegenc: add jpegenc timeout func interface



Generalizes jpegenc timeout func interfaces to handle HW timeout.

Signed-off-by: default avatarkyrie wu <kyrie.wu@mediatek.com>
Signed-off-by: default avatarirui wang <irui.wang@mediatek.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent 934e8bcc
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -75,6 +75,12 @@ struct mtk_jpeg_variant {
	u32 cap_q_default_fourcc;
};

struct mtk_jpeg_hw_param {
	struct vb2_v4l2_buffer *src_buffer;
	struct vb2_v4l2_buffer *dst_buffer;
	struct mtk_jpeg_ctx *curr_ctx;
};

enum mtk_jpegenc_hw_id {
	MTK_JPEGENC_HW0,
	MTK_JPEGENC_HW1,
@@ -99,6 +105,8 @@ struct mtk_jpegenc_clk {
 * @master_dev:		mtk_jpeg_dev device
 * @venc_clk:		jpeg encode clock
 * @jpegenc_irq:	jpeg encode irq num
 * @job_timeout_work:	encode timeout workqueue
 * @hw_param:		jpeg encode hw parameters
 */
struct mtk_jpegenc_comp_dev {
	struct device *dev;
@@ -107,6 +115,8 @@ struct mtk_jpegenc_comp_dev {
	struct mtk_jpeg_dev *master_dev;
	struct mtk_jpegenc_clk venc_clk;
	int jpegenc_irq;
	struct delayed_work job_timeout_work;
	struct mtk_jpeg_hw_param hw_param;
};

/**
+25 −0
Original line number Diff line number Diff line
@@ -185,6 +185,26 @@ void mtk_jpeg_set_enc_params(struct mtk_jpeg_ctx *ctx, void __iomem *base)
}
EXPORT_SYMBOL_GPL(mtk_jpeg_set_enc_params);

static void mtk_jpegenc_timeout_work(struct work_struct *work)
{
	struct delayed_work *dly_work = to_delayed_work(work);
	struct mtk_jpegenc_comp_dev *cjpeg =
		container_of(dly_work,
			     struct mtk_jpegenc_comp_dev,
			     job_timeout_work);
	enum vb2_buffer_state buf_state = VB2_BUF_STATE_ERROR;
	struct vb2_v4l2_buffer *src_buf, *dst_buf;

	src_buf = cjpeg->hw_param.src_buffer;
	dst_buf = cjpeg->hw_param.dst_buffer;
	v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, true);

	mtk_jpeg_enc_reset(cjpeg->reg_base);
	clk_disable_unprepare(cjpeg->venc_clk.clks->clk);
	pm_runtime_put(cjpeg->dev);
	v4l2_m2m_buf_done(src_buf, buf_state);
}

static irqreturn_t mtk_jpegenc_hw_irq_handler(int irq, void *priv)
{
	struct vb2_v4l2_buffer *src_buf, *dst_buf;
@@ -196,6 +216,8 @@ static irqreturn_t mtk_jpegenc_hw_irq_handler(int irq, void *priv)
	struct mtk_jpegenc_comp_dev *jpeg = priv;
	struct mtk_jpeg_dev *master_jpeg = jpeg->master_dev;

	cancel_delayed_work(&jpeg->job_timeout_work);

	irq_status = readl(jpeg->reg_base + JPEG_ENC_INT_STS) &
		JPEG_ENC_INT_STATUS_MASK_ALLIRQ;
	if (irq_status)
@@ -276,6 +298,9 @@ static int mtk_jpegenc_hw_probe(struct platform_device *pdev)
			master_dev->enc_hw_dev[i] = NULL;
	}

	INIT_DELAYED_WORK(&dev->job_timeout_work,
			  mtk_jpegenc_timeout_work);

	jpegenc_clk = &dev->venc_clk;

	jpegenc_clk->clk_num = devm_clk_bulk_get_all(&pdev->dev,