From d5e575bdf73249e82315db0ea25abcb0188048c2 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Wed, 27 Aug 2025 15:55:24 +0800 Subject: [PATCH] phy: rockchip: csi2-dphy: fixes lvds bit-width error for rv1126b Change-Id: I56007548f832c3c89c6e2be324c30ca5445945a2 Signed-off-by: Zefa Chen --- .../phy/rockchip/phy-rockchip-csi2-dphy-hw.c | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-csi2-dphy-hw.c b/drivers/phy/rockchip/phy-rockchip-csi2-dphy-hw.c index 4e96b19ac333..2816abd07a00 100644 --- a/drivers/phy/rockchip/phy-rockchip-csi2-dphy-hw.c +++ b/drivers/phy/rockchip/phy-rockchip-csi2-dphy-hw.c @@ -650,6 +650,40 @@ static unsigned char get_lvds_data_width(u32 pixelformat) } } +static unsigned char get_lvds_data_width_rv1126b(u32 pixelformat) +{ + switch (pixelformat) { + /* csi raw8 */ + case MEDIA_BUS_FMT_SBGGR8_1X8: + case MEDIA_BUS_FMT_SGBRG8_1X8: + case MEDIA_BUS_FMT_SGRBG8_1X8: + case MEDIA_BUS_FMT_SRGGB8_1X8: + return 0x1; + /* csi raw10 */ + case MEDIA_BUS_FMT_SBGGR10_1X10: + case MEDIA_BUS_FMT_SGBRG10_1X10: + case MEDIA_BUS_FMT_SGRBG10_1X10: + case MEDIA_BUS_FMT_SRGGB10_1X10: + return 0x2; + /* csi raw12 */ + case MEDIA_BUS_FMT_SBGGR12_1X12: + case MEDIA_BUS_FMT_SGBRG12_1X12: + case MEDIA_BUS_FMT_SGRBG12_1X12: + case MEDIA_BUS_FMT_SRGGB12_1X12: + return 0x3; + /* csi uyvy 422 */ + case MEDIA_BUS_FMT_UYVY8_2X8: + case MEDIA_BUS_FMT_VYUY8_2X8: + case MEDIA_BUS_FMT_YUYV8_2X8: + case MEDIA_BUS_FMT_YVYU8_2X8: + case MEDIA_BUS_FMT_RGB888_1X24: + return 0x1; + + default: + return 0x2; + } +} + static void csi2_dphy_hw_do_reset(struct csi2_dphy_hw *hw) { if (hw->rsts_bulk) @@ -991,7 +1025,10 @@ static int csi2_dphy_hw_stream_on(struct csi2_dphy *dphy, write_csi2_dphy_reg(hw, CSI2PHY_PATH0_MODEL, 0x2); } else { write_csi2_dphy_reg(hw, CSI2PHY_PATH0_MODEL, 0x4); - lvds_width = get_lvds_data_width(sensor->format.code); + if (hw->drv_data->chip_id == CHIP_ID_RV1126B) + lvds_width = get_lvds_data_width_rv1126b(sensor->format.code); + else + lvds_width = get_lvds_data_width(sensor->format.code); write_csi2_dphy_reg(hw, CSI2PHY_PATH0_LVDS_MODEL, (lvds_width << 4) | 0X0f); } } else { @@ -999,7 +1036,10 @@ static int csi2_dphy_hw_stream_on(struct csi2_dphy *dphy, write_csi2_dphy_reg(hw, CSI2PHY_PATH1_MODEL, 0x2); } else { write_csi2_dphy_reg(hw, CSI2PHY_PATH1_MODEL, 0x4); - lvds_width = get_lvds_data_width(sensor->format.code); + if (hw->drv_data->chip_id == CHIP_ID_RV1126B) + lvds_width = get_lvds_data_width_rv1126b(sensor->format.code); + else + lvds_width = get_lvds_data_width(sensor->format.code); write_csi2_dphy_reg(hw, CSI2PHY_PATH1_LVDS_MODEL, (lvds_width << 4) | 0X0f); } }