[PATCH v2 1/5] drm/dp: Pull drm_dp_link_power_up/down from Tegra to common drm_dp_helper
Andy Yan
andyshrk at 163.com
Wed Apr 2 09:10:16 UTC 2025
Gentle ping......
At 2025-03-27 20:54:37, "Dmitry Baryshkov" <dmitry.baryshkov at oss.qualcomm.com> wrote:
>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 at 163.com> wrote:
>>> From: Andy Yan <andy.yan at 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 at rock-chips.com>
>>> Acked-by: Dmitry Baryshkov <dmitry.baryshkov at 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
>
>
>--
>With best wishes
>Dmitry
>
>_______________________________________________
>Linux-rockchip mailing list
>Linux-rockchip at lists.infradead.org
>http://lists.infradead.org/mailman/listinfo/linux-rockchip
More information about the dri-devel
mailing list