From b23a350039cfe2b22778da95bdea993de1170d7e Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Wed, 28 Feb 2024 15:43:00 +0800 Subject: [PATCH] media: rockchip: cif: fixes error of reduce frame rate for rk3576 Signed-off-by: Zefa Chen Change-Id: Ie0f6d74a70f9aa364ae096e4662eff3e5133b696 --- drivers/media/platform/rockchip/cif/capture.c | 26 ++++++++++++++----- drivers/media/platform/rockchip/cif/regs.h | 5 ++-- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index ffea919968d9..07e8244ff9fd 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -1750,11 +1750,14 @@ static void rkcif_enable_skip_frame(struct rkcif_stream *stream, int cap_m, int { struct rkcif_device *dev = stream->cifdev; u32 val = 0; + u32 skip_mask = 0; val = rkcif_read_register(dev, CIF_REG_MIPI_LVDS_CTRL); if (dev->chip_id > CHIP_RK3562_CIF) { - val &= 0xc00fffff; - val |= cap_m << RKCIF_CAP_SHIFT_RK3576 | skip_n << RKCIF_SKIP_SHIFT_RK3576; + val &= 0xffffc0ff; + skip_mask = (cap_m << RKCIF_CAP_SHIFT_RK3576) | (skip_n << RKCIF_SKIP_SHIFT_RK3576) | + RKCIF_SKIP_EN_TOTAL_RK3576; + val |= skip_mask; } else { val &= 0xffff00ff; val |= cap_m << RKCIF_CAP_SHIFT | skip_n << RKCIF_SKIP_SHIFT | RKCIF_SKIP_EN(stream->id); @@ -7712,11 +7715,20 @@ void rkcif_set_fps(struct rkcif_stream *stream, struct rkcif_fps *fps) max_common_div = rkcif_get_max_common_div(cap_m, skip_n); cap_m /= max_common_div; skip_n /= max_common_div; - if (cap_m > 64) { - skip_n = skip_n / (cap_m / 64); - if (skip_n == 0) - skip_n = 1; - cap_m = 64; + if (cif_dev->chip_id > CHIP_RK3562_CIF) { + if (cap_m > 3) { + skip_n = skip_n / (cap_m / 3); + if (skip_n == 0) + skip_n = 1; + cap_m = 3; + } + } else { + if (cap_m > 64) { + skip_n = skip_n / (cap_m / 64); + if (skip_n == 0) + skip_n = 1; + cap_m = 64; + } } if (skip_n > 7) { cap_m = cap_m / (skip_n / 7); diff --git a/drivers/media/platform/rockchip/cif/regs.h b/drivers/media/platform/rockchip/cif/regs.h index a39bb76857aa..260f8566d322 100644 --- a/drivers/media/platform/rockchip/cif/regs.h +++ b/drivers/media/platform/rockchip/cif/regs.h @@ -1081,9 +1081,10 @@ enum cif_reg_index { #define RKCIF_SKIP_SHIFT 0X15 #define RKCIF_SKIP_EN(x) (0x1 << (8 + x)) -#define RKCIF_CAP_SHIFT_RK3576 0x12 -#define RKCIF_SKIP_SHIFT_RK3576 0x09 +#define RKCIF_CAP_SHIFT_RK3576 (0x0c) +#define RKCIF_SKIP_SHIFT_RK3576 (0x09) #define RKCIF_SKIP_EN_RK3576 (0x1 << 2) +#define RKCIF_SKIP_EN_TOTAL_RK3576 (0x1 << 8) /* CIF LVDS SAV EAV Define */ #define SW_LVDS_EAV_ACT(code) (((code) & 0xfff) << 16)