Gentle ping......
At 2025-03-27 20:54:37, "Dmitry Baryshkov" <dmitry.barysh...@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" <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 > > >-- >With best wishes >Dmitry > >_______________________________________________ >Linux-rockchip mailing list >linux-rockc...@lists.infradead.org >http://lists.infradead.org/mailman/listinfo/linux-rockchip