summaryrefslogtreecommitdiff
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorGuoniu.Zhou <guoniu.zhou@nxp.com>2018-09-17 11:33:22 +0800
committerJason Liu <jason.hui.liu@nxp.com>2018-10-29 11:10:38 +0800
commit030f8985a06e0d5c022b37011acdab8ec29ab1e8 (patch)
tree549893ce458e8af62148d9d36e5edf9449f0cc61 /drivers/media/platform
parentaaa72bb1a0d1b7ef75abaef3e045a740a9710d48 (diff)
MLK-19510: ISI: fix isi cann't restore to original size after resize
1. add CHNL_SCL_IMG_CFG register that is new added in QXP/QM B0 2. according to isi owner's comments, CHNL_SCL_IMG_CFG need to equal to CHNL_IMG_CFG when scaling disabled and equal to scaled image size when scaling enabled, so add configuration for this register. 3. Becuse isi software reset can't reset isi register to default , so it need to manual clear if there is no scaling. Signed-off-by: Guoniu.Zhou <guoniu.zhou@nxp.com>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/imx8/mxc-isi-hw.c20
-rw-r--r--drivers/media/platform/imx8/mxc-isi-hw.h7
2 files changed, 27 insertions, 0 deletions
diff --git a/drivers/media/platform/imx8/mxc-isi-hw.c b/drivers/media/platform/imx8/mxc-isi-hw.c
index 63fbe5e23fd4..5e836acda812 100644
--- a/drivers/media/platform/imx8/mxc-isi-hw.c
+++ b/drivers/media/platform/imx8/mxc-isi-hw.c
@@ -445,6 +445,17 @@ void mxc_isi_channel_set_crop(struct mxc_isi_dev *mxc_isi)
writel(val, mxc_isi->regs + CHNL_IMG_CTRL);
}
+static void mxc_isi_channel_clear_scaling(struct mxc_isi_dev *mxc_isi)
+{
+ u32 val0;
+
+ writel(0x10001000, mxc_isi->regs + CHNL_SCALE_FACTOR);
+
+ val0 = readl(mxc_isi->regs + CHNL_IMG_CTRL);
+ val0 &= ~(CHNL_IMG_CTRL_DEC_X_MASK | CHNL_IMG_CTRL_DEC_Y_MASK);
+ writel(val0, mxc_isi->regs + CHNL_IMG_CTRL);
+}
+
void mxc_isi_channel_set_scaling(struct mxc_isi_dev *mxc_isi)
{
struct mxc_isi_frame *dst_f = &mxc_isi->isi_cap.dst_f;
@@ -462,6 +473,7 @@ void mxc_isi_channel_set_scaling(struct mxc_isi_dev *mxc_isi)
if (dst_f->height == src_f->height ||
dst_f->width == src_f->width) {
mxc_isi->scale = 0;
+ mxc_isi_channel_clear_scaling(mxc_isi);
dev_dbg(&mxc_isi->pdev->dev, "%s: no scale\n", __func__);
return;
}
@@ -521,6 +533,11 @@ void mxc_isi_channel_set_scaling(struct mxc_isi_dev *mxc_isi)
val1 = xscale | (yscale << CHNL_SCALE_FACTOR_Y_SCALE_OFFSET);
writel(val1, mxc_isi->regs + CHNL_SCALE_FACTOR);
+
+ /* Update scale config if scaling enabled */
+ val1 = dst_f->o_width | (dst_f->o_height << CHNL_SCL_IMG_CFG_HEIGHT_OFFSET);
+ writel(val1, mxc_isi->regs + CHNL_SCL_IMG_CFG);
+
writel(0, mxc_isi->regs + CHNL_SCALE_OFFSET);
return;
@@ -567,6 +584,9 @@ void mxc_isi_channel_config(struct mxc_isi_dev *mxc_isi)
val = src_f->o_width | (src_f->o_height << CHNL_IMG_CFG_HEIGHT_OFFSET);
writel(val, mxc_isi->regs + CHNL_IMG_CFG);
+ /* scale size need to equal input size when scaling disabled*/
+ writel(val, mxc_isi->regs + CHNL_SCL_IMG_CFG);
+
/* check csc and scaling */
mxc_isi_channel_set_csc(mxc_isi);
diff --git a/drivers/media/platform/imx8/mxc-isi-hw.h b/drivers/media/platform/imx8/mxc-isi-hw.h
index da855fe77f31..4c2d0135df11 100644
--- a/drivers/media/platform/imx8/mxc-isi-hw.h
+++ b/drivers/media/platform/imx8/mxc-isi-hw.h
@@ -447,6 +447,13 @@
/* Channel Chroma (V/Cr) Output Buffer 2 Address */
#define CHNL_OUT_BUF2_ADDR_V 0x94
+/* Channel scale image config */
+#define CHNL_SCL_IMG_CFG 0x98
+#define CHNL_SCL_IMG_CFG_HEIGHT_OFFSET 16
+#define CHNL_SCL_IMG_CFG_HEIGHT_MASK 0x1FFF0000
+#define CHNL_SCL_IMG_CFG_WIDTH_OFFSET 0
+#define CHNL_SCL_IMG_CFG_WIDTH_MASK 0x1FFF
+
enum isi_csi_coeff {
YUV2RGB = 0,
RGB2YUV,