[PATCH v3 3/3] media: mxc-jpeg: Add support for encoder v1 descriptor configuration
Frank Li
Frank.li at nxp.com
Mon Feb 2 07:55:45 PST 2026
On Mon, Feb 02, 2026 at 05:58:36PM +0800, ming.qian at oss.nxp.com wrote:
> From: Ming Qian <ming.qian at oss.nxp.com>
>
> 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
>
> Signed-off-by: Ming Qian <ming.qian at oss.nxp.com>
> ---
> .../media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h | 1 +
> .../media/platform/nxp/imx-jpeg/mxc-jpeg.c | 45 ++++++++++++++++++-
> .../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..0d78443cb270 100644
> --- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
> +++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
> @@ -73,6 +73,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 ede422364f9b..71f4a1d292ac 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 @@ static int mxc_jpeg_attach_pm_domains(struct mxc_jpeg_dev *jpeg)
> 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;
> @@ -3008,11 +3037,23 @@ static int mxc_jpeg_probe(struct platform_device *pdev)
> platform_set_drvdata(pdev, jpeg);
> pm_runtime_enable(dev);
Not related this patch. If have time, you change pm_runtime_enable() to
devm_pm_runtime_enable().
Reviewed-by: Frank Li <Frank.Li at nxp.com>
>
> - 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_check_version;
> +
> + 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;
>
> +err_check_version:
> + pm_runtime_disable(&pdev->dev);
> err_vdev_register:
> video_device_release(jpeg->dec_vdev);
>
> 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 {
> --
> 2.52.0
>
More information about the linux-arm-kernel
mailing list