From fefe9843bc60b7ce08d29f21f83c39e4516d6173 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Thu, 4 May 2023 20:20:55 +0800 Subject: [PATCH] phy: rockchip: samsung-dcphy: restart rx after apb reset when rx is streaming Signed-off-by: Zefa Chen Change-Id: I9e5e8607b8c824daca8ea820d785323e0ac8c8fa --- .../phy/rockchip/phy-rockchip-samsung-dcphy.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c b/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c index 5cd100255fa9..8e9e71923791 100644 --- a/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c +++ b/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c @@ -1731,15 +1731,31 @@ static void samsung_mipi_cphy_power_on(struct samsung_mipi_dcphy *samsung) reset_control_deassert(samsung->m_phy_rst); } +static struct v4l2_subdev *get_remote_sensor(struct v4l2_subdev *sd); + static int samsung_mipi_dcphy_power_on(struct phy *phy) { struct samsung_mipi_dcphy *samsung = phy_get_drvdata(phy); enum phy_mode mode = phy_get_mode(phy); + int on = 0; + struct v4l2_subdev *sensor_sd = NULL; pm_runtime_get_sync(samsung->dev); reset_control_assert(samsung->apb_rst); udelay(1); reset_control_deassert(samsung->apb_rst); + if (atomic_read(&samsung->stream_cnt)) { + sensor_sd = get_remote_sensor(&samsung->dphy_dev[0]->sd); + samsung->stream_off(samsung->dphy_dev[0], &samsung->dphy_dev[0]->sd); + if (sensor_sd) + v4l2_subdev_call(sensor_sd, core, ioctl, + RKMODULE_SET_QUICK_STREAM, &on); + samsung->stream_on(samsung->dphy_dev[0], &samsung->dphy_dev[0]->sd); + on = 1; + if (sensor_sd) + v4l2_subdev_call(sensor_sd, core, ioctl, + RKMODULE_SET_QUICK_STREAM, &on); + } switch (mode) { case PHY_MODE_MIPI_DPHY: