<pre>
Hi, Angelo:

On Mon, 2023-07-17 at 16:14 +0200, AngeloGioacchino Del Regno wrote:
>
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
> In order to support usecases in which the panel regulator can be
> switched on and off to save power, and usecases in which the panel
> regulator is off at boot, add a .wait_hpd_asserted() callback for
> the AUX bus: this will make sure to wait until the panel is fully
> ready after power-on before trying to communicate with it.
>
> Also, parse the eDP display capabilities in that callback, so that
> we can also avoid using the .get_edid() callback from this bridge.
>
> Since at this point the hpd machinery is performed in the new hpd
> callback and the detection and edid reading are done outside of
> this driver, assign the DRM_BRIDGE_OP_{DETECT, EDID, HPD} ops and
> register the bridge unconditionally at probe time only if we are
> probing full DisplayPort and not eDP while, for the latter, we
> register the bridge in the .done_probing() callback and only if
> the panel was found and triggered HPD.

Reviewed-by: CK Hu <ck.hu@mediatek.com>

>
> Signed-off-by: AngeloGioacchino Del Regno <
> angelogioacchino.delregno@collabora.com>
> ---
> drivers/gpu/drm/mediatek/mtk_dp.c | 45 ++++++++++++++++++++++++++---
> --
> 1 file changed, 38 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c
> b/drivers/gpu/drm/mediatek/mtk_dp.c
> index acdd457b5449..e74295ba9707 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dp.c
> @@ -1920,6 +1920,31 @@ static irqreturn_t mtk_dp_hpd_event(int hpd,
> void *dev)
> return IRQ_WAKE_THREAD;
> }
>
> +static int mtk_dp_wait_hpd_asserted(struct drm_dp_aux *mtk_aux,
> unsigned long wait_us)
> +{
> +struct mtk_dp *mtk_dp = container_of(mtk_aux, struct mtk_dp,
> aux);
> +u32 val;
> +int ret;
> +
> +ret = regmap_read_poll_timeout(mtk_dp->regs,
> MTK_DP_TRANS_P0_3414,
> + val, !!(val &
> HPD_DB_DP_TRANS_P0_MASK),
> + wait_us / 100, wait_us);
> +if (ret) {
> +mtk_dp->train_info.cable_plugged_in = false;
> +return ret;
> +}
> +
> +mtk_dp->train_info.cable_plugged_in = true;
> +
> +ret = mtk_dp_parse_capabilities(mtk_dp);
> +if (ret) {
> +drm_err(mtk_dp->drm_dev, "Can't parse capabilities\n");
> +return ret;
> +}
> +
> +return 0;
> +}
> +
> static int mtk_dp_dt_parse(struct mtk_dp *mtk_dp,
> struct platform_device *pdev)
> {
> @@ -2532,6 +2557,12 @@ static int mtk_dp_edp_link_panel(struct
> drm_dp_aux *mtk_aux)
> mtk_dp->next_bridge = NULL;
> return ret;
> }
> +
> +/* For eDP, we add the bridge only if the panel was found */
> +ret = devm_drm_bridge_add(dev, &mtk_dp->bridge);
> +if (ret)
> +return ret;
> +
> return 0;
> }
>
> @@ -2568,6 +2599,7 @@ static int mtk_dp_probe(struct platform_device
> *pdev)
> mtk_dp->aux.name = "aux_mtk_dp";
> mtk_dp->aux.dev = dev;
> mtk_dp->aux.transfer = mtk_dp_aux_transfer;
> +mtk_dp->aux.wait_hpd_asserted = mtk_dp_wait_hpd_asserted;
> drm_dp_aux_init(&mtk_dp->aux);
>
> spin_lock_init(&mtk_dp->irq_thread_lock);
> @@ -2600,15 +2632,8 @@ static int mtk_dp_probe(struct platform_device
> *pdev)
>
> mtk_dp->bridge.funcs = &mtk_dp_bridge_funcs;
> mtk_dp->bridge.of_node = dev->of_node;
> -
> -mtk_dp->bridge.ops =
> -DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID |
> DRM_BRIDGE_OP_HPD;
> mtk_dp->bridge.type = mtk_dp->data->bridge_type;
>
> -ret = devm_drm_bridge_add(dev, &mtk_dp->bridge);
> -if (ret)
> -return dev_err_probe(dev, ret, "Failed to add
> bridge\n");
> -
> mtk_dp->need_debounce = true;
> timer_setup(&mtk_dp->debounce_timer, mtk_dp_debounce_timer, 0);
>
> @@ -2647,6 +2672,12 @@ static int mtk_dp_probe(struct platform_device
> *pdev)
> return ret;
> }
> }
> +} else {
> +mtk_dp->bridge.ops = DRM_BRIDGE_OP_DETECT |
> + DRM_BRIDGE_OP_EDID |
> DRM_BRIDGE_OP_HPD;
> +ret = devm_drm_bridge_add(dev, &mtk_dp->bridge);
> +if (ret)
> +return dev_err_probe(dev, ret, "Failed to add
> bridge\n");
> }
>
> pm_runtime_enable(dev);
> --
> 2.40.1

</pre><!--type:text--><!--{--><pre>************* MEDIATEK Confidentiality Notice ********************
The information contained in this e-mail message (including any 
attachments) may be confidential, proprietary, privileged, or otherwise
exempt from disclosure under applicable laws. It is intended to be 
conveyed only to the designated recipient(s). Any use, dissemination, 
distribution, printing, retaining or copying of this e-mail (including its 
attachments) by unintended recipient(s) is strictly prohibited and may 
be unlawful. If you are not an intended recipient of this e-mail, or believe 
that you have received this e-mail in error, please notify the sender 
immediately (by replying to this e-mail), delete any and all copies of 
this e-mail (including any attachments) from your system, and do not
disclose the content of this e-mail to any other person. Thank you!
</pre><!--}-->