Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: imx-jpeg: Encoder support to set jpeg quality

Implement V4L2_CID_JPEG_COMPRESSION_QUALITY
to set jpeg quality

Signed-off-by: Ming Qian <ming.qian@nxp.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>

authored by

Ming Qian and committed by
Mauro Carvalho Chehab
a23196c7 5fe1d61a

+73 -3
+8 -3
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.c
··· 100 100 101 101 /* all markers and segments */ 102 102 writel(0x3ff, reg + CAST_CFG_MODE); 103 - 104 - /* quality factor */ 105 - writel(0x4b, reg + CAST_QUALITY); 106 103 } 107 104 108 105 void mxc_jpeg_enc_mode_go(struct device *dev, void __iomem *reg) ··· 109 112 * "GO" enabled, "GO bit auto clear" enabled 110 113 */ 111 114 writel(0x140, reg + CAST_MODE); 115 + } 116 + 117 + void mxc_jpeg_enc_set_quality(struct device *dev, void __iomem *reg, u8 quality) 118 + { 119 + dev_dbg(dev, "CAST Encoder Quality %d...\n", quality); 120 + 121 + /* quality factor */ 122 + writel(quality, reg + CAST_QUALITY); 112 123 } 113 124 114 125 void mxc_jpeg_dec_mode_go(struct device *dev, void __iomem *reg)
+1
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
··· 119 119 void wait_frmdone(struct device *dev, void __iomem *reg); 120 120 void mxc_jpeg_enc_mode_conf(struct device *dev, void __iomem *reg); 121 121 void mxc_jpeg_enc_mode_go(struct device *dev, void __iomem *reg); 122 + void mxc_jpeg_enc_set_quality(struct device *dev, void __iomem *reg, u8 quality); 122 123 void mxc_jpeg_dec_mode_go(struct device *dev, void __iomem *reg); 123 124 int mxc_jpeg_get_slot(void __iomem *reg); 124 125 u32 mxc_jpeg_get_offset(void __iomem *reg, int slot);
+62
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
··· 623 623 ctx->enc_state == MXC_JPEG_ENC_CONF) { 624 624 ctx->enc_state = MXC_JPEG_ENCODING; 625 625 dev_dbg(dev, "Encoder config finished. Start encoding...\n"); 626 + mxc_jpeg_enc_set_quality(dev, reg, ctx->jpeg_quality); 626 627 mxc_jpeg_enc_mode_go(dev, reg); 627 628 goto job_unlock; 628 629 } ··· 1563 1562 } 1564 1563 } 1565 1564 1565 + static int mxc_jpeg_s_ctrl(struct v4l2_ctrl *ctrl) 1566 + { 1567 + struct mxc_jpeg_ctx *ctx = 1568 + container_of(ctrl->handler, struct mxc_jpeg_ctx, ctrl_handler); 1569 + 1570 + switch (ctrl->id) { 1571 + case V4L2_CID_JPEG_COMPRESSION_QUALITY: 1572 + ctx->jpeg_quality = ctrl->val; 1573 + break; 1574 + default: 1575 + dev_err(ctx->mxc_jpeg->dev, "Invalid control, id = %d, val = %d\n", 1576 + ctrl->id, ctrl->val); 1577 + return -EINVAL; 1578 + } 1579 + 1580 + return 0; 1581 + } 1582 + 1583 + static const struct v4l2_ctrl_ops mxc_jpeg_ctrl_ops = { 1584 + .s_ctrl = mxc_jpeg_s_ctrl, 1585 + }; 1586 + 1587 + static void mxc_jpeg_encode_ctrls(struct mxc_jpeg_ctx *ctx) 1588 + { 1589 + v4l2_ctrl_new_std(&ctx->ctrl_handler, &mxc_jpeg_ctrl_ops, 1590 + V4L2_CID_JPEG_COMPRESSION_QUALITY, 1, 100, 1, 75); 1591 + } 1592 + 1593 + static int mxc_jpeg_ctrls_setup(struct mxc_jpeg_ctx *ctx) 1594 + { 1595 + int err; 1596 + 1597 + v4l2_ctrl_handler_init(&ctx->ctrl_handler, 2); 1598 + 1599 + if (ctx->mxc_jpeg->mode == MXC_JPEG_ENCODE) 1600 + mxc_jpeg_encode_ctrls(ctx); 1601 + 1602 + if (ctx->ctrl_handler.error) { 1603 + err = ctx->ctrl_handler.error; 1604 + 1605 + v4l2_ctrl_handler_free(&ctx->ctrl_handler); 1606 + return err; 1607 + } 1608 + 1609 + err = v4l2_ctrl_handler_setup(&ctx->ctrl_handler); 1610 + if (err) 1611 + v4l2_ctrl_handler_free(&ctx->ctrl_handler); 1612 + return err; 1613 + } 1614 + 1566 1615 static int mxc_jpeg_open(struct file *file) 1567 1616 { 1568 1617 struct mxc_jpeg_dev *mxc_jpeg = video_drvdata(file); ··· 1644 1593 goto error; 1645 1594 } 1646 1595 1596 + ret = mxc_jpeg_ctrls_setup(ctx); 1597 + if (ret) { 1598 + dev_err(ctx->mxc_jpeg->dev, "failed to setup mxc jpeg controls\n"); 1599 + goto err_ctrls_setup; 1600 + } 1601 + ctx->fh.ctrl_handler = &ctx->ctrl_handler; 1647 1602 mxc_jpeg_set_default_params(ctx); 1648 1603 ctx->slot = MXC_MAX_SLOTS; /* slot not allocated yet */ 1649 1604 ··· 1661 1604 1662 1605 return 0; 1663 1606 1607 + err_ctrls_setup: 1608 + v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); 1664 1609 error: 1665 1610 v4l2_fh_del(&ctx->fh); 1666 1611 v4l2_fh_exit(&ctx->fh); ··· 2015 1956 return v4l2_event_subscribe(fh, sub, 0, NULL); 2016 1957 case V4L2_EVENT_SOURCE_CHANGE: 2017 1958 return v4l2_src_change_event_subscribe(fh, sub); 1959 + case V4L2_EVENT_CTRL: 1960 + return v4l2_ctrl_subscribe_event(fh, sub); 2018 1961 default: 2019 1962 return -EINVAL; 2020 1963 } ··· 2090 2029 else 2091 2030 dev_dbg(dev, "Release JPEG encoder instance on slot %d.", 2092 2031 ctx->slot); 2032 + v4l2_ctrl_handler_free(&ctx->ctrl_handler); 2093 2033 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); 2094 2034 v4l2_fh_del(&ctx->fh); 2095 2035 v4l2_fh_exit(&ctx->fh);
+2
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h
··· 97 97 unsigned int slot; 98 98 unsigned int source_change; 99 99 bool header_parsed; 100 + struct v4l2_ctrl_handler ctrl_handler; 101 + u8 jpeg_quality; 100 102 }; 101 103 102 104 struct mxc_jpeg_slot_data {