From 9b24b183d5477d05366f7ad8e86746f2c44e9b8a Mon Sep 17 00:00:00 2001 From: Lian Xu Date: Thu, 31 Mar 2022 21:02:35 +0800 Subject: [PATCH] media: rockchip: isp: Solve the cmsk problem Change-Id: I25fe5245b3ea2b757cfca43aca38275e3c9b0c19 Signed-off-by: Lian Xu --- drivers/media/platform/rockchip/isp/regs_v3x.h | 6 ++++++ drivers/media/platform/rockchip/isp/rkisp.c | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/drivers/media/platform/rockchip/isp/regs_v3x.h b/drivers/media/platform/rockchip/isp/regs_v3x.h index e7a2114eb81a..bbfd89b42b4d 100644 --- a/drivers/media/platform/rockchip/isp/regs_v3x.h +++ b/drivers/media/platform/rockchip/isp/regs_v3x.h @@ -1811,6 +1811,12 @@ #define ISP3X_SW_CMSK_EN_SP BIT(2) #define ISP3X_SW_CMSK_EN_BP BIT(3) #define ISP3X_SW_CMSK_BLKSIZE(x) (((x) & 3) << 4) + +#define ISP32_SW_CMSK_EN_PATH GENMASK(3, 0) +#define ISP32_SW_CMSK_EN_PATH_SHD GENMASK(11, 8) + +#define ISP3X_SW_CMSK_FORCE_UPD BIT(31) + #define ISP3X_SW_CMSK_ORDER_MODE BIT(1) #define ISP3X_SW_CMSK_YUV(x, y, z) (((x) & 0xff) | ((y) & 0xff) << 8 | ((z) & 0xff) << 16) diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 1921cc8368c5..3e6702f9369e 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -1238,6 +1238,11 @@ static void rkisp_config_cmsk_single(struct rkisp_device *dev, ctrl |= ISP3X_SW_CMSK_EN | ISP3X_SW_CMSK_ORDER_MODE; } rkisp_write(dev, ISP3X_CMSK_CTRL0, ctrl, false); + + val = rkisp_read(dev, ISP3X_CMSK_CTRL0, true); + if (dev->hw_dev->is_single && + ((val & ISP32_SW_CMSK_EN_PATH) != (val & ISP32_SW_CMSK_EN_PATH_SHD))) + rkisp_write(dev, ISP3X_CMSK_CTRL0, val | ISP3X_SW_CMSK_FORCE_UPD, true); } static void rkisp_config_cmsk_dual(struct rkisp_device *dev, @@ -1348,6 +1353,11 @@ static void rkisp_config_cmsk_dual(struct rkisp_device *dev, ctrl |= ISP3X_SW_CMSK_EN | ISP3X_SW_CMSK_ORDER_MODE; } rkisp_next_write(dev, ISP3X_CMSK_CTRL0, ctrl, false); + + val = rkisp_next_read(dev, ISP3X_CMSK_CTRL0, true); + if (dev->hw_dev->is_single && + ((val & ISP32_SW_CMSK_EN_PATH) != (val & ISP32_SW_CMSK_EN_PATH_SHD))) + rkisp_next_write(dev, ISP3X_CMSK_CTRL0, val | ISP3X_SW_CMSK_FORCE_UPD, false); } static void rkisp_config_cmsk(struct rkisp_device *dev)