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]