Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp343533pxb; Thu, 27 Jan 2022 23:49:36 -0800 (PST) X-Google-Smtp-Source: ABdhPJxho4FsU1QTGn7G+OxZMvT6SMOj51sOMG2UbPRSncoJCV9XwiCAHkHD7NDN+P2bS+StF0tu X-Received: by 2002:a17:907:d88:: with SMTP id go8mr5367224ejc.343.1643356176323; Thu, 27 Jan 2022 23:49:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643356176; cv=none; d=google.com; s=arc-20160816; b=hgdQutGOVLRn8qLsyTjVhDSeexfkBWqcPMbl96Kl3Cq2JsSbsQ6xQCBBAxiWFTzRWd BJDJFA6UydP3ftq/pPSk69Fv+MVJaNwvx3VhxMsZTZ7lR0yacPrhAn02r0E/y+K91Lr3 lX8WPUx7v6TjBHYzm3xiITw9puZKczgJ3EcZ4gpjt00G3X/f0VtyWYWpEOJWnZ9TAhJU ljGS5LBuCjZwo19PTY1fnJLtdE/K9J4n3gEMRrNHLlPHlBF0XMwzgmRr1CFkSouoCem9 KS/U1FR7jUvQ5WNq4KZUHYYPmox3ik3SSVApDcLXiUMnXc4ObLJoJVZr/z6HOqWgdkHG ELKA== 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=5C0Bf4Sydsn3SLJKzLx6qWDei2sdzZJOHKA3CgBJh2M=; b=aPca590a6XgzXVybmK36ijPjtNzPtSb9/ZxSHUJpDuL9aWh7Q6t+0dRJLFX9UJ71Fj ReCimGWATcIHc0gKR5Wmp9ZupCqx9FtBfX5Qbyyca9XPqZ0izZjAsowOCD0faOugQ9xr dQvL0gkKShiduKGMDWDNEYScTh0Bszxu1z+wQUU1j6lPdu90pcyf9BpJmq6aIYSfrYzo yXB3aenQ6c5gmm9n5pLEuCQSweM47kwkxhpS0XCvzqnybnALTecOQ7jNoNCwNJ9gp8QP oM4PF0/DBJFcdFShTLzyLIxrGArGHKQwcND5qCNU5Eil2tPLOLFUBhXakRRS4c74mPxd pU4g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=jrFMwyF9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f4si2532899ejj.104.2022.01.27.23.49.10; Thu, 27 Jan 2022 23:49:36 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=jrFMwyF9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234294AbiA0PVn (ORCPT + 99 others); Thu, 27 Jan 2022 10:21:43 -0500 Received: from dfw.source.kernel.org ([139.178.84.217]:40054 "EHLO dfw.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231421AbiA0PVm (ORCPT ); Thu, 27 Jan 2022 10:21:42 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 6174361365 for ; Thu, 27 Jan 2022 15:21:42 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C3635C340F4 for ; Thu, 27 Jan 2022 15:21:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1643296901; bh=6uUbdqvyXcgq9NpuYUgeHOhEs8wtPSYlvefcvZmmBRI=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=jrFMwyF9ykB3Dpu+5ISuX1ADREzImskHoeq/FGkkqjP7qs6xPgbD6XYRQ+bCP/pZ+ Mso5xdIBO+3NP+6A1sYQx417/HTu6ey/LditrV4jK3UprhTsJPaFUc05pi/5kgjaN6 mSbf+qeaFRAfuAjWUGJah3wicAPjxHBEYQZZNU0PnZvWKBiaGOpMtovwGa5RQhkNQ+ 49KOa6bNlKg5aYyzB967Ul9II4FADe02j8+T/VWNKTI/NLRO/h/cwe1ghMgx4EIKmv ZJwAsEpDxFcqAEpMIDVNX5ASd7lXR/ePKx6XKYPPlQUSws5bTb9FMx1dNv8L26ZR7E LkFg0GqZGBKIQ== Received: by mail-ej1-f46.google.com with SMTP id o12so6481256eju.13 for ; Thu, 27 Jan 2022 07:21:41 -0800 (PST) X-Gm-Message-State: AOAM5318URGDcEZT1tHR5lxkiJ6bocrT1hoEtpkFv8dvis/RwnL+mJX2 w+UdgMx58XYte9l7jMcr5XriVoqUM8FjVb7xfA== X-Received: by 2002:a17:907:a089:: with SMTP id hu9mr3367621ejc.680.1643296899937; Thu, 27 Jan 2022 07:21:39 -0800 (PST) MIME-Version: 1.0 References: <20220127143623.123025-1-angelogioacchino.delregno@collabora.com> In-Reply-To: <20220127143623.123025-1-angelogioacchino.delregno@collabora.com> From: Chun-Kuang Hu Date: Thu, 27 Jan 2022 23:21:27 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v3] drm/mediatek: mtk_dsi: Avoid EPROBE_DEFER loop with external bridge To: AngeloGioacchino Del Regno Cc: DRI Development , Chun-Kuang Hu , David Airlie , linux-kernel , andrzej.hajda@intel.com, "moderated list:ARM/Mediatek SoC support" , Jagan Teki , Matthias Brugger , Collabora Kernel ML , Linux ARM Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, Angelo: AngeloGioacchino Del Regno =E6=96= =BC 2022=E5=B9=B41=E6=9C=8827=E6=97=A5 =E9=80=B1=E5=9B=9B =E4=B8=8B=E5=8D=8810:= 36=E5=AF=AB=E9=81=93=EF=BC=9A > > DRM bridge drivers are now attaching their DSI device at probe time, > which requires us to register our DSI host in order to let the bridge > to probe: this recently started producing an endless -EPROBE_DEFER > loop on some machines that are using external bridges, like the > parade-ps8640, found on the ACER Chromebook R13. > > Now that the DSI hosts/devices probe sequence is documented, we can > do adjustments to the mtk_dsi driver as to both fix now and make sure > to avoid this situation in the future: for this, following what is > documented in drm_bridge.c, move the mtk_dsi component_add() to the > mtk_dsi_ops.attach callback and delete it in the detach callback; > keeping in mind that we are registering a drm_bridge for our DSI, > which is only used/attached if the DSI Host is bound, it wouldn't > make sense to keep adding our bridge at probe time (as it would > be useless to have it if mtk_dsi_ops.attach() fails!), so also move > that one to the dsi host attach function (and remove it in detach). > > Fixes: 209264a85707 ("drm/bridge: Document the probe issue with MIPI-DSI = bridges") The fixed tag should indicate the patch which cause the bug, but why a patch just adding document would cause bug? So no any patch cause bug? This patch just want to prevent a possible bug? Regards, Chun-Kuang. > Signed-off-by: AngeloGioacchino Del Regno > Reviewed-by: Andrzej Hajda > Reviewed-by: Jagan Teki > > --- > drivers/gpu/drm/mediatek/mtk_dsi.c | 167 +++++++++++++++-------------- > 1 file changed, 84 insertions(+), 83 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediate= k/mtk_dsi.c > index 5d90d2eb0019..bced4c7d668e 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dsi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c > @@ -786,18 +786,101 @@ void mtk_dsi_ddp_stop(struct device *dev) > mtk_dsi_poweroff(dsi); > } > > +static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *= dsi) > +{ > + int ret; > + > + ret =3D drm_simple_encoder_init(drm, &dsi->encoder, > + DRM_MODE_ENCODER_DSI); > + if (ret) { > + DRM_ERROR("Failed to encoder init to drm\n"); > + return ret; > + } > + > + dsi->encoder.possible_crtcs =3D mtk_drm_find_possible_crtc_by_com= p(drm, dsi->host.dev); > + > + ret =3D drm_bridge_attach(&dsi->encoder, &dsi->bridge, NULL, > + DRM_BRIDGE_ATTACH_NO_CONNECTOR); > + if (ret) > + goto err_cleanup_encoder; > + > + dsi->connector =3D drm_bridge_connector_init(drm, &dsi->encoder); > + if (IS_ERR(dsi->connector)) { > + DRM_ERROR("Unable to create bridge connector\n"); > + ret =3D PTR_ERR(dsi->connector); > + goto err_cleanup_encoder; > + } > + drm_connector_attach_encoder(dsi->connector, &dsi->encoder); > + > + return 0; > + > +err_cleanup_encoder: > + drm_encoder_cleanup(&dsi->encoder); > + return ret; > +} > + > +static int mtk_dsi_bind(struct device *dev, struct device *master, void = *data) > +{ > + int ret; > + struct drm_device *drm =3D data; > + struct mtk_dsi *dsi =3D dev_get_drvdata(dev); > + > + ret =3D mtk_dsi_encoder_init(drm, dsi); > + if (ret) > + return ret; > + > + return device_reset_optional(dev); > +} > + > +static void mtk_dsi_unbind(struct device *dev, struct device *master, > + void *data) > +{ > + struct mtk_dsi *dsi =3D dev_get_drvdata(dev); > + > + drm_encoder_cleanup(&dsi->encoder); > +} > + > +static const struct component_ops mtk_dsi_component_ops =3D { > + .bind =3D mtk_dsi_bind, > + .unbind =3D mtk_dsi_unbind, > +}; > + > static int mtk_dsi_host_attach(struct mipi_dsi_host *host, > struct mipi_dsi_device *device) > { > struct mtk_dsi *dsi =3D host_to_dsi(host); > + struct device *dev =3D host->dev; > + int ret; > > dsi->lanes =3D device->lanes; > dsi->format =3D device->format; > dsi->mode_flags =3D device->mode_flags; > + dsi->next_bridge =3D devm_drm_of_get_bridge(dev, dev->of_node, 0,= 0); > + if (IS_ERR(dsi->next_bridge)) > + return PTR_ERR(dsi->next_bridge); > + > + drm_bridge_add(&dsi->bridge); > + > + ret =3D component_add(host->dev, &mtk_dsi_component_ops); > + if (ret) { > + DRM_ERROR("failed to add dsi_host component: %d\n", ret); > + drm_bridge_remove(&dsi->bridge); > + return ret; > + } > > return 0; > } > > +static int mtk_dsi_host_detach(struct mipi_dsi_host *host, > + struct mipi_dsi_device *device) > +{ > + struct mtk_dsi *dsi =3D host_to_dsi(host); > + > + component_del(host->dev, &mtk_dsi_component_ops); > + drm_bridge_remove(&dsi->bridge); > + return 0; > +} > + > static void mtk_dsi_wait_for_idle(struct mtk_dsi *dsi) > { > int ret; > @@ -938,73 +1021,14 @@ static ssize_t mtk_dsi_host_transfer(struct mipi_d= si_host *host, > > static const struct mipi_dsi_host_ops mtk_dsi_ops =3D { > .attach =3D mtk_dsi_host_attach, > + .detach =3D mtk_dsi_host_detach, > .transfer =3D mtk_dsi_host_transfer, > }; > > -static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *= dsi) > -{ > - int ret; > - > - ret =3D drm_simple_encoder_init(drm, &dsi->encoder, > - DRM_MODE_ENCODER_DSI); > - if (ret) { > - DRM_ERROR("Failed to encoder init to drm\n"); > - return ret; > - } > - > - dsi->encoder.possible_crtcs =3D mtk_drm_find_possible_crtc_by_com= p(drm, dsi->host.dev); > - > - ret =3D drm_bridge_attach(&dsi->encoder, &dsi->bridge, NULL, > - DRM_BRIDGE_ATTACH_NO_CONNECTOR); > - if (ret) > - goto err_cleanup_encoder; > - > - dsi->connector =3D drm_bridge_connector_init(drm, &dsi->encoder); > - if (IS_ERR(dsi->connector)) { > - DRM_ERROR("Unable to create bridge connector\n"); > - ret =3D PTR_ERR(dsi->connector); > - goto err_cleanup_encoder; > - } > - drm_connector_attach_encoder(dsi->connector, &dsi->encoder); > - > - return 0; > - > -err_cleanup_encoder: > - drm_encoder_cleanup(&dsi->encoder); > - return ret; > -} > - > -static int mtk_dsi_bind(struct device *dev, struct device *master, void = *data) > -{ > - int ret; > - struct drm_device *drm =3D data; > - struct mtk_dsi *dsi =3D dev_get_drvdata(dev); > - > - ret =3D mtk_dsi_encoder_init(drm, dsi); > - if (ret) > - return ret; > - > - return device_reset_optional(dev); > -} > - > -static void mtk_dsi_unbind(struct device *dev, struct device *master, > - void *data) > -{ > - struct mtk_dsi *dsi =3D dev_get_drvdata(dev); > - > - drm_encoder_cleanup(&dsi->encoder); > -} > - > -static const struct component_ops mtk_dsi_component_ops =3D { > - .bind =3D mtk_dsi_bind, > - .unbind =3D mtk_dsi_unbind, > -}; > - > static int mtk_dsi_probe(struct platform_device *pdev) > { > struct mtk_dsi *dsi; > struct device *dev =3D &pdev->dev; > - struct drm_panel *panel; > struct resource *regs; > int irq_num; > int ret; > @@ -1021,19 +1045,6 @@ static int mtk_dsi_probe(struct platform_device *p= dev) > return ret; > } > > - ret =3D drm_of_find_panel_or_bridge(dev->of_node, 0, 0, > - &panel, &dsi->next_bridge); > - if (ret) > - goto err_unregister_host; > - > - if (panel) { > - dsi->next_bridge =3D devm_drm_panel_bridge_add(dev, panel= ); > - if (IS_ERR(dsi->next_bridge)) { > - ret =3D PTR_ERR(dsi->next_bridge); > - goto err_unregister_host; > - } > - } > - > dsi->driver_data =3D of_device_get_match_data(dev); > > dsi->engine_clk =3D devm_clk_get(dev, "engine"); > @@ -1098,14 +1109,6 @@ static int mtk_dsi_probe(struct platform_device *p= dev) > dsi->bridge.of_node =3D dev->of_node; > dsi->bridge.type =3D DRM_MODE_CONNECTOR_DSI; > > - drm_bridge_add(&dsi->bridge); > - > - ret =3D component_add(&pdev->dev, &mtk_dsi_component_ops); > - if (ret) { > - dev_err(&pdev->dev, "failed to add component: %d\n", ret)= ; > - goto err_unregister_host; > - } > - > return 0; > > err_unregister_host: > @@ -1118,8 +1121,6 @@ static int mtk_dsi_remove(struct platform_device *p= dev) > struct mtk_dsi *dsi =3D platform_get_drvdata(pdev); > > mtk_output_dsi_disable(dsi); > - drm_bridge_remove(&dsi->bridge); > - component_del(&pdev->dev, &mtk_dsi_component_ops); > mipi_dsi_host_unregister(&dsi->host); > > return 0; > -- > 2.33.1 >