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 + #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 @@ 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; @@ -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 {