From: kyrie wu <[email protected]>
This series adds support for multi hardwares jpeg enc & dec,
by first adding use of_platform_populate to manage each hardware
information:interrupt, clock, register bases and power.
Secondly add jpeg enc & dec work queue to deal with the encoding
or decoding requests of multi-hardwares at the same time.
Lastly, add output picture reorder function interface to
eliminate the out of order images.
This series has been tested with MT8195 Gstreamer.
Encoding and decoding worked for this chip.
Patches 1 Adds jpeg encoder dt-bindings for mt8195
Patches 2 jpeg encoder builds two module for using Multi-HW,
export some functions to make them visible by other modules.
Patches 3 use devm_of_platform_populate to manage multi-hardware.
Patch 4 add jpeg encoding timeout function to judge hardware timeout.
Patch 5 add encoding work queue to deal with multi-hardware encoding
at the same time.
Patch 6 add output picture reorder function to order images.
Patch 7 add stop cmd function to deal with EOS operation.
Patch 8 Adds jpeg decoder dt-bindings for mt8195
Patches 9 jpeg decoder builds three module for using Multi-HW,
export some functions to make them visible by other modules.
Patch 10 use of_platform_populate to manage multi-hardware.
Patch 11 add jpeg decoding timeout function to judge hardware timeout.
Patch 12 add decoding work queue to deal with multi-hardware decoding
at the same time.
Patch 13 add output picture reorder function to order images.
Patch 14 refactor jpegdec func interface for HW working.
Patch 15 add stop cmd function to deal with EOS operation.
---
This series patches dependent on:
media_stage tree:
[1]
https://git.linuxtv.org/media_stage.git/commit/?id=b3627647f9ea7473d10fb08a95fd7c4133a17ca4
patch1 new jpegdec dt-bindings included files
[2] MM IOMMU binding:
https://patchwork.kernel.org/project/linux-mediatek/patch/[email protected]/
[3] MT8195 power domain:
https://patchwork.kernel.org/project/linux-mediatek/list/?series=580579
Changes compared with v13:
- some modifications for patch v13's review comments.
- fix kernel robot check errors.
- fix kernel-doc check warns.
- fix sparse check warns.
- combine jpeg encoder series with decoder series into
one single series.
Changes compared with v12:
- some modifications for patch v12's review comments.
Changes compared with v11:
- some modifications for patch v11's review comments.
- fix yaml file check errors.
Changes compared with v10:
- some modifications for patch v10's review comments.
- fix Gstreamer test errors.
Changes compared with v9:
- some modifications for patch v9's review comments.
Changes compared with v8:
- some modifications for patch v8's review comments.
- add stop cmd function.
Changes compared with v7:
- some modifications for patch v6's review comments.
Changes compared with v6:
- new yaml file for mt8195 jpeg encoder.
- some modifications for patch v5's review comments.
Changes compared with v5:
- use of_platform_populate to replace component framework to
manage multi-hardware in patch 2.
Changes compared with v4:
- No change compaered with v4
Changes compared with v3:
- Structure patches for consistency, non-backward
compatible and do not break any existing functionality
Changes compared with v2:
- Split the last two patches into several patches
to enhance readability
- Correct some syntax errors
- Explain why the component framework is used
Changes compared with v1:
- Add jpeg encoder dt-bindings for MT8195
- Use component framework to manage jpegenc HW
- Add jpegenc output pic reorder function interface
kyrie wu (15):
dt-bindings: mediatek: Add mediatek, mt8195-jpgenc compatible
mtk-jpegenc: export jpeg encoder functions
mtk-jpegenc: support jpegenc multi-hardware
mtk-jpegenc: add jpegenc timeout func interface
mtk-jpegenc: add jpeg encode worker interface
mtk-jpegenc: add output pic reorder interface
mtk-jpegenc: add stop cmd interface for jpgenc
dt-bindings: mediatek: Add mediatek,mt8195-jpgdec compatible
media: mtk-jpegdec: export jpeg decoder functions
media: mtk-jpegdec: support jpegdec multi-hardware
media: mtk-jpegdec: add jpegdec timeout func interface
media: mtk-jpegdec: add jpeg decode worker interface
media: mtk-jpegdec: add output pic reorder interface
media: mtk-jpegdec: refactor jpegdec func interface
mtk-jpegdec: add stop cmd interface for jpgdec
.../media/mediatek,mt8195-jpegdec.yaml | 169 ++++++
.../media/mediatek,mt8195-jpegenc.yaml | 147 ++++++
drivers/media/platform/mediatek/jpeg/Makefile | 14 +-
.../platform/mediatek/jpeg/mtk_jpeg_core.c | 490 ++++++++++++++++--
.../platform/mediatek/jpeg/mtk_jpeg_core.h | 169 +++++-
.../platform/mediatek/jpeg/mtk_jpeg_dec_hw.c | 315 ++++++++++-
.../platform/mediatek/jpeg/mtk_jpeg_dec_hw.h | 6 +-
.../platform/mediatek/jpeg/mtk_jpeg_dec_reg.h | 1 +
.../platform/mediatek/jpeg/mtk_jpeg_enc_hw.c | 255 +++++++++
9 files changed, 1483 insertions(+), 83 deletions(-)
create mode 100644 Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml
create mode 100644 Documentation/devicetree/bindings/media/mediatek,mt8195-jpegenc.yaml
--
2.18.0
From: kyrie wu <[email protected]>
There are two HWs in mt8195. Since the two HWs run
in parallel, it is necessary to reorder the output images
to ensure that the order is consistent with the input images.
Signed-off-by: kyrie wu <[email protected]>
Signed-off-by: irui wang <[email protected]>
---
.../platform/mediatek/jpeg/mtk_jpeg_core.c | 11 +----
.../platform/mediatek/jpeg/mtk_jpeg_core.h | 43 ++++++++++++-----
.../platform/mediatek/jpeg/mtk_jpeg_dec_hw.c | 1 +
.../platform/mediatek/jpeg/mtk_jpeg_dec_hw.h | 3 +-
.../platform/mediatek/jpeg/mtk_jpeg_enc_hw.c | 47 ++++++++++++++++++-
5 files changed, 81 insertions(+), 24 deletions(-)
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
index 43fc5e9dae9d..0d4e7220e509 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
@@ -111,15 +111,6 @@ enum {
MTK_JPEG_BUF_FLAGS_LAST_FRAME = 1,
};
-struct mtk_jpeg_src_buf {
- u32 frame_num;
- struct vb2_v4l2_buffer b;
- struct list_head list;
- struct mtk_jpeg_dec_param dec_param;
-
- struct mtk_jpeg_ctx *curr_ctx;
-};
-
static int debug;
module_param(debug, int, 0644);
@@ -1377,6 +1368,8 @@ static int mtk_jpeg_open(struct file *file)
if (jpeg->is_jpgenc_multihw)
INIT_WORK(&ctx->jpeg_work, mtk_jpegenc_worker);
+ INIT_LIST_HEAD(&ctx->dst_done_queue);
+ spin_lock_init(&ctx->done_queue_lock);
v4l2_fh_init(&ctx->fh, vfd);
file->private_data = &ctx->fh;
v4l2_fh_add(&ctx->fh);
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
index cbc6fbc21681..0f69402ffce6 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
@@ -14,10 +14,11 @@
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/v4l2-fh.h>
+#include <media/videobuf2-v4l2.h>
-#define MTK_JPEG_NAME "mtk-jpeg"
+#include "mtk_jpeg_dec_hw.h"
-#define MTK_JPEG_COMP_MAX 3
+#define MTK_JPEG_NAME "mtk-jpeg"
#define MTK_JPEG_FMT_FLAG_OUTPUT BIT(0)
#define MTK_JPEG_FMT_FLAG_CAPTURE BIT(1)
@@ -75,6 +76,15 @@ struct mtk_jpeg_variant {
u32 cap_q_default_fourcc;
};
+struct mtk_jpeg_src_buf {
+ u32 frame_num;
+ struct vb2_v4l2_buffer b;
+ struct list_head list;
+ struct mtk_jpeg_dec_param dec_param;
+
+ struct mtk_jpeg_ctx *curr_ctx;
+};
+
enum mtk_jpeg_hw_state {
MTK_JPEG_HW_IDLE = 0,
MTK_JPEG_HW_BUSY = 1,
@@ -205,17 +215,20 @@ struct mtk_jpeg_q_data {
/**
* struct mtk_jpeg_ctx - the device context data
- * @jpeg: JPEG IP device for this context
- * @out_q: source (output) queue information
- * @cap_q: destination (capture) queue queue information
- * @fh: V4L2 file handle
- * @state: state of the context
- * @enable_exif: enable exif mode of jpeg encoder
- * @enc_quality: jpeg encoder quality
- * @restart_interval: jpeg encoder restart interval
- * @ctrl_hdl: controls handler
- * @jpeg_work: jpeg encoder workqueue
- * @total_frame_num: encoded frame number
+ * @jpeg: JPEG IP device for this context
+ * @out_q: source (output) queue information
+ * @cap_q: destination queue information
+ * @fh: V4L2 file handle
+ * @state: state of the context
+ * @enable_exif: enable exif mode of jpeg encoder
+ * @enc_quality: jpeg encoder quality
+ * @restart_interval: jpeg encoder restart interval
+ * @ctrl_hdl: controls handler
+ * @jpeg_work: jpeg encoder workqueue
+ * @total_frame_num: encoded frame number
+ * @dst_done_queue: encoded frame buffer queue
+ * @done_queue_lock: encoded frame operation spinlock
+ * @last_done_frame_num: the last encoded frame number
*/
struct mtk_jpeg_ctx {
struct mtk_jpeg_dev *jpeg;
@@ -230,6 +243,10 @@ struct mtk_jpeg_ctx {
struct work_struct jpeg_work;
u32 total_frame_num;
+ struct list_head dst_done_queue;
+ /* spinlock protecting the encode done buffer */
+ spinlock_t done_queue_lock;
+ u32 last_done_frame_num;
};
#endif /* _MTK_JPEG_CORE_H */
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c
index afbbfd5d02bc..1e3852295f2f 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c
@@ -9,6 +9,7 @@
#include <linux/kernel.h>
#include <media/videobuf2-core.h>
+#include "mtk_jpeg_core.h"
#include "mtk_jpeg_dec_hw.h"
#define MTK_JPEG_DUNUM_MASK(val) (((val) - 1) & 0x3)
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.h b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.h
index fa0d45fd7c34..87aaa5c9082b 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.h
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.h
@@ -11,9 +11,10 @@
#include <media/videobuf2-core.h>
-#include "mtk_jpeg_core.h"
#include "mtk_jpeg_dec_reg.h"
+#define MTK_JPEG_COMP_MAX 3
+
enum {
MTK_JPEG_DEC_RESULT_EOF_DONE = 0,
MTK_JPEG_DEC_RESULT_PAUSE = 1,
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
index 02d6c4993653..1bbb712d78d0 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
@@ -185,6 +185,50 @@ 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_put_buf(struct mtk_jpegenc_comp_dev *jpeg)
+{
+ struct mtk_jpeg_ctx *ctx;
+ struct vb2_v4l2_buffer *dst_buffer;
+ struct list_head *temp_entry;
+ struct list_head *pos = NULL;
+ struct mtk_jpeg_src_buf *dst_done_buf, *tmp_dst_done_buf;
+ unsigned long flags;
+
+ ctx = jpeg->hw_param.curr_ctx;
+ if (!ctx) {
+ dev_err(jpeg->dev, "comp_jpeg ctx fail !!!\n");
+ return;
+ }
+
+ dst_buffer = jpeg->hw_param.dst_buffer;
+ if (!dst_buffer) {
+ dev_err(jpeg->dev, "comp_jpeg dst_buffer fail !!!\n");
+ return;
+ }
+
+ dst_done_buf = container_of(dst_buffer,
+ struct mtk_jpeg_src_buf, b);
+
+ spin_lock_irqsave(&ctx->done_queue_lock, flags);
+ list_add_tail(&dst_done_buf->list, &ctx->dst_done_queue);
+ while (!list_empty(&ctx->dst_done_queue) &&
+ (pos != &ctx->dst_done_queue)) {
+ list_for_each_prev_safe(pos, temp_entry, &ctx->dst_done_queue) {
+ tmp_dst_done_buf = list_entry(pos,
+ struct mtk_jpeg_src_buf,
+ list);
+ if (tmp_dst_done_buf->frame_num ==
+ ctx->last_done_frame_num) {
+ list_del(&tmp_dst_done_buf->list);
+ v4l2_m2m_buf_done(&tmp_dst_done_buf->b,
+ VB2_BUF_STATE_DONE);
+ ctx->last_done_frame_num++;
+ }
+ }
+ }
+ spin_unlock_irqrestore(&ctx->done_queue_lock, flags);
+}
+
static void mtk_jpegenc_timeout_work(struct work_struct *work)
{
struct delayed_work *dly_work = to_delayed_work(work);
@@ -207,6 +251,7 @@ static void mtk_jpegenc_timeout_work(struct work_struct *work)
atomic_inc(&master_jpeg->enchw_rdy);
wake_up(&master_jpeg->enc_hw_wq);
v4l2_m2m_buf_done(src_buf, buf_state);
+ mtk_jpegenc_put_buf(cjpeg);
}
static irqreturn_t mtk_jpegenc_hw_irq_handler(int irq, void *priv)
@@ -238,7 +283,7 @@ static irqreturn_t mtk_jpegenc_hw_irq_handler(int irq, void *priv)
vb2_set_plane_payload(&dst_buf->vb2_buf, 0, result_size);
buf_state = VB2_BUF_STATE_DONE;
v4l2_m2m_buf_done(src_buf, buf_state);
- v4l2_m2m_buf_done(dst_buf, buf_state);
+ mtk_jpegenc_put_buf(jpeg);
pm_runtime_put(ctx->jpeg->dev);
clk_disable_unprepare(jpeg->venc_clk.clks->clk);
if (!list_empty(&ctx->fh.m2m_ctx->out_q_ctx.rdy_queue) ||
--
2.18.0
From: kyrie wu <[email protected]>
Add jpeg encoding worker to ensure that two HWs
run in parallel in MT8195.
Signed-off-by: kyrie wu <[email protected]>
Signed-off-by: irui wang <[email protected]>
---
.../platform/mediatek/jpeg/mtk_jpeg_core.c | 183 +++++++++++++++++-
.../platform/mediatek/jpeg/mtk_jpeg_core.h | 20 ++
.../platform/mediatek/jpeg/mtk_jpeg_enc_hw.c | 42 ++--
3 files changed, 232 insertions(+), 13 deletions(-)
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
index 2de2e3846b5b..43fc5e9dae9d 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
@@ -104,11 +104,20 @@ static struct mtk_jpeg_fmt mtk_jpeg_dec_formats[] = {
#define MTK_JPEG_ENC_NUM_FORMATS ARRAY_SIZE(mtk_jpeg_enc_formats)
#define MTK_JPEG_DEC_NUM_FORMATS ARRAY_SIZE(mtk_jpeg_dec_formats)
+#define MTK_JPEG_MAX_RETRY_TIME 5000
+
+enum {
+ MTK_JPEG_BUF_FLAGS_INIT = 0,
+ MTK_JPEG_BUF_FLAGS_LAST_FRAME = 1,
+};
struct mtk_jpeg_src_buf {
+ u32 frame_num;
struct vb2_v4l2_buffer b;
struct list_head list;
struct mtk_jpeg_dec_param dec_param;
+
+ struct mtk_jpeg_ctx *curr_ctx;
};
static int debug;
@@ -907,6 +916,148 @@ static int mtk_jpeg_set_dec_dst(struct mtk_jpeg_ctx *ctx,
return 0;
}
+static int mtk_jpegenc_get_hw(struct mtk_jpeg_ctx *ctx)
+{
+ struct mtk_jpegenc_comp_dev *comp_jpeg;
+ struct mtk_jpeg_dev *jpeg = ctx->jpeg;
+ unsigned long flags;
+ int hw_id = -1;
+ int i;
+
+ spin_lock_irqsave(&jpeg->hw_lock, flags);
+ for (i = 0; i < MTK_JPEGENC_HW_MAX; i++) {
+ comp_jpeg = jpeg->enc_hw_dev[i];
+ if (comp_jpeg->hw_state == MTK_JPEG_HW_IDLE) {
+ hw_id = i;
+ comp_jpeg->hw_state = MTK_JPEG_HW_BUSY;
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&jpeg->hw_lock, flags);
+
+ return hw_id;
+}
+
+static int mtk_jpegenc_set_hw_param(struct mtk_jpeg_ctx *ctx,
+ int hw_id,
+ struct vb2_v4l2_buffer *src_buf,
+ struct vb2_v4l2_buffer *dst_buf)
+{
+ struct mtk_jpegenc_comp_dev *jpeg = ctx->jpeg->enc_hw_dev[hw_id];
+
+ jpeg->hw_param.curr_ctx = ctx;
+ jpeg->hw_param.src_buffer = src_buf;
+ jpeg->hw_param.dst_buffer = dst_buf;
+
+ return 0;
+}
+
+static int mtk_jpegenc_put_hw(struct mtk_jpeg_dev *jpeg, int hw_id)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&jpeg->hw_lock, flags);
+ jpeg->enc_hw_dev[hw_id]->hw_state = MTK_JPEG_HW_IDLE;
+ spin_unlock_irqrestore(&jpeg->hw_lock, flags);
+
+ return 0;
+}
+
+static void mtk_jpegenc_worker(struct work_struct *work)
+{
+ struct mtk_jpegenc_comp_dev *comp_jpeg[MTK_JPEGENC_HW_MAX];
+ enum vb2_buffer_state buf_state = VB2_BUF_STATE_ERROR;
+ struct mtk_jpeg_src_buf *jpeg_dst_buf;
+ struct vb2_v4l2_buffer *src_buf, *dst_buf;
+ int ret, i, hw_id = 0;
+ unsigned long flags;
+
+ struct mtk_jpeg_ctx *ctx = container_of(work,
+ struct mtk_jpeg_ctx,
+ jpeg_work);
+ struct mtk_jpeg_dev *jpeg = ctx->jpeg;
+
+ for (i = 0; i < MTK_JPEGENC_HW_MAX; i++)
+ comp_jpeg[i] = jpeg->enc_hw_dev[i];
+ i = 0;
+
+retry_select:
+ hw_id = mtk_jpegenc_get_hw(ctx);
+ if (hw_id < 0) {
+ ret = wait_event_interruptible(jpeg->enc_hw_wq,
+ atomic_read(&jpeg->enchw_rdy) > 0);
+ if (ret != 0 || (i++ > MTK_JPEG_MAX_RETRY_TIME)) {
+ dev_err(jpeg->dev, "%s : %d, all HW are busy\n",
+ __func__, __LINE__);
+ v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
+ return;
+ }
+
+ goto retry_select;
+ }
+
+ atomic_dec(&jpeg->enchw_rdy);
+ src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
+ if (!src_buf)
+ goto getbuf_fail;
+
+ dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
+ if (!dst_buf)
+ goto getbuf_fail;
+
+ v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
+ v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
+
+ v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, true);
+
+ mtk_jpegenc_set_hw_param(ctx, hw_id, src_buf, dst_buf);
+ ret = pm_runtime_get_sync(comp_jpeg[hw_id]->dev);
+ if (ret < 0) {
+ dev_err(jpeg->dev, "%s : %d, pm_runtime_get_sync fail !!!\n",
+ __func__, __LINE__);
+ goto enc_end;
+ }
+
+ ret = clk_prepare_enable(comp_jpeg[hw_id]->venc_clk.clks->clk);
+ if (ret) {
+ dev_err(jpeg->dev, "%s : %d, jpegenc clk_prepare_enable fail\n",
+ __func__, __LINE__);
+ goto enc_end;
+ }
+
+ schedule_delayed_work(&comp_jpeg[hw_id]->job_timeout_work,
+ msecs_to_jiffies(MTK_JPEG_HW_TIMEOUT_MSEC));
+
+ spin_lock_irqsave(&comp_jpeg[hw_id]->hw_lock, flags);
+ jpeg_dst_buf = mtk_jpeg_vb2_to_srcbuf(&dst_buf->vb2_buf);
+ jpeg_dst_buf->curr_ctx = ctx;
+ jpeg_dst_buf->frame_num = ctx->total_frame_num;
+ ctx->total_frame_num++;
+ mtk_jpeg_enc_reset(comp_jpeg[hw_id]->reg_base);
+ mtk_jpeg_set_enc_dst(ctx,
+ comp_jpeg[hw_id]->reg_base,
+ &dst_buf->vb2_buf);
+ mtk_jpeg_set_enc_src(ctx,
+ comp_jpeg[hw_id]->reg_base,
+ &src_buf->vb2_buf);
+ mtk_jpeg_set_enc_params(ctx, comp_jpeg[hw_id]->reg_base);
+ mtk_jpeg_enc_start(comp_jpeg[hw_id]->reg_base);
+ v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
+ spin_unlock_irqrestore(&comp_jpeg[hw_id]->hw_lock, flags);
+
+ return;
+
+enc_end:
+ v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
+ v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
+ v4l2_m2m_buf_done(src_buf, buf_state);
+ v4l2_m2m_buf_done(dst_buf, buf_state);
+getbuf_fail:
+ atomic_inc(&jpeg->enchw_rdy);
+ mtk_jpegenc_put_hw(jpeg, hw_id);
+ v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
+}
+
static void mtk_jpeg_enc_device_run(void *priv)
{
struct mtk_jpeg_ctx *ctx = priv;
@@ -924,7 +1075,7 @@ static void mtk_jpeg_enc_device_run(void *priv)
goto enc_end;
schedule_delayed_work(&jpeg->job_timeout_work,
- msecs_to_jiffies(MTK_JPEG_HW_TIMEOUT_MSEC));
+ msecs_to_jiffies(MTK_JPEG_HW_TIMEOUT_MSEC));
spin_lock_irqsave(&jpeg->hw_lock, flags);
@@ -949,6 +1100,14 @@ static void mtk_jpeg_enc_device_run(void *priv)
v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
}
+static void mtk_jpeg_multicore_enc_device_run(void *priv)
+{
+ struct mtk_jpeg_ctx *ctx = priv;
+ struct mtk_jpeg_dev *jpeg = ctx->jpeg;
+
+ queue_work(jpeg->workqueue, &ctx->jpeg_work);
+}
+
static void mtk_jpeg_dec_device_run(void *priv)
{
struct mtk_jpeg_ctx *ctx = priv;
@@ -1011,6 +1170,10 @@ static const struct v4l2_m2m_ops mtk_jpeg_enc_m2m_ops = {
.device_run = mtk_jpeg_enc_device_run,
};
+static const struct v4l2_m2m_ops mtk_jpeg_multicore_enc_m2m_ops = {
+ .device_run = mtk_jpeg_multicore_enc_device_run,
+};
+
static const struct v4l2_m2m_ops mtk_jpeg_dec_m2m_ops = {
.device_run = mtk_jpeg_dec_device_run,
.job_ready = mtk_jpeg_dec_job_ready,
@@ -1211,6 +1374,9 @@ static int mtk_jpeg_open(struct file *file)
goto free;
}
+ if (jpeg->is_jpgenc_multihw)
+ INIT_WORK(&ctx->jpeg_work, mtk_jpegenc_worker);
+
v4l2_fh_init(&ctx->fh, vfd);
file->private_data = &ctx->fh;
v4l2_fh_add(&ctx->fh);
@@ -1504,6 +1670,17 @@ static const struct mtk_jpeg_variant mtk_jpeg_drvdata = {
.cap_q_default_fourcc = V4L2_PIX_FMT_JPEG,
};
+static struct mtk_jpeg_variant mtk8195_jpegenc_drvdata = {
+ .formats = mtk_jpeg_enc_formats,
+ .num_formats = MTK_JPEG_ENC_NUM_FORMATS,
+ .qops = &mtk_jpeg_enc_qops,
+ .m2m_ops = &mtk_jpeg_multicore_enc_m2m_ops,
+ .dev_name = "mtk-jpeg-enc",
+ .ioctl_ops = &mtk_jpeg_enc_ioctl_ops,
+ .out_q_default_fourcc = V4L2_PIX_FMT_YUYV,
+ .cap_q_default_fourcc = V4L2_PIX_FMT_JPEG,
+};
+
#if defined(CONFIG_OF)
static const struct of_device_id mtk_jpeg_match[] = {
{
@@ -1518,6 +1695,10 @@ static const struct of_device_id mtk_jpeg_match[] = {
.compatible = "mediatek,mtk-jpgenc",
.data = &mtk_jpeg_drvdata,
},
+ {
+ .compatible = "mediatek,mt8195-jpgenc",
+ .data = &mtk8195_jpegenc_drvdata,
+ },
{},
};
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
index 98de83c9ea4c..cbc6fbc21681 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
@@ -75,6 +75,11 @@ struct mtk_jpeg_variant {
u32 cap_q_default_fourcc;
};
+enum mtk_jpeg_hw_state {
+ MTK_JPEG_HW_IDLE = 0,
+ MTK_JPEG_HW_BUSY = 1,
+};
+
struct mtk_jpeg_hw_param {
struct vb2_v4l2_buffer *src_buffer;
struct vb2_v4l2_buffer *dst_buffer;
@@ -107,6 +112,9 @@ struct mtk_jpegenc_clk {
* @jpegenc_irq: jpeg encode irq num
* @job_timeout_work: encode timeout workqueue
* @hw_param: jpeg encode hw parameters
+ * @hw_rdy: record hw ready
+ * @hw_state: record hw state
+ * @hw_lock: spinlock protecting the hw device resource
*/
struct mtk_jpegenc_comp_dev {
struct device *dev;
@@ -117,6 +125,9 @@ struct mtk_jpegenc_comp_dev {
int jpegenc_irq;
struct delayed_work job_timeout_work;
struct mtk_jpeg_hw_param hw_param;
+ enum mtk_jpeg_hw_state hw_state;
+ /* spinlock protecting the hw device resource */
+ spinlock_t hw_lock;
};
/**
@@ -135,6 +146,8 @@ struct mtk_jpegenc_comp_dev {
* @reg_encbase: jpg encode register base addr
* @enc_hw_dev: jpg encode hardware device
* @is_jpgenc_multihw: the flag of multi-hw core
+ * @enc_hw_wq: jpg encode wait queue
+ * @enchw_rdy: jpg encode hw ready flag
*/
struct mtk_jpeg_dev {
struct mutex lock;
@@ -152,6 +165,8 @@ struct mtk_jpeg_dev {
void __iomem *reg_encbase[MTK_JPEGENC_HW_MAX];
struct mtk_jpegenc_comp_dev *enc_hw_dev[MTK_JPEGENC_HW_MAX];
bool is_jpgenc_multihw;
+ wait_queue_head_t enc_hw_wq;
+ atomic_t enchw_rdy;
};
/**
@@ -199,6 +214,8 @@ struct mtk_jpeg_q_data {
* @enc_quality: jpeg encoder quality
* @restart_interval: jpeg encoder restart interval
* @ctrl_hdl: controls handler
+ * @jpeg_work: jpeg encoder workqueue
+ * @total_frame_num: encoded frame number
*/
struct mtk_jpeg_ctx {
struct mtk_jpeg_dev *jpeg;
@@ -210,6 +227,9 @@ struct mtk_jpeg_ctx {
u8 enc_quality;
u8 restart_interval;
struct v4l2_ctrl_handler ctrl_hdl;
+
+ struct work_struct jpeg_work;
+ u32 total_frame_num;
};
#endif /* _MTK_JPEG_CORE_H */
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
index 95812f60ab9f..02d6c4993653 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
@@ -192,6 +192,7 @@ static void mtk_jpegenc_timeout_work(struct work_struct *work)
container_of(dly_work,
struct mtk_jpegenc_comp_dev,
job_timeout_work);
+ struct mtk_jpeg_dev *master_jpeg = cjpeg->master_dev;
enum vb2_buffer_state buf_state = VB2_BUF_STATE_ERROR;
struct vb2_v4l2_buffer *src_buf, *dst_buf;
@@ -202,6 +203,9 @@ static void mtk_jpegenc_timeout_work(struct work_struct *work)
mtk_jpeg_enc_reset(cjpeg->reg_base);
clk_disable_unprepare(cjpeg->venc_clk.clks->clk);
pm_runtime_put(cjpeg->dev);
+ cjpeg->hw_state = MTK_JPEG_HW_IDLE;
+ atomic_inc(&master_jpeg->enchw_rdy);
+ wake_up(&master_jpeg->enc_hw_wq);
v4l2_m2m_buf_done(src_buf, buf_state);
}
@@ -218,30 +222,33 @@ static irqreturn_t mtk_jpegenc_hw_irq_handler(int irq, void *priv)
cancel_delayed_work(&jpeg->job_timeout_work);
+ ctx = jpeg->hw_param.curr_ctx;
+ src_buf = jpeg->hw_param.src_buffer;
+ dst_buf = jpeg->hw_param.dst_buffer;
+ v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, true);
+
irq_status = readl(jpeg->reg_base + JPEG_ENC_INT_STS) &
JPEG_ENC_INT_STATUS_MASK_ALLIRQ;
if (irq_status)
writel(0, jpeg->reg_base + JPEG_ENC_INT_STS);
if (!(irq_status & JPEG_ENC_INT_STATUS_DONE))
- return IRQ_NONE;
-
- ctx = v4l2_m2m_get_curr_priv(master_jpeg->m2m_dev);
- if (!ctx) {
- v4l2_err(&master_jpeg->v4l2_dev, "Context is NULL\n");
- return IRQ_HANDLED;
- }
-
- src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
- dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
- v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, true);
+ dev_warn(jpeg->dev, "Jpg Enc occurs unknown Err.");
result_size = mtk_jpeg_enc_get_file_size(jpeg->reg_base);
vb2_set_plane_payload(&dst_buf->vb2_buf, 0, result_size);
buf_state = VB2_BUF_STATE_DONE;
v4l2_m2m_buf_done(src_buf, buf_state);
v4l2_m2m_buf_done(dst_buf, buf_state);
- v4l2_m2m_job_finish(master_jpeg->m2m_dev, ctx->fh.m2m_ctx);
pm_runtime_put(ctx->jpeg->dev);
+ clk_disable_unprepare(jpeg->venc_clk.clks->clk);
+ if (!list_empty(&ctx->fh.m2m_ctx->out_q_ctx.rdy_queue) ||
+ !list_empty(&ctx->fh.m2m_ctx->cap_q_ctx.rdy_queue)) {
+ queue_work(master_jpeg->workqueue, &ctx->jpeg_work);
+ }
+
+ jpeg->hw_state = MTK_JPEG_HW_IDLE;
+ wake_up(&master_jpeg->enc_hw_wq);
+ atomic_inc(&master_jpeg->enchw_rdy);
return IRQ_HANDLED;
}
@@ -296,8 +303,19 @@ static int mtk_jpegenc_hw_probe(struct platform_device *pdev)
master_dev->is_jpgenc_multihw = true;
for (i = 0; i < MTK_JPEGENC_HW_MAX; i++)
master_dev->enc_hw_dev[i] = NULL;
+
+ init_waitqueue_head(&master_dev->enc_hw_wq);
+ master_dev->workqueue = alloc_ordered_workqueue(MTK_JPEG_NAME,
+ WQ_MEM_RECLAIM
+ | WQ_FREEZABLE);
+ if (!master_dev->workqueue)
+ return -EINVAL;
}
+ atomic_set(&master_dev->enchw_rdy, MTK_JPEGENC_HW_MAX);
+ spin_lock_init(&dev->hw_lock);
+ dev->hw_state = MTK_JPEG_HW_IDLE;
+
INIT_DELAYED_WORK(&dev->job_timeout_work,
mtk_jpegenc_timeout_work);
--
2.18.0
From: kyrie wu <[email protected]>
support jpeg encode multi-hardware includes HW0 and HW1.
Signed-off-by: kyrie wu <[email protected]>
Signed-off-by: irui wang <[email protected]>
Reported-by: kernel test robot <[email protected]>
---
drivers/media/platform/mediatek/jpeg/Makefile | 11 +-
.../platform/mediatek/jpeg/mtk_jpeg_core.c | 69 ++++----
.../platform/mediatek/jpeg/mtk_jpeg_core.h | 42 +++++
.../platform/mediatek/jpeg/mtk_jpeg_enc_hw.c | 160 ++++++++++++++++++
4 files changed, 248 insertions(+), 34 deletions(-)
diff --git a/drivers/media/platform/mediatek/jpeg/Makefile b/drivers/media/platform/mediatek/jpeg/Makefile
index 76c33aad0f3f..69703db4b0a5 100644
--- a/drivers/media/platform/mediatek/jpeg/Makefile
+++ b/drivers/media/platform/mediatek/jpeg/Makefile
@@ -1,6 +1,9 @@
# SPDX-License-Identifier: GPL-2.0-only
-mtk_jpeg-objs := mtk_jpeg_core.o \
+obj-$(CONFIG_VIDEO_MEDIATEK_JPEG) += mtk_jpeg.o \
+ mtk-jpeg-enc-hw.o
+
+mtk_jpeg-y := mtk_jpeg_core.o \
mtk_jpeg_dec_hw.o \
- mtk_jpeg_dec_parse.o \
- mtk_jpeg_enc_hw.o
-obj-$(CONFIG_VIDEO_MEDIATEK_JPEG) += mtk_jpeg.o
+ mtk_jpeg_dec_parse.o
+
+mtk-jpeg-enc-hw-y := mtk_jpeg_enc_hw.o
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
index 724fb7aeb0ee..2de2e3846b5b 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
@@ -680,7 +680,7 @@ static int mtk_jpeg_buf_prepare(struct vb2_buffer *vb)
{
struct mtk_jpeg_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
struct mtk_jpeg_q_data *q_data = NULL;
- struct v4l2_plane_pix_format plane_fmt;
+ struct v4l2_plane_pix_format plane_fmt = {};
int i;
q_data = mtk_jpeg_get_q_data(ctx, vb->vb2_queue->type);
@@ -1312,38 +1312,51 @@ static int mtk_jpeg_probe(struct platform_device *pdev)
spin_lock_init(&jpeg->hw_lock);
jpeg->dev = &pdev->dev;
jpeg->variant = of_device_get_match_data(jpeg->dev);
- INIT_DELAYED_WORK(&jpeg->job_timeout_work, mtk_jpeg_job_timeout_work);
- jpeg->reg_base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(jpeg->reg_base)) {
- ret = PTR_ERR(jpeg->reg_base);
- return ret;
+ ret = devm_of_platform_populate(&pdev->dev);
+ if (ret) {
+ v4l2_err(&jpeg->v4l2_dev, "Master of platform populate failed.");
+ return -EINVAL;
}
- jpeg_irq = platform_get_irq(pdev, 0);
- if (jpeg_irq < 0)
- return jpeg_irq;
+ if (list_empty(&pdev->dev.devres_head)) {
+ INIT_DELAYED_WORK(&jpeg->job_timeout_work,
+ mtk_jpeg_job_timeout_work);
- ret = devm_request_irq(&pdev->dev, jpeg_irq,
- jpeg->variant->irq_handler, 0, pdev->name, jpeg);
- if (ret) {
- dev_err(&pdev->dev, "Failed to request jpeg_irq %d (%d)\n",
- jpeg_irq, ret);
- goto err_req_irq;
- }
+ jpeg->reg_base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(jpeg->reg_base)) {
+ ret = PTR_ERR(jpeg->reg_base);
+ return ret;
+ }
- ret = devm_clk_bulk_get(jpeg->dev, jpeg->variant->num_clks,
- jpeg->variant->clks);
- if (ret) {
- dev_err(&pdev->dev, "Failed to init clk, err %d\n", ret);
- goto err_clk_init;
+ jpeg_irq = platform_get_irq(pdev, 0);
+ if (jpeg_irq < 0)
+ return jpeg_irq;
+
+ ret = devm_request_irq(&pdev->dev,
+ jpeg_irq,
+ jpeg->variant->irq_handler,
+ 0,
+ pdev->name, jpeg);
+ if (ret) {
+ dev_err(&pdev->dev, "Failed to request jpeg_irq %d (%d)\n",
+ jpeg_irq, ret);
+ return ret;
+ }
+
+ ret = devm_clk_bulk_get(jpeg->dev,
+ jpeg->variant->num_clks,
+ jpeg->variant->clks);
+ if (ret) {
+ dev_err(&pdev->dev, "Failed to init clk\n");
+ return ret;
+ }
}
ret = v4l2_device_register(&pdev->dev, &jpeg->v4l2_dev);
if (ret) {
dev_err(&pdev->dev, "Failed to register v4l2 device\n");
- ret = -EINVAL;
- goto err_dev_register;
+ return -EINVAL;
}
jpeg->m2m_dev = v4l2_m2m_init(jpeg->variant->m2m_ops);
@@ -1401,12 +1414,6 @@ static int mtk_jpeg_probe(struct platform_device *pdev)
err_m2m_init:
v4l2_device_unregister(&jpeg->v4l2_dev);
-err_dev_register:
-
-err_clk_init:
-
-err_req_irq:
-
return ret;
}
@@ -1497,6 +1504,7 @@ static const struct mtk_jpeg_variant mtk_jpeg_drvdata = {
.cap_q_default_fourcc = V4L2_PIX_FMT_JPEG,
};
+#if defined(CONFIG_OF)
static const struct of_device_id mtk_jpeg_match[] = {
{
.compatible = "mediatek,mt8173-jpgdec",
@@ -1514,13 +1522,14 @@ static const struct of_device_id mtk_jpeg_match[] = {
};
MODULE_DEVICE_TABLE(of, mtk_jpeg_match);
+#endif
static struct platform_driver mtk_jpeg_driver = {
.probe = mtk_jpeg_probe,
.remove = mtk_jpeg_remove,
.driver = {
.name = MTK_JPEG_NAME,
- .of_match_table = mtk_jpeg_match,
+ .of_match_table = of_match_ptr(mtk_jpeg_match),
.pm = &mtk_jpeg_pm_ops,
},
};
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
index 3e4811a41ba2..1e0ba466303b 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
@@ -9,6 +9,7 @@
#ifndef _MTK_JPEG_CORE_H
#define _MTK_JPEG_CORE_H
+#include <linux/clk.h>
#include <linux/interrupt.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
@@ -74,6 +75,40 @@ struct mtk_jpeg_variant {
u32 cap_q_default_fourcc;
};
+enum mtk_jpegenc_hw_id {
+ MTK_JPEGENC_HW0,
+ MTK_JPEGENC_HW1,
+ MTK_JPEGENC_HW_MAX,
+};
+
+/**
+ * struct mtk_jpegenc_clk - Structure used to store vcodec clock information
+ * @clks: JPEG encode clock
+ * @clk_num: JPEG encode clock numbers
+ */
+struct mtk_jpegenc_clk {
+ struct clk_bulk_data *clks;
+ int clk_num;
+};
+
+/**
+ * struct mtk_jpegenc_comp_dev - JPEG COREX abstraction
+ * @dev: JPEG device
+ * @plat_dev: platform device data
+ * @reg_base: JPEG registers mapping
+ * @master_dev: mtk_jpeg_dev device
+ * @venc_clk: jpeg encode clock
+ * @jpegenc_irq: jpeg encode irq num
+ */
+struct mtk_jpegenc_comp_dev {
+ struct device *dev;
+ struct platform_device *plat_dev;
+ void __iomem *reg_base;
+ struct mtk_jpeg_dev *master_dev;
+ struct mtk_jpegenc_clk venc_clk;
+ int jpegenc_irq;
+};
+
/**
* struct mtk_jpeg_dev - JPEG IP abstraction
* @lock: the mutex protecting this structure
@@ -87,6 +122,9 @@ struct mtk_jpeg_variant {
* @reg_base: JPEG registers mapping
* @job_timeout_work: IRQ timeout structure
* @variant: driver variant to be used
+ * @reg_encbase: jpg encode register base addr
+ * @enc_hw_dev: jpg encode hardware device
+ * @is_jpgenc_multihw: the flag of multi-hw core
*/
struct mtk_jpeg_dev {
struct mutex lock;
@@ -100,6 +138,10 @@ struct mtk_jpeg_dev {
void __iomem *reg_base;
struct delayed_work job_timeout_work;
const struct mtk_jpeg_variant *variant;
+
+ void __iomem *reg_encbase[MTK_JPEGENC_HW_MAX];
+ struct mtk_jpegenc_comp_dev *enc_hw_dev[MTK_JPEGENC_HW_MAX];
+ bool is_jpgenc_multihw;
};
/**
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
index a2b6e1f85c2d..3dcf83d6d95e 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
@@ -5,11 +5,27 @@
*
*/
+#include <linux/clk.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
#include <linux/io.h>
#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/slab.h>
+#include <media/media-device.h>
#include <media/videobuf2-core.h>
#include <media/videobuf2-dma-contig.h>
+#include <media/videobuf2-v4l2.h>
+#include <media/v4l2-mem2mem.h>
+#include <media/v4l2-dev.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-fh.h>
+#include <media/v4l2-event.h>
+#include "mtk_jpeg_core.h"
#include "mtk_jpeg_enc_hw.h"
static const struct mtk_jpeg_enc_qlt mtk_jpeg_enc_quality[] = {
@@ -30,6 +46,16 @@ static const struct mtk_jpeg_enc_qlt mtk_jpeg_enc_quality[] = {
{.quality_param = 97, .hardware_value = JPEG_ENC_QUALITY_Q97},
};
+#if defined(CONFIG_OF)
+static const struct of_device_id mtk_jpegenc_drv_ids[] = {
+ {
+ .compatible = "mediatek,mt8195-jpgenc-hw",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, mtk_jpegenc_drv_ids);
+#endif
+
void mtk_jpeg_enc_reset(void __iomem *base)
{
writel(0, base + JPEG_ENC_RSTB);
@@ -159,3 +185,137 @@ void mtk_jpeg_set_enc_params(struct mtk_jpeg_ctx *ctx, void __iomem *base)
}
EXPORT_SYMBOL_GPL(mtk_jpeg_set_enc_params);
+static irqreturn_t mtk_jpegenc_hw_irq_handler(int irq, void *priv)
+{
+ struct vb2_v4l2_buffer *src_buf, *dst_buf;
+ enum vb2_buffer_state buf_state;
+ struct mtk_jpeg_ctx *ctx;
+ u32 result_size;
+ u32 irq_status;
+
+ struct mtk_jpegenc_comp_dev *jpeg = priv;
+ struct mtk_jpeg_dev *master_jpeg = jpeg->master_dev;
+
+ irq_status = readl(jpeg->reg_base + JPEG_ENC_INT_STS) &
+ JPEG_ENC_INT_STATUS_MASK_ALLIRQ;
+ if (irq_status)
+ writel(0, jpeg->reg_base + JPEG_ENC_INT_STS);
+ if (!(irq_status & JPEG_ENC_INT_STATUS_DONE))
+ return IRQ_NONE;
+
+ ctx = v4l2_m2m_get_curr_priv(master_jpeg->m2m_dev);
+ if (!ctx) {
+ v4l2_err(&master_jpeg->v4l2_dev, "Context is NULL\n");
+ return IRQ_HANDLED;
+ }
+
+ src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
+ dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
+ v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, true);
+
+ result_size = mtk_jpeg_enc_get_file_size(jpeg->reg_base);
+ vb2_set_plane_payload(&dst_buf->vb2_buf, 0, result_size);
+ buf_state = VB2_BUF_STATE_DONE;
+ v4l2_m2m_buf_done(src_buf, buf_state);
+ v4l2_m2m_buf_done(dst_buf, buf_state);
+ v4l2_m2m_job_finish(master_jpeg->m2m_dev, ctx->fh.m2m_ctx);
+ pm_runtime_put(ctx->jpeg->dev);
+
+ return IRQ_HANDLED;
+}
+
+static int mtk_jpegenc_hw_init_irq(struct mtk_jpegenc_comp_dev *dev)
+{
+ struct platform_device *pdev = dev->plat_dev;
+ int ret;
+
+ dev->jpegenc_irq = platform_get_irq(pdev, 0);
+ if (dev->jpegenc_irq < 0)
+ return dev->jpegenc_irq;
+
+ ret = devm_request_irq(&pdev->dev,
+ dev->jpegenc_irq,
+ mtk_jpegenc_hw_irq_handler,
+ 0,
+ pdev->name, dev);
+ if (ret) {
+ dev_err(&pdev->dev, "Failed to devm_request_irq %d (%d)",
+ dev->jpegenc_irq, ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int mtk_jpegenc_hw_probe(struct platform_device *pdev)
+{
+ struct mtk_jpegenc_clk *jpegenc_clk;
+ struct mtk_jpeg_dev *master_dev;
+ struct mtk_jpegenc_comp_dev *dev;
+ int ret, i;
+
+ struct device *decs = &pdev->dev;
+
+ if (!decs->parent)
+ return -EPROBE_DEFER;
+
+ master_dev = dev_get_drvdata(decs->parent);
+ if (!master_dev)
+ return -EPROBE_DEFER;
+
+ dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
+ if (!dev)
+ return -ENOMEM;
+
+ dev->plat_dev = pdev;
+ dev->dev = &pdev->dev;
+
+ if (!master_dev->is_jpgenc_multihw) {
+ master_dev->is_jpgenc_multihw = true;
+ for (i = 0; i < MTK_JPEGENC_HW_MAX; i++)
+ master_dev->enc_hw_dev[i] = NULL;
+ }
+
+ jpegenc_clk = &dev->venc_clk;
+
+ jpegenc_clk->clk_num = devm_clk_bulk_get_all(&pdev->dev,
+ &jpegenc_clk->clks);
+ if (jpegenc_clk->clk_num < 0)
+ return dev_err_probe(&pdev->dev, jpegenc_clk->clk_num,
+ "Failed to get jpegenc clock count\n");
+
+ dev->reg_base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(dev->reg_base))
+ return PTR_ERR(dev->reg_base);
+
+ ret = mtk_jpegenc_hw_init_irq(dev);
+ if (ret)
+ return ret;
+
+ for (i = 0; i < MTK_JPEGENC_HW_MAX; i++) {
+ if (master_dev->enc_hw_dev[i])
+ continue;
+
+ master_dev->enc_hw_dev[i] = dev;
+ master_dev->reg_encbase[i] = dev->reg_base;
+ dev->master_dev = master_dev;
+ }
+
+ platform_set_drvdata(pdev, dev);
+ pm_runtime_enable(&pdev->dev);
+
+ return 0;
+}
+
+static struct platform_driver mtk_jpegenc_hw_driver = {
+ .probe = mtk_jpegenc_hw_probe,
+ .driver = {
+ .name = "mtk-jpegenc-hw",
+ .of_match_table = of_match_ptr(mtk_jpegenc_drv_ids),
+ },
+};
+
+module_platform_driver(mtk_jpegenc_hw_driver);
+
+MODULE_DESCRIPTION("MediaTek JPEG encode HW driver");
+MODULE_LICENSE("GPL");
--
2.18.0
From: kyrie wu <[email protected]>
Add stop cmd interface for jpgenc to stop stream
Signed-off-by: kyrie wu <[email protected]>
Signed-off-by: irui wang <[email protected]>
---
drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
index 0d4e7220e509..e60363e38a90 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
@@ -613,6 +613,9 @@ static const struct v4l2_ioctl_ops mtk_jpeg_enc_ioctl_ops = {
.vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
+
+ .vidioc_encoder_cmd = v4l2_m2m_ioctl_encoder_cmd,
+ .vidioc_try_encoder_cmd = v4l2_m2m_ioctl_try_encoder_cmd,
};
static const struct v4l2_ioctl_ops mtk_jpeg_dec_ioctl_ops = {
@@ -1391,6 +1394,7 @@ static int mtk_jpeg_open(struct file *file)
} else {
v4l2_ctrl_handler_init(&ctx->ctrl_hdl, 0);
}
+
mtk_jpeg_set_default_params(ctx);
mutex_unlock(&jpeg->lock);
return 0;
--
2.18.0
From: kyrie wu <[email protected]>
Generalizes jpegenc timeout func interfaces to handle HW timeout.
Signed-off-by: kyrie wu <[email protected]>
Signed-off-by: irui wang <[email protected]>
---
.../platform/mediatek/jpeg/mtk_jpeg_core.h | 10 ++++++++
.../platform/mediatek/jpeg/mtk_jpeg_enc_hw.c | 25 +++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
index 1e0ba466303b..98de83c9ea4c 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h
@@ -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;
};
/**
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
index 3dcf83d6d95e..95812f60ab9f 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c
@@ -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,
--
2.18.0
Il 15/09/22 08:43, Irui Wang ha scritto:
> From: kyrie wu <[email protected]>
>
> This series adds support for multi hardwares jpeg enc & dec,
> by first adding use of_platform_populate to manage each hardware
> information:interrupt, clock, register bases and power.
> Secondly add jpeg enc & dec work queue to deal with the encoding
> or decoding requests of multi-hardwares at the same time.
> Lastly, add output picture reorder function interface to
> eliminate the out of order images.
>
> This series has been tested with MT8195 Gstreamer.
> Encoding and decoding worked for this chip.
>
Hello Irui,
I may have lost some piece of conversation on v13, but as far as I can see,
both series, jpeg ENC+DEC were picked by Hans [1].
If you have further improvements to that, you should make new commits and
not a new version for the series. Please look at Hans' media tree at [1].
Regards,
Angelo
[1]: https://git.linuxtv.org/hverkuil/media_tree.git/log/?h=for-v6.1n
From: kyrie wu <[email protected]>
Add mediatek,mt8195-jpgdec compatible to binding document.
Signed-off-by: kyrie wu <[email protected]>
Signed-off-by: irui wang <[email protected]>
Reviewed-by: Rob Herring <[email protected]>
---
.../media/mediatek,mt8195-jpegdec.yaml | 169 ++++++++++++++++++
1 file changed, 169 insertions(+)
create mode 100644 Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml
diff --git a/Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml b/Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml
new file mode 100644
index 000000000000..9135cf889d1e
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml
@@ -0,0 +1,169 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/media/mediatek,mt8195-jpegdec.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek JPEG Encoder Device Tree Bindings
+
+maintainers:
+ - kyrie wu <[email protected]>
+
+description:
+ MediaTek JPEG Decoder is the JPEG decode hardware present in MediaTek SoCs
+
+properties:
+ compatible:
+ items:
+ - const: mediatek,mt8195-jpgdec
+
+ power-domains:
+ maxItems: 1
+
+ iommus:
+ maxItems: 6
+ description:
+ Points to the respective IOMMU block with master port as argument, see
+ Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml for details.
+ Ports are according to the HW.
+
+ dma-ranges:
+ maxItems: 1
+ description: |
+ Describes the physical address space of IOMMU maps to memory.
+
+ "#address-cells":
+ const: 2
+
+ "#size-cells":
+ const: 2
+
+ ranges: true
+
+# Required child node:
+patternProperties:
+ "^jpgdec@[0-9a-f]+$":
+ type: object
+ description:
+ The jpeg decoder hardware device node which should be added as subnodes to
+ the main jpeg node.
+
+ properties:
+ compatible:
+ const: mediatek,mt8195-jpgdec-hw
+
+ reg:
+ maxItems: 1
+
+ iommus:
+ minItems: 1
+ maxItems: 32
+ description:
+ List of the hardware port in respective IOMMU block for current Socs.
+ Refer to bindings/iommu/mediatek,iommu.yaml.
+
+ interrupts:
+ maxItems: 1
+
+ clocks:
+ maxItems: 1
+
+ clock-names:
+ items:
+ - const: jpgdec
+
+ power-domains:
+ maxItems: 1
+
+ required:
+ - compatible
+ - reg
+ - iommus
+ - interrupts
+ - clocks
+ - clock-names
+ - power-domains
+
+ additionalProperties: false
+
+required:
+ - compatible
+ - power-domains
+ - iommus
+ - dma-ranges
+ - ranges
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/memory/mt8195-memory-port.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
+ #include <dt-bindings/clock/mt8195-clk.h>
+ #include <dt-bindings/power/mt8195-power.h>
+
+ soc {
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ jpgdec_master {
+ compatible = "mediatek,mt8195-jpgdec";
+ power-domains = <&spm MT8195_POWER_DOMAIN_VDEC1>;
+ iommus = <&iommu_vpp M4U_PORT_L19_JPGDEC_WDMA0>,
+ <&iommu_vpp M4U_PORT_L19_JPGDEC_BSDMA0>,
+ <&iommu_vpp M4U_PORT_L19_JPGDEC_WDMA1>,
+ <&iommu_vpp M4U_PORT_L19_JPGDEC_BSDMA1>,
+ <&iommu_vpp M4U_PORT_L19_JPGDEC_BUFF_OFFSET1>,
+ <&iommu_vpp M4U_PORT_L19_JPGDEC_BUFF_OFFSET0>;
+ dma-ranges = <0x1 0x0 0x0 0x40000000 0x0 0xfff00000>;
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ jpgdec@1a040000 {
+ compatible = "mediatek,mt8195-jpgdec-hw";
+ reg = <0 0x1a040000 0 0x10000>;/* JPGDEC_C0 */
+ iommus = <&iommu_vdo M4U_PORT_L19_JPGDEC_WDMA0>,
+ <&iommu_vdo M4U_PORT_L19_JPGDEC_BSDMA0>,
+ <&iommu_vdo M4U_PORT_L19_JPGDEC_WDMA1>,
+ <&iommu_vdo M4U_PORT_L19_JPGDEC_BSDMA1>,
+ <&iommu_vdo M4U_PORT_L19_JPGDEC_BUFF_OFFSET1>,
+ <&iommu_vdo M4U_PORT_L19_JPGDEC_BUFF_OFFSET0>;
+ interrupts = <GIC_SPI 343 IRQ_TYPE_LEVEL_HIGH 0>;
+ clocks = <&vencsys CLK_VENC_JPGDEC>;
+ clock-names = "jpgdec";
+ power-domains = <&spm MT8195_POWER_DOMAIN_VDEC0>;
+ };
+
+ jpgdec@1a050000 {
+ compatible = "mediatek,mt8195-jpgdec-hw";
+ reg = <0 0x1a050000 0 0x10000>;/* JPGDEC_C1 */
+ iommus = <&iommu_vdo M4U_PORT_L19_JPGDEC_WDMA0>,
+ <&iommu_vdo M4U_PORT_L19_JPGDEC_BSDMA0>,
+ <&iommu_vdo M4U_PORT_L19_JPGDEC_WDMA1>,
+ <&iommu_vdo M4U_PORT_L19_JPGDEC_BSDMA1>,
+ <&iommu_vdo M4U_PORT_L19_JPGDEC_BUFF_OFFSET1>,
+ <&iommu_vdo M4U_PORT_L19_JPGDEC_BUFF_OFFSET0>;
+ interrupts = <GIC_SPI 344 IRQ_TYPE_LEVEL_HIGH 0>;
+ clocks = <&vencsys CLK_VENC_JPGDEC_C1>;
+ clock-names = "jpgdec";
+ power-domains = <&spm MT8195_POWER_DOMAIN_VDEC1>;
+ };
+
+ jpgdec@1b040000 {
+ compatible = "mediatek,mt8195-jpgdec-hw";
+ reg = <0 0x1b040000 0 0x10000>;/* JPGDEC_C2 */
+ iommus = <&iommu_vpp M4U_PORT_L20_JPGDEC_WDMA0>,
+ <&iommu_vpp M4U_PORT_L20_JPGDEC_BSDMA0>,
+ <&iommu_vpp M4U_PORT_L20_JPGDEC_WDMA1>,
+ <&iommu_vpp M4U_PORT_L20_JPGDEC_BSDMA1>,
+ <&iommu_vpp M4U_PORT_L20_JPGDEC_BUFF_OFFSET1>,
+ <&iommu_vpp M4U_PORT_L20_JPGDEC_BUFF_OFFSET0>;
+ interrupts = <GIC_SPI 348 IRQ_TYPE_LEVEL_HIGH 0>;
+ clocks = <&vencsys_core1 CLK_VENC_CORE1_JPGDEC>;
+ clock-names = "jpgdec";
+ power-domains = <&spm MT8195_POWER_DOMAIN_VDEC2>;
+ };
+ };
+ };
--
2.18.0
From: kyrie wu <[email protected]>
mtk jpeg decoder is built as a module, export some functions to make them
visible by other modules.
Signed-off-by: kyrie wu <[email protected]>
Signed-off-by: irui wang <[email protected]>
---
drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c
index 1e3852295f2f..d2f25f43e852 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c
@@ -189,6 +189,7 @@ int mtk_jpeg_dec_fill_param(struct mtk_jpeg_dec_param *param)
return 0;
}
+EXPORT_SYMBOL_GPL(mtk_jpeg_dec_fill_param);
u32 mtk_jpeg_dec_get_int_status(void __iomem *base)
{
@@ -200,6 +201,7 @@ u32 mtk_jpeg_dec_get_int_status(void __iomem *base)
return ret;
}
+EXPORT_SYMBOL_GPL(mtk_jpeg_dec_get_int_status);
u32 mtk_jpeg_dec_enum_result(u32 irq_result)
{
@@ -216,11 +218,13 @@ u32 mtk_jpeg_dec_enum_result(u32 irq_result)
return MTK_JPEG_DEC_RESULT_ERROR_UNKNOWN;
}
+EXPORT_SYMBOL_GPL(mtk_jpeg_dec_enum_result);
void mtk_jpeg_dec_start(void __iomem *base)
{
writel(0, base + JPGDEC_REG_TRIG);
}
+EXPORT_SYMBOL_GPL(mtk_jpeg_dec_start);
static void mtk_jpeg_dec_soft_reset(void __iomem *base)
{
@@ -240,6 +244,7 @@ void mtk_jpeg_dec_reset(void __iomem *base)
mtk_jpeg_dec_soft_reset(base);
mtk_jpeg_dec_hard_reset(base);
}
+EXPORT_SYMBOL_GPL(mtk_jpeg_dec_reset);
static void mtk_jpeg_dec_set_brz_factor(void __iomem *base, u8 yscale_w,
u8 yscale_h, u8 uvscale_w, u8 uvscale_h)
@@ -408,3 +413,4 @@ void mtk_jpeg_dec_set_config(void __iomem *base,
config->dma_last_mcu);
mtk_jpeg_dec_set_pause_mcu_idx(base, config->total_mcu);
}
+EXPORT_SYMBOL_GPL(mtk_jpeg_dec_set_config);
--
2.18.0
Il 15/09/22 09:41, Hans Verkuil ha scritto:
> Hi Irui,
>
> On 9/15/22 08:21, kyrie.wu wrote:
>> On Thu, 2022-09-15 at 14:43 +0800, Irui Wang wrote:
>>> From: kyrie wu <[email protected]>
>>>
>>> This series adds support for multi hardwares jpeg enc & dec,
>>> by first adding use of_platform_populate to manage each hardware
>>> information:interrupt, clock, register bases and power.
>>> Secondly add jpeg enc & dec work queue to deal with the encoding
>>> or decoding requests of multi-hardwares at the same time.
>>> Lastly, add output picture reorder function interface to
>>> eliminate the out of order images.
>>>
>>> This series has been tested with MT8195 Gstreamer.
>>> Encoding and decoding worked for this chip.
>>
>> Hi Hans,
>>
>> I'm terrible sorry for that I didn't notice you picked all
>> patches series includes jpeg enc + dec.
>> Please overlook the V14 and I will send a new series to fix
>> kernel-doc warns.
>
> No, I didn't pick it up. The branch Angelo pointed to is just the branch I used to
> compile test your series, I haven't posted a PR for it.
>
> Next week I'll try again with v14 to check if it passes all my compile tests, and
> if OK, then I'll post a PR.
>
> Patches are picked up if I post a PR and they are marked as 'Under Review' in
> patchwork. When Mauro merges them in our tree, then the state goes to 'Accepted'.
>
Sorry for the confusion.
Regards,
Angelo
> Regards,
>
> Hans
>
>>
>> Thanks.
>>
>> Regards,
>> Kyrie.
>>>
>>> Patches 1 Adds jpeg encoder dt-bindings for mt8195
>>>
>>> Patches 2 jpeg encoder builds two module for using Multi-HW,
>>> export some functions to make them visible by other modules.
>>>
>>> Patches 3 use devm_of_platform_populate to manage multi-hardware.
>>>
>>> Patch 4 add jpeg encoding timeout function to judge hardware timeout.
>>>
>>> Patch 5 add encoding work queue to deal with multi-hardware encoding
>>> at the same time.
>>>
>>> Patch 6 add output picture reorder function to order images.
>>>
>>> Patch 7 add stop cmd function to deal with EOS operation.
>>>
>>> Patch 8 Adds jpeg decoder dt-bindings for mt8195
>>>
>>> Patches 9 jpeg decoder builds three module for using Multi-HW,
>>> export some functions to make them visible by other modules.
>>>
>>> Patch 10 use of_platform_populate to manage multi-hardware.
>>>
>>> Patch 11 add jpeg decoding timeout function to judge hardware
>>> timeout.
>>>
>>> Patch 12 add decoding work queue to deal with multi-hardware decoding
>>> at the same time.
>>>
>>> Patch 13 add output picture reorder function to order images.
>>>
>>> Patch 14 refactor jpegdec func interface for HW working.
>>>
>>> Patch 15 add stop cmd function to deal with EOS operation.
>>>
>>> ---
>>> This series patches dependent on:
>>> media_stage tree:
>>> [1]
>>>
>> https://git.linuxtv.org/media_stage.git/commit/?id=b3627647f9ea7473d10fb08a95fd7c4133a17ca4
>>>
>>> patch1 new jpegdec dt-bindings included files
>>> [2] MM IOMMU binding:
>>>
>> https://patchwork.kernel.org/project/linux-mediatek/patch/[email protected]/
>>>
>>> [3] MT8195 power domain:
>>>
>> https://patchwork.kernel.org/project/linux-mediatek/list/?series=580579
>>>
>>> Changes compared with v13:
>>> - some modifications for patch v13's review comments.
>>> - fix kernel robot check errors.
>>> - fix kernel-doc check warns.
>>> - fix sparse check warns.
>>> - combine jpeg encoder series with decoder series into
>>> one single series.
>>>
>>> Changes compared with v12:
>>> - some modifications for patch v12's review comments.
>>>
>>> Changes compared with v11:
>>> - some modifications for patch v11's review comments.
>>> - fix yaml file check errors.
>>>
>>> Changes compared with v10:
>>> - some modifications for patch v10's review comments.
>>> - fix Gstreamer test errors.
>>>
>>> Changes compared with v9:
>>> - some modifications for patch v9's review comments.
>>>
>>> Changes compared with v8:
>>> - some modifications for patch v8's review comments.
>>> - add stop cmd function.
>>>
>>> Changes compared with v7:
>>> - some modifications for patch v6's review comments.
>>>
>>> Changes compared with v6:
>>> - new yaml file for mt8195 jpeg encoder.
>>> - some modifications for patch v5's review comments.
>>>
>>> Changes compared with v5:
>>> - use of_platform_populate to replace component framework to
>>> manage multi-hardware in patch 2.
>>>
>>> Changes compared with v4:
>>> - No change compaered with v4
>>>
>>> Changes compared with v3:
>>> - Structure patches for consistency, non-backward
>>> compatible and do not break any existing functionality
>>>
>>> Changes compared with v2:
>>> - Split the last two patches into several patches
>>> to enhance readability
>>> - Correct some syntax errors
>>> - Explain why the component framework is used
>>>
>>> Changes compared with v1:
>>> - Add jpeg encoder dt-bindings for MT8195
>>> - Use component framework to manage jpegenc HW
>>> - Add jpegenc output pic reorder function interface
>>>
>>> kyrie wu (15):
>>> dt-bindings: mediatek: Add mediatek, mt8195-jpgenc compatible
>>> mtk-jpegenc: export jpeg encoder functions
>>> mtk-jpegenc: support jpegenc multi-hardware
>>> mtk-jpegenc: add jpegenc timeout func interface
>>> mtk-jpegenc: add jpeg encode worker interface
>>> mtk-jpegenc: add output pic reorder interface
>>> mtk-jpegenc: add stop cmd interface for jpgenc
>>> dt-bindings: mediatek: Add mediatek,mt8195-jpgdec compatible
>>> media: mtk-jpegdec: export jpeg decoder functions
>>> media: mtk-jpegdec: support jpegdec multi-hardware
>>> media: mtk-jpegdec: add jpegdec timeout func interface
>>> media: mtk-jpegdec: add jpeg decode worker interface
>>> media: mtk-jpegdec: add output pic reorder interface
>>> media: mtk-jpegdec: refactor jpegdec func interface
>>> mtk-jpegdec: add stop cmd interface for jpgdec
>>>
>>> .../media/mediatek,mt8195-jpegdec.yaml | 169 ++++++
>>> .../media/mediatek,mt8195-jpegenc.yaml | 147 ++++++
>>> drivers/media/platform/mediatek/jpeg/Makefile | 14 +-
>>> .../platform/mediatek/jpeg/mtk_jpeg_core.c | 490
>>> ++++++++++++++++--
>>> .../platform/mediatek/jpeg/mtk_jpeg_core.h | 169 +++++-
>>> .../platform/mediatek/jpeg/mtk_jpeg_dec_hw.c | 315 ++++++++++-
>>> .../platform/mediatek/jpeg/mtk_jpeg_dec_hw.h | 6 +-
>>> .../platform/mediatek/jpeg/mtk_jpeg_dec_reg.h | 1 +
>>> .../platform/mediatek/jpeg/mtk_jpeg_enc_hw.c | 255 +++++++++
>>> 9 files changed, 1483 insertions(+), 83 deletions(-)
>>> create mode 100644
>>> Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml
>>> create mode 100644
>>> Documentation/devicetree/bindings/media/mediatek,mt8195-jpegenc.yaml
>>>
>>
Hi Irui,
On 9/15/22 08:21, kyrie.wu wrote:
> On Thu, 2022-09-15 at 14:43 +0800, Irui Wang wrote:
>> From: kyrie wu <[email protected]>
>>
>> This series adds support for multi hardwares jpeg enc & dec,
>> by first adding use of_platform_populate to manage each hardware
>> information:interrupt, clock, register bases and power.
>> Secondly add jpeg enc & dec work queue to deal with the encoding
>> or decoding requests of multi-hardwares at the same time.
>> Lastly, add output picture reorder function interface to
>> eliminate the out of order images.
>>
>> This series has been tested with MT8195 Gstreamer.
>> Encoding and decoding worked for this chip.
>
> Hi Hans,
>
> I'm terrible sorry for that I didn't notice you picked all
> patches series includes jpeg enc + dec.
> Please overlook the V14 and I will send a new series to fix
> kernel-doc warns.
No, I didn't pick it up. The branch Angelo pointed to is just the branch
I used to compile test your series, I haven't posted a PR for it.
Next week I'll try again with v14 to check if it passes all my compile
tests, and if OK, then I'll post a PR.
Patches are picked up if I post a PR and they are marked as 'Under
Review' in patchwork. When Mauro merges them in our tree, then the state
goes to 'Accepted'.
Regards,
Hans
>
> Thanks.
>
> Regards,
> Kyrie.
>>
>> Patches 1 Adds jpeg encoder dt-bindings for mt8195
>>
>> Patches 2 jpeg encoder builds two module for using Multi-HW,
>> export some functions to make them visible by other modules.
>>
>> Patches 3 use devm_of_platform_populate to manage multi-hardware.
>>
>> Patch 4 add jpeg encoding timeout function to judge hardware timeout.
>>
>> Patch 5 add encoding work queue to deal with multi-hardware encoding
>> at the same time.
>>
>> Patch 6 add output picture reorder function to order images.
>>
>> Patch 7 add stop cmd function to deal with EOS operation.
>>
>> Patch 8 Adds jpeg decoder dt-bindings for mt8195
>>
>> Patches 9 jpeg decoder builds three module for using Multi-HW,
>> export some functions to make them visible by other modules.
>>
>> Patch 10 use of_platform_populate to manage multi-hardware.
>>
>> Patch 11 add jpeg decoding timeout function to judge hardware
>> timeout.
>>
>> Patch 12 add decoding work queue to deal with multi-hardware decoding
>> at the same time.
>>
>> Patch 13 add output picture reorder function to order images.
>>
>> Patch 14 refactor jpegdec func interface for HW working.
>>
>> Patch 15 add stop cmd function to deal with EOS operation.
>>
>> ---
>> This series patches dependent on:
>> media_stage tree:
>> [1]
>>
> https://git.linuxtv.org/media_stage.git/commit/?id=b3627647f9ea7473d10fb08a95fd7c4133a17ca4
>>
>> patch1 new jpegdec dt-bindings included files
>> [2] MM IOMMU binding:
>>
> https://patchwork.kernel.org/project/linux-mediatek/patch/[email protected]/
>>
>> [3] MT8195 power domain:
>>
> https://patchwork.kernel.org/project/linux-mediatek/list/?series=580579
>>
>> Changes compared with v13:
>> - some modifications for patch v13's review comments.
>> - fix kernel robot check errors.
>> - fix kernel-doc check warns.
>> - fix sparse check warns.
>> - combine jpeg encoder series with decoder series into
>> one single series.
>>
>> Changes compared with v12:
>> - some modifications for patch v12's review comments.
>>
>> Changes compared with v11:
>> - some modifications for patch v11's review comments.
>> - fix yaml file check errors.
>>
>> Changes compared with v10:
>> - some modifications for patch v10's review comments.
>> - fix Gstreamer test errors.
>>
>> Changes compared with v9:
>> - some modifications for patch v9's review comments.
>>
>> Changes compared with v8:
>> - some modifications for patch v8's review comments.
>> - add stop cmd function.
>>
>> Changes compared with v7:
>> - some modifications for patch v6's review comments.
>>
>> Changes compared with v6:
>> - new yaml file for mt8195 jpeg encoder.
>> - some modifications for patch v5's review comments.
>>
>> Changes compared with v5:
>> - use of_platform_populate to replace component framework to
>> manage multi-hardware in patch 2.
>>
>> Changes compared with v4:
>> - No change compaered with v4
>>
>> Changes compared with v3:
>> - Structure patches for consistency, non-backward
>> compatible and do not break any existing functionality
>>
>> Changes compared with v2:
>> - Split the last two patches into several patches
>> to enhance readability
>> - Correct some syntax errors
>> - Explain why the component framework is used
>>
>> Changes compared with v1:
>> - Add jpeg encoder dt-bindings for MT8195
>> - Use component framework to manage jpegenc HW
>> - Add jpegenc output pic reorder function interface
>>
>> kyrie wu (15):
>> dt-bindings: mediatek: Add mediatek, mt8195-jpgenc compatible
>> mtk-jpegenc: export jpeg encoder functions
>> mtk-jpegenc: support jpegenc multi-hardware
>> mtk-jpegenc: add jpegenc timeout func interface
>> mtk-jpegenc: add jpeg encode worker interface
>> mtk-jpegenc: add output pic reorder interface
>> mtk-jpegenc: add stop cmd interface for jpgenc
>> dt-bindings: mediatek: Add mediatek,mt8195-jpgdec compatible
>> media: mtk-jpegdec: export jpeg decoder functions
>> media: mtk-jpegdec: support jpegdec multi-hardware
>> media: mtk-jpegdec: add jpegdec timeout func interface
>> media: mtk-jpegdec: add jpeg decode worker interface
>> media: mtk-jpegdec: add output pic reorder interface
>> media: mtk-jpegdec: refactor jpegdec func interface
>> mtk-jpegdec: add stop cmd interface for jpgdec
>>
>> .../media/mediatek,mt8195-jpegdec.yaml | 169 ++++++
>> .../media/mediatek,mt8195-jpegenc.yaml | 147 ++++++
>> drivers/media/platform/mediatek/jpeg/Makefile | 14 +-
>> .../platform/mediatek/jpeg/mtk_jpeg_core.c | 490
>> ++++++++++++++++--
>> .../platform/mediatek/jpeg/mtk_jpeg_core.h | 169 +++++-
>> .../platform/mediatek/jpeg/mtk_jpeg_dec_hw.c | 315 ++++++++++-
>> .../platform/mediatek/jpeg/mtk_jpeg_dec_hw.h | 6 +-
>> .../platform/mediatek/jpeg/mtk_jpeg_dec_reg.h | 1 +
>> .../platform/mediatek/jpeg/mtk_jpeg_enc_hw.c | 255 +++++++++
>> 9 files changed, 1483 insertions(+), 83 deletions(-)
>> create mode 100644
>> Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml
>> create mode 100644
>> Documentation/devicetree/bindings/media/mediatek,mt8195-jpegenc.yaml
>>
>
Hi Irui,
Something went wrong here: patches 10-15 never made it to the mailinglist.
Can you repost?
Hans
On 15/09/2022 08:43, Irui Wang wrote:
> From: kyrie wu <[email protected]>
>
> This series adds support for multi hardwares jpeg enc & dec,
> by first adding use of_platform_populate to manage each hardware
> information:interrupt, clock, register bases and power.
> Secondly add jpeg enc & dec work queue to deal with the encoding
> or decoding requests of multi-hardwares at the same time.
> Lastly, add output picture reorder function interface to
> eliminate the out of order images.
>
> This series has been tested with MT8195 Gstreamer.
> Encoding and decoding worked for this chip.
>
> Patches 1 Adds jpeg encoder dt-bindings for mt8195
>
> Patches 2 jpeg encoder builds two module for using Multi-HW,
> export some functions to make them visible by other modules.
>
> Patches 3 use devm_of_platform_populate to manage multi-hardware.
>
> Patch 4 add jpeg encoding timeout function to judge hardware timeout.
>
> Patch 5 add encoding work queue to deal with multi-hardware encoding
> at the same time.
>
> Patch 6 add output picture reorder function to order images.
>
> Patch 7 add stop cmd function to deal with EOS operation.
>
> Patch 8 Adds jpeg decoder dt-bindings for mt8195
>
> Patches 9 jpeg decoder builds three module for using Multi-HW,
> export some functions to make them visible by other modules.
>
> Patch 10 use of_platform_populate to manage multi-hardware.
>
> Patch 11 add jpeg decoding timeout function to judge hardware timeout.
>
> Patch 12 add decoding work queue to deal with multi-hardware decoding
> at the same time.
>
> Patch 13 add output picture reorder function to order images.
>
> Patch 14 refactor jpegdec func interface for HW working.
>
> Patch 15 add stop cmd function to deal with EOS operation.
>
> ---
> This series patches dependent on:
> media_stage tree:
> [1]
> https://git.linuxtv.org/media_stage.git/commit/?id=b3627647f9ea7473d10fb08a95fd7c4133a17ca4
>
> patch1 new jpegdec dt-bindings included files
> [2] MM IOMMU binding:
> https://patchwork.kernel.org/project/linux-mediatek/patch/[email protected]/
>
> [3] MT8195 power domain:
> https://patchwork.kernel.org/project/linux-mediatek/list/?series=580579
>
> Changes compared with v13:
> - some modifications for patch v13's review comments.
> - fix kernel robot check errors.
> - fix kernel-doc check warns.
> - fix sparse check warns.
> - combine jpeg encoder series with decoder series into
> one single series.
>
> Changes compared with v12:
> - some modifications for patch v12's review comments.
>
> Changes compared with v11:
> - some modifications for patch v11's review comments.
> - fix yaml file check errors.
>
> Changes compared with v10:
> - some modifications for patch v10's review comments.
> - fix Gstreamer test errors.
>
> Changes compared with v9:
> - some modifications for patch v9's review comments.
>
> Changes compared with v8:
> - some modifications for patch v8's review comments.
> - add stop cmd function.
>
> Changes compared with v7:
> - some modifications for patch v6's review comments.
>
> Changes compared with v6:
> - new yaml file for mt8195 jpeg encoder.
> - some modifications for patch v5's review comments.
>
> Changes compared with v5:
> - use of_platform_populate to replace component framework to
> manage multi-hardware in patch 2.
>
> Changes compared with v4:
> - No change compaered with v4
>
> Changes compared with v3:
> - Structure patches for consistency, non-backward
> compatible and do not break any existing functionality
>
> Changes compared with v2:
> - Split the last two patches into several patches
> to enhance readability
> - Correct some syntax errors
> - Explain why the component framework is used
>
> Changes compared with v1:
> - Add jpeg encoder dt-bindings for MT8195
> - Use component framework to manage jpegenc HW
> - Add jpegenc output pic reorder function interface
>
> kyrie wu (15):
> dt-bindings: mediatek: Add mediatek, mt8195-jpgenc compatible
> mtk-jpegenc: export jpeg encoder functions
> mtk-jpegenc: support jpegenc multi-hardware
> mtk-jpegenc: add jpegenc timeout func interface
> mtk-jpegenc: add jpeg encode worker interface
> mtk-jpegenc: add output pic reorder interface
> mtk-jpegenc: add stop cmd interface for jpgenc
> dt-bindings: mediatek: Add mediatek,mt8195-jpgdec compatible
> media: mtk-jpegdec: export jpeg decoder functions
> media: mtk-jpegdec: support jpegdec multi-hardware
> media: mtk-jpegdec: add jpegdec timeout func interface
> media: mtk-jpegdec: add jpeg decode worker interface
> media: mtk-jpegdec: add output pic reorder interface
> media: mtk-jpegdec: refactor jpegdec func interface
> mtk-jpegdec: add stop cmd interface for jpgdec
>
> .../media/mediatek,mt8195-jpegdec.yaml | 169 ++++++
> .../media/mediatek,mt8195-jpegenc.yaml | 147 ++++++
> drivers/media/platform/mediatek/jpeg/Makefile | 14 +-
> .../platform/mediatek/jpeg/mtk_jpeg_core.c | 490 ++++++++++++++++--
> .../platform/mediatek/jpeg/mtk_jpeg_core.h | 169 +++++-
> .../platform/mediatek/jpeg/mtk_jpeg_dec_hw.c | 315 ++++++++++-
> .../platform/mediatek/jpeg/mtk_jpeg_dec_hw.h | 6 +-
> .../platform/mediatek/jpeg/mtk_jpeg_dec_reg.h | 1 +
> .../platform/mediatek/jpeg/mtk_jpeg_enc_hw.c | 255 +++++++++
> 9 files changed, 1483 insertions(+), 83 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml
> create mode 100644 Documentation/devicetree/bindings/media/mediatek,mt8195-jpegenc.yaml
>
On 15/09/2022 08:43, Irui Wang wrote:
> From: kyrie wu <[email protected]>
>
> Add mediatek,mt8195-jpgdec compatible to binding document.
Use scripts/get_maintainers.pl to CC all maintainers and relevant
mailing lists.
>
> Signed-off-by: kyrie wu <[email protected]>
> Signed-off-by: irui wang <[email protected]>
> Reviewed-by: Rob Herring <[email protected]>
> ---
> .../media/mediatek,mt8195-jpegdec.yaml | 169 ++++++++++++++++++
> 1 file changed, 169 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml
>
> diff --git a/Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml b/Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml
> new file mode 100644
> index 000000000000..9135cf889d1e
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml
> @@ -0,0 +1,169 @@
> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/media/mediatek,mt8195-jpegdec.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: MediaTek JPEG Encoder Device Tree Bindings
> +
> +maintainers:
> + - kyrie wu <[email protected]>
> +
> +description:
> + MediaTek JPEG Decoder is the JPEG decode hardware present in MediaTek SoCs
> +
> +properties:
> + compatible:
> + items:
You do not have more than one item. Skip items.
> + - const: mediatek,mt8195-jpgdec
> +
> + power-domains:
> + maxItems: 1
> +
> + iommus:
> + maxItems: 6
> + description:
> + Points to the respective IOMMU block with master port as argument, see
> + Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml for details.
> + Ports are according to the HW.
> +
> + dma-ranges:
> + maxItems: 1
> + description: |
> + Describes the physical address space of IOMMU maps to memory.
> +
> + "#address-cells":
> + const: 2
> +
> + "#size-cells":
> + const: 2
> +
> + ranges: true
> +
> +# Required child node:
> +patternProperties:
> + "^jpgdec@[0-9a-f]+$":
> + type: object
> + description:
> + The jpeg decoder hardware device node which should be added as subnodes to
> + the main jpeg node.
> +
> + properties:
> + compatible:
> + const: mediatek,mt8195-jpgdec-hw
> +
> + reg:
> + maxItems: 1
> +
> + iommus:
> + minItems: 1
> + maxItems: 32
> + description:
> + List of the hardware port in respective IOMMU block for current Socs.
> + Refer to bindings/iommu/mediatek,iommu.yaml.
> +
> + interrupts:
> + maxItems: 1
> +
> + clocks:
> + maxItems: 1
> +
> + clock-names:
> + items:
> + - const: jpgdec
> +
> + power-domains:
> + maxItems: 1
> +
> + required:
> + - compatible
> + - reg
> + - iommus
> + - interrupts
> + - clocks
> + - clock-names
> + - power-domains
> +
> + additionalProperties: false
> +
> +required:
> + - compatible
> + - power-domains
> + - iommus
> + - dma-ranges
> + - ranges
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> + #include <dt-bindings/memory/mt8195-memory-port.h>
> + #include <dt-bindings/interrupt-controller/irq.h>
> + #include <dt-bindings/clock/mt8195-clk.h>
> + #include <dt-bindings/power/mt8195-power.h>
> +
> + soc {
> + #address-cells = <2>;
> + #size-cells = <2>;
> +
> + jpgdec_master {
No underscores in node names.
Node names should be generic.
https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#generic-names-recommendation
> + compatible = "mediatek,mt8195-jpgdec";
> + power-domains = <&spm MT8195_POWER_DOMAIN_VDEC1>;
> + iommus = <&iommu_vpp M4U_PORT_L19_JPGDEC_WDMA0>,
> + <&iommu_vpp M4U_PORT_L19_JPGDEC_BSDMA0>,
> + <&iommu_vpp M4U_PORT_L19_JPGDEC_WDMA1>,
> + <&iommu_vpp M4U_PORT_L19_JPGDEC_BSDMA1>,
> + <&iommu_vpp M4U_PORT_L19_JPGDEC_BUFF_OFFSET1>,
> + <&iommu_vpp M4U_PORT_L19_JPGDEC_BUFF_OFFSET0>;
> + dma-ranges = <0x1 0x0 0x0 0x40000000 0x0 0xfff00000>;
> + #address-cells = <2>;
> + #size-cells = <2>;
> + ranges;
Mess up indentation.
Best regards,
Krzysztof
On 26/09/2022 03:56, kyrie.wu wrote:
> On Fri, 2022-09-23 at 13:28 +0200, Krzysztof Kozlowski wrote:
>> On 15/09/2022 08:43, Irui Wang wrote:
>>> From: kyrie wu <[email protected]>
>>>
>>> Add mediatek,mt8195-jpgdec compatible to binding document.
>>
>> Use scripts/get_maintainers.pl to CC all maintainers and relevant
>> mailing lists.
>>
>>>
>>> Signed-off-by: kyrie wu <[email protected]>
>>> Signed-off-by: irui wang <[email protected]>
>>> Reviewed-by: Rob Herring <[email protected]>
>>> ---
>>> .../media/mediatek,mt8195-jpegdec.yaml | 169
>>> ++++++++++++++++++
>>> 1 file changed, 169 insertions(+)
>>> create mode 100644
>>> Documentation/devicetree/bindings/media/mediatek,mt8195-
>>> jpegdec.yaml
>>>
>>> diff --git
>>> a/Documentation/devicetree/bindings/media/mediatek,mt8195-
>>> jpegdec.yaml
>>> b/Documentation/devicetree/bindings/media/mediatek,mt8195-
>>> jpegdec.yaml
>>> new file mode 100644
>>> index 000000000000..9135cf889d1e
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/media/mediatek,mt8195-
>>> jpegdec.yaml
>>> @@ -0,0 +1,169 @@
>>> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
>>> +%YAML 1.2
>>> +---
>>> +$id:
>>> https://urldefense.com/v3/__http://devicetree.org/schemas/media/mediatek,mt8195-jpegdec.yaml*__;Iw!!CTRNKA9wMg0ARbw!yu00-_vltBz3bkDyzkeH2PENGyfi_megjPx815JiqrNVa28ZU7kcFYidMEos_id7$
>>>
>>> +$schema:
>>> https://urldefense.com/v3/__http://devicetree.org/meta-schemas/core.yaml*__;Iw!!CTRNKA9wMg0ARbw!yu00-_vltBz3bkDyzkeH2PENGyfi_megjPx815JiqrNVa28ZU7kcFYidMAikt6uh$
>>>
>>> +
>>> +title: MediaTek JPEG Encoder Device Tree Bindings
>>> +
>>> +maintainers:
>>> + - kyrie wu <[email protected]>
>>> +
>>> +description:
>>> + MediaTek JPEG Decoder is the JPEG decode hardware present in
>>> MediaTek SoCs
>>> +
>>> +properties:
>>> + compatible:
>>> + items:
>>
>> You do not have more than one item. Skip items.
>
> Hello Krzysztof,
>
> The device node has the compatible of "mediatek,mt8195-jpgdec",
> if skip this item, it may case dt-binding checking error.
No, this won't happen if you use correct syntax.
> For another, we may extend this items in the future.
Not really, that would be change of ABI. If you have already list of
devices, include them now.
Best regards,
Krzysztof