diff mbox series

[v2,1/5] drm/dp: Pull drm_dp_link_power_up/down from Tegra to common drm_dp_helper

Message ID 20250318063452.4983-1-andyshrk@163.com (mailing list archive)
State New
Headers show
Series [v2,1/5] drm/dp: Pull drm_dp_link_power_up/down from Tegra to common drm_dp_helper | expand

Commit Message

Andy Yan March 18, 2025, 6:34 a.m. UTC
From: Andy Yan <andy.yan@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.yan@rock-chips.com>
Acked-by: Dmitry Baryshkov <dmitry.baryshkov@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(-)

Comments

Andy Yan March 27, 2025, 12:39 p.m. UTC | #1
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" <andyshrk@163.com> wrote:
>From: Andy Yan <andy.yan@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.yan@rock-chips.com>
>Acked-by: Dmitry Baryshkov <dmitry.baryshkov@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
Dmitry Baryshkov March 27, 2025, 12:54 p.m. UTC | #2
On 27/03/2025 14:39, Andy Yan wrote:
> 
> 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.

I'd really like an ack from Thiery or Mikko.

If tere is none (and no objections), I'll push it on Monday.

> 
> At 2025-03-18 14:34:35, "Andy Yan" <andyshrk@163.com> wrote:
>> From: Andy Yan <andy.yan@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.yan@rock-chips.com>
>> Acked-by: Dmitry Baryshkov <dmitry.baryshkov@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
diff mbox series

Patch

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);