drm/bridge: it6505: Send DPCD SET_POWER to downstream
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: b5c84a9edc
("drm/bridge: add it6505 driver")
Signed-off-by: Pin-Yen Lin <treapking@chromium.org>
Signed-off-by: Robert Foss <robert.foss@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20220425134424.1150965-1-treapking@chromium.org
Reviewed-by: Robert Foss <robert.foss@linaro.org>
This commit is contained in:
parent
7eafbecd22
commit
46ca7da7f1
1 changed files with 18 additions and 11 deletions
|
@ -737,8 +737,9 @@ static int it6505_drm_dp_link_probe(struct drm_dp_aux *aux,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int it6505_drm_dp_link_power_up(struct drm_dp_aux *aux,
|
static int it6505_drm_dp_link_set_power(struct drm_dp_aux *aux,
|
||||||
struct it6505_drm_dp_link *link)
|
struct it6505_drm_dp_link *link,
|
||||||
|
u8 mode)
|
||||||
{
|
{
|
||||||
u8 value;
|
u8 value;
|
||||||
int err;
|
int err;
|
||||||
|
@ -752,18 +753,20 @@ static int it6505_drm_dp_link_power_up(struct drm_dp_aux *aux,
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
value &= ~DP_SET_POWER_MASK;
|
value &= ~DP_SET_POWER_MASK;
|
||||||
value |= DP_SET_POWER_D0;
|
value |= mode;
|
||||||
|
|
||||||
err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
|
err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
/*
|
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
|
* According to the DP 1.1 specification, a "Sink Device must
|
||||||
* Control Field" (register 0x600).
|
* 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);
|
*/
|
||||||
|
usleep_range(1000, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2624,7 +2627,8 @@ static enum drm_connector_status it6505_detect(struct it6505 *it6505)
|
||||||
if (it6505_get_sink_hpd_status(it6505)) {
|
if (it6505_get_sink_hpd_status(it6505)) {
|
||||||
it6505_aux_on(it6505);
|
it6505_aux_on(it6505);
|
||||||
it6505_drm_dp_link_probe(&it6505->aux, &it6505->link);
|
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;
|
it6505->auto_train_retry = AUTO_TRAIN_RETRY;
|
||||||
|
|
||||||
if (it6505->dpcd[0] == 0) {
|
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");
|
DRM_DEV_DEBUG_DRIVER(dev, "start");
|
||||||
|
|
||||||
if (it6505->powered)
|
if (it6505->powered) {
|
||||||
it6505_video_disable(it6505);
|
it6505_video_disable(it6505);
|
||||||
|
it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link,
|
||||||
|
DP_SET_POWER_D3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum drm_connector_status
|
static enum drm_connector_status
|
||||||
|
|
Loading…
Add table
Reference in a new issue