]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: imx-jpeg: Add support for encoder v1 descriptor configuration
authorMing Qian <ming.qian@oss.nxp.com>
Tue, 3 Feb 2026 08:23:41 +0000 (16:23 +0800)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Mon, 23 Mar 2026 10:18:33 +0000 (11:18 +0100)
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 <Frank.Li@nxp.com>
Signed-off-by: Ming Qian <ming.qian@oss.nxp.com>
Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h

index adb93e977be91a38b6c7f8293bd0beb8864c6934..e8ddfc61b4f2f1cb6e67cc3c160e56020515a71b 100644 (file)
@@ -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)
index 515be2317e2d14c6308f5bf10b069ff26a8ca7c3..725e941528848e8f224fe6a96ba7f746fc45ed63 100644 (file)
@@ -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;
 
index cdfefb68346ab2602fb0f8c68c9be91f527d2fb1..c00c135497461615c8e645859e48f98f249a14ba 100644 (file)
@@ -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 {