From 66cce2b65910a4399a4bf294a5129b37a35d3b74 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Mon, 24 Jun 2024 11:52:55 +0800 Subject: [PATCH] media: rockchip: flexbus cif add support for rk3506 Signed-off-by: Zefa Chen Change-Id: I2b299246e7392e4b27ddd5aa00d9f49ede3014cb --- .../media/platform/rockchip/flexbus_cif/capture.c | 13 ++++++++++++- drivers/media/platform/rockchip/flexbus_cif/dev.c | 12 ++++++++++-- drivers/media/platform/rockchip/flexbus_cif/dev.h | 1 + 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/rockchip/flexbus_cif/capture.c b/drivers/media/platform/rockchip/flexbus_cif/capture.c index 18b3f7cd23dd..141985f77169 100644 --- a/drivers/media/platform/rockchip/flexbus_cif/capture.c +++ b/drivers/media/platform/rockchip/flexbus_cif/capture.c @@ -1037,7 +1037,7 @@ static int flexbus_cif_stream_start(struct flexbus_cif_stream *stream) flexbus_cif_write_register(dev, FLEXBUS_SLAVE_MODE, BIT(1) | BIT(0)); val = flexbus_cif_read_register(dev, FLEXBUS_RX_CTL); val &= ~FLEXBUS_DST_WAT_LVL_MASK; - val |= FLEXBUS_DFS_8BIT; + val |= dev->fb_dev->dfs_reg->dfs_8bit; val |= FLEXBUS_CONTINUE_MODE; val |= FLEXBUS_AUTOPAD; flexbus_cif_write_register(dev, FLEXBUS_RX_CTL, val); @@ -1048,6 +1048,17 @@ static int flexbus_cif_stream_start(struct flexbus_cif_stream *stream) flexbus_cif_write_register(dev, FLEXBUS_DVP_ORDER, stream->cif_fmt_in->cif_yuv_order | stream->cif_fmt_out->cif_yuv_order); + if (dev->chip_id == RK_FLEXBUS_CIF_RK3506) { + if (stream->cif_fmt_out->fourcc == V4L2_PIX_FMT_RGB24) + flexbus_cif_write_register(dev, FLEXBUS_DVP_YUV2RGB, + CIF_YUV2RGB_ENABLE | CIF_YUV2RGB_B_LSB | CIF_YUV2RGB_BT601_FULL); + else if (stream->cif_fmt_out->fourcc == V4L2_PIX_FMT_BGR24) + flexbus_cif_write_register(dev, FLEXBUS_DVP_YUV2RGB, + CIF_YUV2RGB_ENABLE | CIF_YUV2RGB_BT601_FULL); + else + flexbus_cif_write_register(dev, FLEXBUS_DVP_YUV2RGB, 0); + } + flexbus_cif_write_register_or(dev, FLEXBUS_IMR, CIF_FIFO_OVERFLOW | CIF_BANDWIDTH_LACK | CIF_DMA_END | diff --git a/drivers/media/platform/rockchip/flexbus_cif/dev.c b/drivers/media/platform/rockchip/flexbus_cif/dev.c index bef3d4953e53..9bbd93a6aa66 100644 --- a/drivers/media/platform/rockchip/flexbus_cif/dev.c +++ b/drivers/media/platform/rockchip/flexbus_cif/dev.c @@ -513,14 +513,22 @@ static int flexbus_cif_plat_uninit(struct flexbus_cif_device *cif_dev) return 0; } -static const struct flexbus_cif_match_data cif_match_data = { +static const struct flexbus_cif_match_data rk3576_cif_match_data = { .chip_id = RK_FLEXBUS_CIF_RK3576, }; +static const struct flexbus_cif_match_data rk3506_cif_match_data = { + .chip_id = RK_FLEXBUS_CIF_RK3506, +}; + static const struct of_device_id flexbus_cif_plat_of_match[] = { { .compatible = "rockchip,flexbus-cif-rk3576", - .data = &cif_match_data, + .data = &rk3576_cif_match_data, + }, + { + .compatible = "rockchip,flexbus-cif-rk3506", + .data = &rk3506_cif_match_data, }, {}, }; diff --git a/drivers/media/platform/rockchip/flexbus_cif/dev.h b/drivers/media/platform/rockchip/flexbus_cif/dev.h index 36cffa3d0441..a818b359e4c7 100644 --- a/drivers/media/platform/rockchip/flexbus_cif/dev.h +++ b/drivers/media/platform/rockchip/flexbus_cif/dev.h @@ -82,6 +82,7 @@ enum flexbus_cif_crop_src { enum flexbus_cif_chip_id { RK_FLEXBUS_CIF_RK3576, + RK_FLEXBUS_CIF_RK3506, }; struct flexbus_cif_match_data {