diff options
author | Guoniu.Zhou <guoniu.zhou@nxp.com> | 2018-09-17 11:33:22 +0800 |
---|---|---|
committer | Jason Liu <jason.hui.liu@nxp.com> | 2018-10-29 11:10:38 +0800 |
commit | 030f8985a06e0d5c022b37011acdab8ec29ab1e8 (patch) | |
tree | 549893ce458e8af62148d9d36e5edf9449f0cc61 /drivers/media/platform | |
parent | aaa72bb1a0d1b7ef75abaef3e045a740a9710d48 (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.c | 20 | ||||
-rw-r--r-- | drivers/media/platform/imx8/mxc-isi-hw.h | 7 |
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, |