On Wed, Jul 17, 2024 at 08:48:29AM GMT, Dragan Simic wrote:
> Hello all,
> 
> On 2024-07-17 08:29, Dragan Simic wrote:
> > From: Ondrej Jirman <m...@xff.cz>
> > 
> > After a suspend and resume cycle, ISP1 stops receiving data, as observed
> > on the Pine64 PinePhone Pro, which is based on the Rockchip RK3399 SoC.
> > Re-initializing DPHY during the PHY power-on, if the SoC variant
> > supports
> > initialization, fixes this issue.
> > 
> > [ dsimic: Added more details to the commit summary and description ]
> > 
> > Signed-off-by: Ondrej Jirman <m...@xff.cz>
> > Signed-off-by: Dragan Simic <dsi...@manjaro.org>
> > ---
> >  drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c | 8 ++++++++
> >  1 file changed, 8 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
> > b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
> > index 4cc8ed8f4fbd..9ad48c6dfac3 100644
> > --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
> > +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
> > @@ -1240,6 +1240,14 @@ static int dw_mipi_dsi_dphy_power_on(struct phy
> > *phy)
> >             goto err_phy_cfg_clk;
> >     }
> > 
> > +   if (dsi->cdata->dphy_rx_init) {
> > +           ret = dsi->cdata->dphy_rx_init(phy);
> > +           if (ret < 0) {
> > +                   DRM_DEV_ERROR(dsi->dev, "hardware-specific phy init 
> > failed: %d\n",
> > ret);
> > +                   goto err_pwr_on;
> > +           }
> > +   }
> > +
> >     /* do soc-variant specific init */
> >     if (dsi->cdata->dphy_rx_power_on) {
> >             ret = dsi->cdata->dphy_rx_power_on(phy);
> 
> After thinking a bit more about this patch in its original form [1]
> that's preserved above, I think it would be better to move the
> additional DPHY initialization to dw_mipi_dsi_rockchip_resume(),
> because that function seems to be the right place for such fixes.
> 
> Please, let me know your thoughts.

That also works (see attachment) to fix the original issue in the commit
message, but if you keep the stream on across suspend/resume it does halt so
it's not a complete solution either.

Kind regards,
        o.

> [1] 
> https://megous.com/git/linux/commit/?h=orange-pi-6.9&id=ed7992f668a1e529719ee6847ca114f9b67efacb
>From 4db7a9a913bb4b78094d7845295d2c3306513c56 Mon Sep 17 00:00:00 2001
From: Ondrej Jirman <m...@xff.cz>
Date: Wed, 17 Jul 2024 09:30:39 +0200
Subject: [PATCH] drm: rockchip: dw-mipi-dsi-rockchip: Restore DPHY config on
 resume

After a suspend and resume cycle, ISP1 stops receiving data, as observed on the
Pine64 PinePhone Pro, which is based on the Rockchip RK3399 SoC. Re-initializing
DPHY during resume, if the SoC variant supports initialization, fixes this
issue.

Signed-off-by: Ondrej Jirman <m...@xff.cz>
---
 .../gpu/drm/rockchip/dw-mipi-dsi-rockchip.c   | 51 ++++++++++++-------
 1 file changed, 34 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c 
b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
index 364b738b6935..c2b58e545080 100644
--- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
@@ -1118,6 +1118,31 @@ static const struct component_ops 
dw_mipi_dsi_rockchip_dphy_ops = {
        .unbind = dw_mipi_dsi_rockchip_dphy_unbind,
 };
 
+static int dw_mipi_dsi_dphy_rx_init(struct dw_mipi_dsi_rockchip *dsi)
+{
+       int ret;
+
+       if (dsi->cdata->dphy_rx_init) {
+               ret = clk_prepare_enable(dsi->pclk);
+               if (ret < 0)
+                       return ret;
+
+               ret = clk_prepare_enable(dsi->grf_clk);
+               if (ret) {
+                       clk_disable_unprepare(dsi->pclk);
+                       return ret;
+               }
+
+               ret = dsi->cdata->dphy_rx_init(dsi->dphy);
+               clk_disable_unprepare(dsi->grf_clk);
+               clk_disable_unprepare(dsi->pclk);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return 0;
+}
+
 static int dw_mipi_dsi_dphy_init(struct phy *phy)
 {
        struct dw_mipi_dsi_rockchip *dsi = phy_get_drvdata(phy);
@@ -1138,23 +1163,9 @@ static int dw_mipi_dsi_dphy_init(struct phy *phy)
        if (ret < 0)
                goto err_graph;
 
-       if (dsi->cdata->dphy_rx_init) {
-               ret = clk_prepare_enable(dsi->pclk);
-               if (ret < 0)
-                       goto err_init;
-
-               ret = clk_prepare_enable(dsi->grf_clk);
-               if (ret) {
-                       clk_disable_unprepare(dsi->pclk);
-                       goto err_init;
-               }
-
-               ret = dsi->cdata->dphy_rx_init(phy);
-               clk_disable_unprepare(dsi->grf_clk);
-               clk_disable_unprepare(dsi->pclk);
-               if (ret < 0)
-                       goto err_init;
-       }
+       ret = dw_mipi_dsi_dphy_rx_init(dsi);
+       if (ret < 0)
+               goto err_init;
 
        return 0;
 
@@ -1337,6 +1348,12 @@ static int __maybe_unused 
dw_mipi_dsi_rockchip_resume(struct device *dev)
                        dw_mipi_dsi_rockchip_config(dsi->slave);
 
                clk_disable_unprepare(dsi->grf_clk);
+       } else if (dsi->usage_mode == DW_DSI_USAGE_PHY) {
+               ret = dw_mipi_dsi_dphy_rx_init(dsi);
+               if (ret < 0) {
+                       DRM_DEV_ERROR(dsi->dev, "hardware-specific phy init 
failed: %d\n", ret);
+                       return ret;
+               }
        }
 
        return 0;
-- 
2.45.2

Reply via email to