Received: by 2002:a05:6358:11c7:b0:104:8066:f915 with SMTP id i7csp1817190rwl; Thu, 6 Apr 2023 01:24:26 -0700 (PDT) X-Google-Smtp-Source: AKy350aPvoQcOUIXlEIbNvf3V802g4IjUHg4QJ+XrWZZpT9/l8XYrIPBf8cf9gZsBuy0MjrrJExF X-Received: by 2002:a62:790b:0:b0:626:f1d5:68a with SMTP id u11-20020a62790b000000b00626f1d5068amr8868048pfc.34.1680769466510; Thu, 06 Apr 2023 01:24:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680769466; cv=none; d=google.com; s=arc-20160816; b=BXu416g5yYO0OObB7vctsk+iAPQd3OWth2mixYTsa/nUWmZXUsAntX5BNNEcDbkC3E X6YGZbnVzwENyxOYcDYe2WJR4GUcnlnTOuLAqlP0Pm1FPeDcJPSudJPWNb+DAiahxoHy ZMB5U2qOQvSxEDtB8Xu2uSVZcwkM5ehfekLJVdyNwAoLCzlHxvD/9LFnTkxWxeTfN3Dk Xnss9ancN6eoFUBbUtNiCrTYFCXBeHSwOj5V9g4jNuCWGXAPn2N3HxVubazg4srRR2ok xsj9rBa7Vy10wnD9ZCrMPYglu3KdV4/kcCKRAE/Tlu4GN4aOHSbOY75qf0x9xEIMIySF 4AOw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=nAfsXtBn0nzDoaEWurrUoZWu1BXoDWafMp8Ribw2xoM=; b=PMzD4wM7iTE5to8iXwrzDfyQafq9+9kqgKH/bZkC2zQuDmCWjaALYzw1k/o7+8JFUe UWF+FQkarKAPbRurKharOJeW2QaZNkNecfy9skA+NsbaBz5COd8JChKZvh/oX0YiunIx X6/wf37WbhG51iuiJnLU8LwhOb1uSRyoZJB/+624sjBBqW7D3YG1AupWmGOU+5WZvxBW 5nLW90YEEIfJrPdfCNw6LNaZOQmYzwfvZLRaHvjiCeJz+N5aAtJTtcKVUdivp99WS9Aa MrBqd1UgliylreIuhCvhmorYJjmxW4n1pMwoOOdUoMgDpBHLyHKkLDsFAZNu9lkoInli i4Vg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=RWBBfn97; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s75-20020a632c4e000000b005141c6761b2si728977pgs.800.2023.04.06.01.24.14; Thu, 06 Apr 2023 01:24:26 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=RWBBfn97; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234936AbjDFIVD (ORCPT + 99 others); Thu, 6 Apr 2023 04:21:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34540 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229896AbjDFIVC (ORCPT ); Thu, 6 Apr 2023 04:21:02 -0400 Received: from mail-vs1-xe29.google.com (mail-vs1-xe29.google.com [IPv6:2607:f8b0:4864:20::e29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BA9CE10F1 for ; Thu, 6 Apr 2023 01:21:00 -0700 (PDT) Received: by mail-vs1-xe29.google.com with SMTP id dc30so33245346vsb.3 for ; Thu, 06 Apr 2023 01:21:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1680769260; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=nAfsXtBn0nzDoaEWurrUoZWu1BXoDWafMp8Ribw2xoM=; b=RWBBfn97A35m/Jk0+ZQHiYyz1tSkPCA8NXd7OvfztgUpqnxS4IwrXVkPgsvbhI3K8J C2Y1gq8zbIz8ovfukafOgPsUgiw3fdIeDRR2tV18tFbtNt6tWwiKMxM0vzPzoPg84LTN MlOAEz0P0HNHAPDpegqFGjb1/3jTgRac52EvA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680769260; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nAfsXtBn0nzDoaEWurrUoZWu1BXoDWafMp8Ribw2xoM=; b=Qvp9uev+dUqCl/eMS+2Rf8miZWeDHyTlOSA17WURm2S2+PwhqF0T/yKZk4uKJthyX1 CNf/a5qC0NvpQZj77gnsc66vtFiqQZ4SJG9N1e9jaebSeuFCsejsGQmGiV/FIANL6gqs 8jLGaUEUsgc2/X3STMKgjvSmhDJXUgw5GPkpX9tsDMowCcvcohZNOZNVQuvbamMBTuk6 mnKesd9hk0v8yfLQEnTUgR06IB+8/zUJ70+Sj5cLJa+8owRNXrJTaYcY1MbO4fpFlVe0 5EMgtIWRFhy8OJaEao2kxTcL7wyMSwBHyn5tT+NV1r+P4G6ozZqr12Ac1wn61AaEKpe+ GkjQ== X-Gm-Message-State: AAQBX9c2Vp+ALvO+7MFWSEeJCGt3KGonycunusYqoKgd63QO8Kyh2SU3 V20ljaQmOAZTw9D/GH49zBu3/rFVS78jShx07shnYg== X-Received: by 2002:a67:c81e:0:b0:414:4ef3:839 with SMTP id u30-20020a67c81e000000b004144ef30839mr6485313vsk.7.1680769259766; Thu, 06 Apr 2023 01:20:59 -0700 (PDT) MIME-Version: 1.0 References: <20230404104800.301150-1-angelogioacchino.delregno@collabora.com> <20230404104800.301150-3-angelogioacchino.delregno@collabora.com> In-Reply-To: <20230404104800.301150-3-angelogioacchino.delregno@collabora.com> From: Chen-Yu Tsai Date: Thu, 6 Apr 2023 16:20:48 +0800 Message-ID: Subject: Re: [PATCH v3 2/9] drm/mediatek: dp: Move AUX and panel poweron/off sequence to function To: AngeloGioacchino Del Regno Cc: chunkuang.hu@kernel.org, p.zabel@pengutronix.de, airlied@gmail.com, daniel@ffwll.ch, matthias.bgg@gmail.com, dri-devel@lists.freedesktop.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kernel@collabora.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-0.2 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Apr 4, 2023 at 6:48=E2=80=AFPM AngeloGioacchino Del Regno wrote: > > Everytime we run bridge detection and/or EDID read we run a poweron > and poweroff sequence for both the AUX and the panel; moreover, this > is also done when enabling the bridge in the .atomic_enable() callback. > > Move this power on/off sequence to a new mtk_dp_aux_panel_poweron() > function as to commonize it. > Note that, before this commit, in mtk_dp_bridge_atomic_enable() only > the AUX was getting powered on but the panel was left powered off if > the DP cable wasn't plugged in while now we unconditionally send a D0 > request and this is done for two reasons: > - First, whether this request fails or not, it takes the same time > and anyway the DP hardware won't produce any error (or, if it > does, it's ignorable because it won't block further commands) > - Second, training the link between a sleeping/standby/unpowered > display makes little sense. > > Signed-off-by: AngeloGioacchino Del Regno > --- > drivers/gpu/drm/mediatek/mtk_dp.c | 76 ++++++++++++------------------- > 1 file changed, 30 insertions(+), 46 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek= /mtk_dp.c > index 84f82cc68672..76ea94167531 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dp.c > +++ b/drivers/gpu/drm/mediatek/mtk_dp.c > @@ -1253,6 +1253,29 @@ static void mtk_dp_audio_mute(struct mtk_dp *mtk_d= p, bool mute) > val[2], AU_TS_CFG_DP_ENC0_P0_MASK); > } > > +static void mtk_dp_aux_panel_poweron(struct mtk_dp *mtk_dp, bool pwron) > +{ > + if (pwron) { > + /* power on aux */ > + mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE, > + DP_PWR_STATE_BANDGAP_TPLL_LANE, > + DP_PWR_STATE_MASK); > + > + /* power on panel */ > + drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POW= ER_D0); > + usleep_range(2000, 5000); > + } else { > + /* power off panel */ > + drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POW= ER_D3); > + usleep_range(2000, 3000); > + > + /* power off aux */ > + mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE, > + DP_PWR_STATE_BANDGAP_TPLL, > + DP_PWR_STATE_MASK); > + } > +} > + > static void mtk_dp_power_enable(struct mtk_dp *mtk_dp) > { > mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_RESET_AND_PROBE, > @@ -1937,16 +1960,9 @@ static enum drm_connector_status mtk_dp_bdg_detect= (struct drm_bridge *bridge) > if (!mtk_dp->train_info.cable_plugged_in) > return ret; > > - if (!enabled) { > - /* power on aux */ > - mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE, > - DP_PWR_STATE_BANDGAP_TPLL_LANE, > - DP_PWR_STATE_MASK); > + if (!enabled) > + mtk_dp_aux_panel_poweron(mtk_dp, true); > > - /* power on panel */ > - drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POW= ER_D0); I suspect the original code was somewhat wrong already? We shouldn't need to pull the panel out of standby just for HPD or reading EDID. This driver probably needs a lot more cleanup. :/ ChenYu > - usleep_range(2000, 5000); > - } > /* > * Some dongles still source HPD when they do not connect to any > * sink device. To avoid this, we need to read the sink count > @@ -1958,16 +1974,8 @@ static enum drm_connector_status mtk_dp_bdg_detect= (struct drm_bridge *bridge) > if (DP_GET_SINK_COUNT(sink_count)) > ret =3D connector_status_connected; > > - if (!enabled) { > - /* power off panel */ > - drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POW= ER_D3); > - usleep_range(2000, 3000); > - > - /* power off aux */ > - mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE, > - DP_PWR_STATE_BANDGAP_TPLL, > - DP_PWR_STATE_MASK); > - } > + if (!enabled) > + mtk_dp_aux_panel_poweron(mtk_dp, false); > > return ret; > } > @@ -1983,15 +1991,7 @@ static struct edid *mtk_dp_get_edid(struct drm_bri= dge *bridge, > > if (!enabled) { > drm_atomic_bridge_chain_pre_enable(bridge, connector->sta= te->state); > - > - /* power on aux */ > - mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE, > - DP_PWR_STATE_BANDGAP_TPLL_LANE, > - DP_PWR_STATE_MASK); > - > - /* power on panel */ > - drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POW= ER_D0); > - usleep_range(2000, 5000); > + mtk_dp_aux_panel_poweron(mtk_dp, true); > } > > /* eDP panels aren't removable, so we can return a cached EDID. *= / > @@ -2015,15 +2015,7 @@ static struct edid *mtk_dp_get_edid(struct drm_bri= dge *bridge, > } > > if (!enabled) { > - /* power off panel */ > - drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POW= ER_D3); > - usleep_range(2000, 3000); > - > - /* power off aux */ > - mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE, > - DP_PWR_STATE_BANDGAP_TPLL, > - DP_PWR_STATE_MASK); > - > + mtk_dp_aux_panel_poweron(mtk_dp, false); > drm_atomic_bridge_chain_post_disable(bridge, connector->s= tate->state); > } > > @@ -2188,15 +2180,7 @@ static void mtk_dp_bridge_atomic_enable(struct drm= _bridge *bridge, > return; > } > > - /* power on aux */ > - mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE, > - DP_PWR_STATE_BANDGAP_TPLL_LANE, > - DP_PWR_STATE_MASK); > - > - if (mtk_dp->train_info.cable_plugged_in) { > - drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POW= ER_D0); > - usleep_range(2000, 5000); > - } > + mtk_dp_aux_panel_poweron(mtk_dp, true); > > /* Training */ > ret =3D mtk_dp_training(mtk_dp); > -- > 2.40.0 >