Hello Dmitry,
     Could you take this series? If so, merging it earlier can avoid future 
conflicts from other patches. 
Besides, I can update my DP driver based on drm-misc-next.

At 2025-03-18 14:34:35, "Andy Yan" <andys...@163.com> wrote:
>From: Andy Yan <andy....@rock-chips.com>
>
>The helper functions drm_dp_link_power_up/down were moved to Tegra
>DRM in commit 9a42c7c647a9 ("drm/tegra: Move drm_dp_link helpers to Tegra 
>DRM")".
>
>Now since more and more users are duplicating the same code in their
>own drivers, it's time to make them as DRM DP common helpers again.
>
>Signed-off-by: Andy Yan <andy....@rock-chips.com>
>Acked-by: Dmitry Baryshkov <dmitry.barysh...@oss.qualcomm.com>
>---
>
>Changes in v2:
>- Fix commit message as suggested by Dmitry
>
> drivers/gpu/drm/display/drm_dp_helper.c | 69 +++++++++++++++++++++++++
> drivers/gpu/drm/tegra/dp.c              | 67 ------------------------
> drivers/gpu/drm/tegra/dp.h              |  2 -
> drivers/gpu/drm/tegra/sor.c             |  4 +-
> include/drm/display/drm_dp_helper.h     |  2 +
> 5 files changed, 73 insertions(+), 71 deletions(-)
>
>diff --git a/drivers/gpu/drm/display/drm_dp_helper.c 
>b/drivers/gpu/drm/display/drm_dp_helper.c
>index dbce1c3f4969..e5dec67e5fca 100644
>--- a/drivers/gpu/drm/display/drm_dp_helper.c
>+++ b/drivers/gpu/drm/display/drm_dp_helper.c
>@@ -838,6 +838,75 @@ int drm_dp_dpcd_read_phy_link_status(struct drm_dp_aux 
>*aux,
> }
> EXPORT_SYMBOL(drm_dp_dpcd_read_phy_link_status);
> 
>+/**
>+ * drm_dp_link_power_up() - power up a DisplayPort link
>+ * @aux: DisplayPort AUX channel
>+ * @revision: DPCD revision supported on the link
>+ *
>+ * Returns 0 on success or a negative error code on failure.
>+ */
>+int drm_dp_link_power_up(struct drm_dp_aux *aux, unsigned char revision)
>+{
>+      u8 value;
>+      int err;
>+
>+      /* DP_SET_POWER register is only available on DPCD v1.1 and later */
>+      if (revision < DP_DPCD_REV_11)
>+              return 0;
>+
>+      err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value);
>+      if (err < 0)
>+              return err;
>+
>+      value &= ~DP_SET_POWER_MASK;
>+      value |= DP_SET_POWER_D0;
>+
>+      err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
>+      if (err < 0)
>+              return err;
>+
>+      /*
>+       * According to the DP 1.1 specification, a "Sink Device must exit the
>+       * power saving state within 1 ms" (Section 2.5.3.1, Table 5-52, "Sink
>+       * Control Field" (register 0x600).
>+       */
>+      usleep_range(1000, 2000);
>+
>+      return 0;
>+}
>+EXPORT_SYMBOL(drm_dp_link_power_up);
>+
>+/**
>+ * drm_dp_link_power_down() - power down a DisplayPort link
>+ * @aux: DisplayPort AUX channel
>+ * @revision: DPCD revision supported on the link
>+ *
>+ * Returns 0 on success or a negative error code on failure.
>+ */
>+int drm_dp_link_power_down(struct drm_dp_aux *aux, unsigned char revision)
>+{
>+      u8 value;
>+      int err;
>+
>+      /* DP_SET_POWER register is only available on DPCD v1.1 and later */
>+      if (revision < DP_DPCD_REV_11)
>+              return 0;
>+
>+      err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value);
>+      if (err < 0)
>+              return err;
>+
>+      value &= ~DP_SET_POWER_MASK;
>+      value |= DP_SET_POWER_D3;
>+
>+      err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
>+      if (err < 0)
>+              return err;
>+
>+      return 0;
>+}
>+EXPORT_SYMBOL(drm_dp_link_power_down);
>+
> static int read_payload_update_status(struct drm_dp_aux *aux)
> {
>       int ret;
>diff --git a/drivers/gpu/drm/tegra/dp.c b/drivers/gpu/drm/tegra/dp.c
>index 08fbd8f151a1..990e744b0923 100644
>--- a/drivers/gpu/drm/tegra/dp.c
>+++ b/drivers/gpu/drm/tegra/dp.c
>@@ -255,73 +255,6 @@ int drm_dp_link_probe(struct drm_dp_aux *aux, struct 
>drm_dp_link *link)
>       return 0;
> }
> 
>-/**
>- * drm_dp_link_power_up() - power up a DisplayPort link
>- * @aux: DisplayPort AUX channel
>- * @link: pointer to a structure containing the link configuration
>- *
>- * Returns 0 on success or a negative error code on failure.
>- */
>-int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link)
>-{
>-      u8 value;
>-      int err;
>-
>-      /* DP_SET_POWER register is only available on DPCD v1.1 and later */
>-      if (link->revision < 0x11)
>-              return 0;
>-
>-      err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value);
>-      if (err < 0)
>-              return err;
>-
>-      value &= ~DP_SET_POWER_MASK;
>-      value |= DP_SET_POWER_D0;
>-
>-      err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
>-      if (err < 0)
>-              return err;
>-
>-      /*
>-       * According to the DP 1.1 specification, a "Sink Device must exit the
>-       * power saving state within 1 ms" (Section 2.5.3.1, Table 5-52, "Sink
>-       * Control Field" (register 0x600).
>-       */
>-      usleep_range(1000, 2000);
>-
>-      return 0;
>-}
>-
>-/**
>- * drm_dp_link_power_down() - power down a DisplayPort link
>- * @aux: DisplayPort AUX channel
>- * @link: pointer to a structure containing the link configuration
>- *
>- * Returns 0 on success or a negative error code on failure.
>- */
>-int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link)
>-{
>-      u8 value;
>-      int err;
>-
>-      /* DP_SET_POWER register is only available on DPCD v1.1 and later */
>-      if (link->revision < 0x11)
>-              return 0;
>-
>-      err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value);
>-      if (err < 0)
>-              return err;
>-
>-      value &= ~DP_SET_POWER_MASK;
>-      value |= DP_SET_POWER_D3;
>-
>-      err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
>-      if (err < 0)
>-              return err;
>-
>-      return 0;
>-}
>-
> /**
>  * drm_dp_link_configure() - configure a DisplayPort link
>  * @aux: DisplayPort AUX channel
>diff --git a/drivers/gpu/drm/tegra/dp.h b/drivers/gpu/drm/tegra/dp.h
>index cb12ed0c54e7..695060cafac0 100644
>--- a/drivers/gpu/drm/tegra/dp.h
>+++ b/drivers/gpu/drm/tegra/dp.h
>@@ -164,8 +164,6 @@ int drm_dp_link_remove_rate(struct drm_dp_link *link, 
>unsigned long rate);
> void drm_dp_link_update_rates(struct drm_dp_link *link);
> 
> int drm_dp_link_probe(struct drm_dp_aux *aux, struct drm_dp_link *link);
>-int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link);
>-int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link);
> int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link);
> int drm_dp_link_choose(struct drm_dp_link *link,
>                      const struct drm_display_mode *mode,
>diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c
>index f98f70eda906..21f3dfdcc5c9 100644
>--- a/drivers/gpu/drm/tegra/sor.c
>+++ b/drivers/gpu/drm/tegra/sor.c
>@@ -2666,7 +2666,7 @@ static void tegra_sor_dp_disable(struct drm_encoder 
>*encoder)
>        * the AUX transactions would just be timing out.
>        */
>       if (output->connector.status != connector_status_disconnected) {
>-              err = drm_dp_link_power_down(sor->aux, &sor->link);
>+              err = drm_dp_link_power_down(sor->aux, sor->link.revision);
>               if (err < 0)
>                       dev_err(sor->dev, "failed to power down link: %d\n",
>                               err);
>@@ -2882,7 +2882,7 @@ static void tegra_sor_dp_enable(struct drm_encoder 
>*encoder)
>       else
>               dev_dbg(sor->dev, "link training succeeded\n");
> 
>-      err = drm_dp_link_power_up(sor->aux, &sor->link);
>+      err = drm_dp_link_power_up(sor->aux, sor->link.revision);
>       if (err < 0)
>               dev_err(sor->dev, "failed to power up DP link: %d\n", err);
> 
>diff --git a/include/drm/display/drm_dp_helper.h 
>b/include/drm/display/drm_dp_helper.h
>index 5ae4241959f2..f9dabce484a7 100644
>--- a/include/drm/display/drm_dp_helper.h
>+++ b/include/drm/display/drm_dp_helper.h
>@@ -566,6 +566,8 @@ int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux,
> int drm_dp_dpcd_read_phy_link_status(struct drm_dp_aux *aux,
>                                    enum drm_dp_phy dp_phy,
>                                    u8 link_status[DP_LINK_STATUS_SIZE]);
>+int drm_dp_link_power_up(struct drm_dp_aux *aux, unsigned char revision);
>+int drm_dp_link_power_down(struct drm_dp_aux *aux, unsigned char revision);
> 
> int drm_dp_dpcd_write_payload(struct drm_dp_aux *aux,
>                             int vcpid, u8 start_time_slot, u8 
> time_slot_count);
>-- 
>2.43.0

Reply via email to