diff mbox series

drm/bridge: it6505: Send DPCD SET_POWER to downstream

Message ID 20220425134424.1150965-1-treapking@chromium.org (mailing list archive)
State New, archived
Headers show
Series drm/bridge: it6505: Send DPCD SET_POWER to downstream | expand

Commit Message

Pin-yen Lin April 25, 2022, 1:44 p.m. UTC
Send DPCD SET_POWER command to downstream in .atomic_disable to make the
downstream monitor enter the power down mode, so the device suspend won't
be affected.

Fixes: b5c84a9edcd418 ("drm/bridge: add it6505 driver")
Signed-off-by: Pin-Yen Lin <treapking@chromium.org>
---

 drivers/gpu/drm/bridge/ite-it6505.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

Comments

Robert Foss May 2, 2022, 2:37 p.m. UTC | #1
On Mon, 25 Apr 2022 at 15:44, Pin-Yen Lin <treapking@chromium.org> wrote:
>
> Send DPCD SET_POWER command to downstream in .atomic_disable to make the
> downstream monitor enter the power down mode, so the device suspend won't
> be affected.
>
> Fixes: b5c84a9edcd418 ("drm/bridge: add it6505 driver")
> Signed-off-by: Pin-Yen Lin <treapking@chromium.org>
> ---
>
>  drivers/gpu/drm/bridge/ite-it6505.c | 29 ++++++++++++++++++-----------
>  1 file changed, 18 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c
> index 8fed30df08b0..4b673c4792d7 100644
> --- a/drivers/gpu/drm/bridge/ite-it6505.c
> +++ b/drivers/gpu/drm/bridge/ite-it6505.c
> @@ -737,8 +737,9 @@ static int it6505_drm_dp_link_probe(struct drm_dp_aux *aux,
>         return 0;
>  }
>
> -static int it6505_drm_dp_link_power_up(struct drm_dp_aux *aux,
> -                                      struct it6505_drm_dp_link *link)
> +static int it6505_drm_dp_link_set_power(struct drm_dp_aux *aux,
> +                                       struct it6505_drm_dp_link *link,
> +                                       u8 mode)
>  {
>         u8 value;
>         int err;
> @@ -752,18 +753,20 @@ static int it6505_drm_dp_link_power_up(struct drm_dp_aux *aux,
>                 return err;
>
>         value &= ~DP_SET_POWER_MASK;
> -       value |= DP_SET_POWER_D0;
> +       value |= mode;
>
>         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);
> +       if (mode == DP_SET_POWER_D0) {
> +               /*
> +                * 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;
>  }
> @@ -2624,7 +2627,8 @@ static enum drm_connector_status it6505_detect(struct it6505 *it6505)
>         if (it6505_get_sink_hpd_status(it6505)) {
>                 it6505_aux_on(it6505);
>                 it6505_drm_dp_link_probe(&it6505->aux, &it6505->link);
> -               it6505_drm_dp_link_power_up(&it6505->aux, &it6505->link);
> +               it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link,
> +                                            DP_SET_POWER_D0);
>                 it6505->auto_train_retry = AUTO_TRAIN_RETRY;
>
>                 if (it6505->dpcd[0] == 0) {
> @@ -2960,8 +2964,11 @@ static void it6505_bridge_atomic_disable(struct drm_bridge *bridge,
>
>         DRM_DEV_DEBUG_DRIVER(dev, "start");
>
> -       if (it6505->powered)
> +       if (it6505->powered) {
>                 it6505_video_disable(it6505);
> +               it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link,
> +                                            DP_SET_POWER_D3);
> +       }
>  }
>
>  static enum drm_connector_status
> --
> 2.36.0.rc2.479.g8af0fa9b8e-goog
>

Reviewed-by: Robert Foss <robert.foss@linaro.org>

Applied to drm-misc-next.
diff mbox series

Patch

diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c
index 8fed30df08b0..4b673c4792d7 100644
--- a/drivers/gpu/drm/bridge/ite-it6505.c
+++ b/drivers/gpu/drm/bridge/ite-it6505.c
@@ -737,8 +737,9 @@  static int it6505_drm_dp_link_probe(struct drm_dp_aux *aux,
 	return 0;
 }
 
-static int it6505_drm_dp_link_power_up(struct drm_dp_aux *aux,
-				       struct it6505_drm_dp_link *link)
+static int it6505_drm_dp_link_set_power(struct drm_dp_aux *aux,
+					struct it6505_drm_dp_link *link,
+					u8 mode)
 {
 	u8 value;
 	int err;
@@ -752,18 +753,20 @@  static int it6505_drm_dp_link_power_up(struct drm_dp_aux *aux,
 		return err;
 
 	value &= ~DP_SET_POWER_MASK;
-	value |= DP_SET_POWER_D0;
+	value |= mode;
 
 	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);
+	if (mode == DP_SET_POWER_D0) {
+		/*
+		 * 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;
 }
@@ -2624,7 +2627,8 @@  static enum drm_connector_status it6505_detect(struct it6505 *it6505)
 	if (it6505_get_sink_hpd_status(it6505)) {
 		it6505_aux_on(it6505);
 		it6505_drm_dp_link_probe(&it6505->aux, &it6505->link);
-		it6505_drm_dp_link_power_up(&it6505->aux, &it6505->link);
+		it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link,
+					     DP_SET_POWER_D0);
 		it6505->auto_train_retry = AUTO_TRAIN_RETRY;
 
 		if (it6505->dpcd[0] == 0) {
@@ -2960,8 +2964,11 @@  static void it6505_bridge_atomic_disable(struct drm_bridge *bridge,
 
 	DRM_DEV_DEBUG_DRIVER(dev, "start");
 
-	if (it6505->powered)
+	if (it6505->powered) {
 		it6505_video_disable(it6505);
+		it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link,
+					     DP_SET_POWER_D3);
+	}
 }
 
 static enum drm_connector_status