On Tue Feb 3 16:23:41 2026 +0800, Ming Qian wrote:
> Support the upgraded JPEG encoder v1 found on i.MX952 SoC.
> 
> Detect the encoder hardware version via the version register.
> 
> The v1 encoder uses an expanded descriptor format that allows all
> encoding parameters, including JPEG quality, to be configured directly
> in the descriptor.
> 
> This removes the manual register-based configuration step required by v0
> and reduces the interrupt count from two to one per frame.
> 
> V0 encoding flow:
>   1. Write quality to registers -> trigger config interrupt
>   2. Start encoding -> trigger completion interrupt
> 
> V1 encoding flow:
>   1. Configure descriptor with all parameters including quality
>   2. Start encoding -> trigger completion interrupt
> 
> Reviewed-by: Frank Li <[email protected]>
> Signed-off-by: Ming Qian <[email protected]>
> Signed-off-by: Nicolas Dufresne <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h |  3 ++
 drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c    | 43 +++++++++++++++++++++--
 drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h    | 11 ++++++
 3 files changed, 55 insertions(+), 2 deletions(-)

---

diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h 
b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
index adb93e977be9..e8ddfc61b4f2 100644
--- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
+++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
@@ -5,6 +5,8 @@
  * Copyright 2018-2019 NXP
  */
 
+#include <linux/bitfield.h>
+
 #ifndef _MXC_JPEG_HW_H
 #define _MXC_JPEG_HW_H
 
@@ -73,6 +75,7 @@
 #define GLB_CTRL_DEC_GO                                        (0x1 << 2)
 #define GLB_CTRL_L_ENDIAN(le)                          ((le) << 3)
 #define GLB_CTRL_SLOT_EN(slot)                         (0x1 << ((slot) + 4))
+#define GLB_CTRL_CUR_VERSION(r)                                
FIELD_GET(GENMASK_U32(19, 16), r)
 
 /* COM_STAUS fields */
 #define COM_STATUS_DEC_ONGOING(r)              (((r) & (1 << 31)) >> 31)
diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c 
b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
index 515be2317e2d..725e94152884 100644
--- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
+++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
@@ -1417,11 +1417,32 @@ static void mxc_jpeg_enc_finish_config_manually(struct 
mxc_jpeg_ctx *ctx)
        mxc_jpeg_enc_mode_go(dev, reg, ctx->extseq);
 }
 
+static void mxc_jpeg_enc_configure_desc(struct mxc_jpeg_ctx *ctx)
+{
+       struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
+       struct mxc_jpeg_desc *desc = jpeg->slot_data.desc;
+       struct mxc_jpeg_desc *cfg_desc = jpeg->slot_data.cfg_desc;
+
+       ctx->enc_state = MXC_JPEG_ENCODING;
+       cfg_desc->mode = (ctx->extseq) ? 0xb0 : 0xa0;
+       cfg_desc->cfg_mode = 0x3ff;
+
+       desc->mode = (ctx->extseq) ? 0x150 : 0x140;
+       desc->cfg_mode = 0x3ff;
+       desc->quality = ctx->jpeg_quality;
+       desc->lumth = 0xffff;
+       desc->chrth = 0xffff;
+}
+
 static const struct mxc_jpeg_enc_ops mxc_jpeg_enc_cfg_ops_v0 = {
        .enter_config_mode = mxc_jpeg_enc_start_config_manually,
        .exit_config_mode = mxc_jpeg_enc_finish_config_manually
 };
 
+static const struct mxc_jpeg_enc_ops mxc_jpeg_enc_cfg_ops_v1 = {
+       .setup_desc = mxc_jpeg_enc_configure_desc
+};
+
 static const struct mxc_jpeg_fmt *mxc_jpeg_get_sibling_format(const struct 
mxc_jpeg_fmt *fmt)
 {
        int i;
@@ -2874,6 +2895,14 @@ fail:
        return ret;
 }
 
+static int mxc_jpeg_get_version(void __iomem *reg)
+{
+       u32 regval;
+
+       regval = readl(reg + GLB_CTRL);
+       return GLB_CTRL_CUR_VERSION(regval);
+}
+
 static int mxc_jpeg_probe(struct platform_device *pdev)
 {
        struct mxc_jpeg_dev *jpeg;
@@ -3012,8 +3041,18 @@ static int mxc_jpeg_probe(struct platform_device *pdev)
                goto err_pm;
        }
 
-       if (mode == MXC_JPEG_ENCODE)
-               jpeg->enc_cfg_ops = &mxc_jpeg_enc_cfg_ops_v0;
+       if (mode == MXC_JPEG_ENCODE) {
+               ret = pm_runtime_resume_and_get(dev);
+               if (ret < 0)
+                       goto err_pm;
+
+               if (mxc_jpeg_get_version(jpeg->base_reg) == 0)
+                       jpeg->enc_cfg_ops = &mxc_jpeg_enc_cfg_ops_v0;
+               else
+                       jpeg->enc_cfg_ops = &mxc_jpeg_enc_cfg_ops_v1;
+
+               pm_runtime_put_sync(dev);
+       }
 
        return 0;
 
diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h 
b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h
index cdfefb68346a..c00c13549746 100644
--- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h
+++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h
@@ -81,6 +81,17 @@ struct mxc_jpeg_desc {
        u32 stm_bufsize;
        u32 imgsize;
        u32 stm_ctrl;
+       /* below parameters are valid for v1 */
+       u32 mode;
+       u32 cfg_mode;
+       u32 quality;
+       u32 rc_regs_sel;
+       u32 lumth;
+       u32 chrth;
+       u32 nomfrsize_lo;
+       u32 nomfrsize_hi;
+       u32 ofbsize_lo;
+       u32 ofbsize_hi;
 } __packed;
 
 struct mxc_jpeg_q_data {
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to