From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS autolearn=no autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790086853; x=1790691653; darn=lists.altlinux.org; h=in-reply-to:content-transfer-encoding:content-disposition :content-type:mime-version:references:mail-followup-to:message-id :subject:cc:to:from:date:sender:from:to:cc:subject:date:message-id :reply-to:content-type; bh=vM2XG8gouCLteoAPJErpIbLiFguXIblZCJpvAinq29Y=; b=hln5FqfzhTdNjzE/JBbntIYGAdMza2X45AIEy4frfgVCcINcJRhjegIxH3dEyVdBDa 0+CsO0NMi8OhqOtKAVeNCvlsV3ob+RkXztIs90geWRn9t8OWX+W8Q+RiVe3CPiS2tAbk WM4/XYJUAJaBjQq2DpFqapbOW9p+qlL6CZgCO86lZd6cWJ5TnrePRodI/HHry8YE/3BA 30weJcwx3nNYLklHOL3DRLdhq4X+xM4S6WfUo7KZqISc5xxsogf1jySWZoDegOYMEeZh UDfLwVtDSWj7Ssye40haEhZdhRrS2IK8gB4DxcCWu2Qpg6TlSpm6x781W8svGZYALOB/ 8GSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790086853; x=1790691653; h=in-reply-to:content-transfer-encoding:content-disposition :content-type:mime-version:references:mail-followup-to:message-id :subject:cc:to:from:date:sender:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=vM2XG8gouCLteoAPJErpIbLiFguXIblZCJpvAinq29Y=; b=NmKukoCtezlWsJZzjAJMVYR7W+D0PXsLXs2MxFaif3kAtH2V1Rd0I8i/i67fJSR4nz qgqDLIgRur/NL8RYS9NJO2zp2zIFZZgNxPAyfMm58igI3uP9RDkmOsDvJg9kGF/TdRXd omi0T3b2gPFFfz5U4GqMvCFE1vg+uEVx3WCaqhmkOWSIBJSykVRQPXTt4G9oTuB5ZvKh a/7YDL7dJG6RF7zoLCMSkhqfVZxVy5i+fyY+7wa7X2QxK+TIHEgT0Wnn4bjcKdBOvSSb kqiZpXa9T5LU9gHOw8q74JBmzEzs6XZN6VZDhCu4sHE+rlSu+4IcwvnlK/c8InFupt05 KVaQ== X-Gm-Message-State: AFuF++lkIb8loWLiuds3M6Bjcr03jrlFet8GC1OPuMqkCSdTtWDCPtqK Sxtf8Xd7AMdUh93dYsEEoK638wOSB2mR/oUU1YJTnqemyhF1uzuIEcuIVKu+0A== X-Gm-Gg: AYBFou38XZbLmECoTzjPFeNEzM8H+pkqszIAgiSVR/FNyRsKdJlF1hl8dHFoBQPclf6 kvk+2kbzOGvmERjNY3/buoIn9hZzWWsmEMCNHkDCsiz7maLRj6vJ/X54/PVL6aCOMXGSxjMTWLE LX9Al3PQfqiEKSy4dMkMJcObKPzkT4pcmQHhDjHCzWCM2QKhgKS2occR60Me3PO/hhnCN+vRouJ T9sfPHlCn/ZohChxB2PclTvhGt4+egrpoXR0140uq9uICNj++ckRZGjM4ZqSvwU75aLcMmA9s6e WE/ZiCOlkBu5lj4mo2xcMU6vOns/3J4xqSaLzFFuAjCkcgZDd4kx+dfP7faEKH2tj/pu+zuFhn0 rzaUHQTId2n5tXVqV+9ySghZIjqJb+/zB4SeKVadkzwlbYod1TMzfbi24SX849EqAQ0RzfR3sUJ DqcE7NHltw16WJuF6fkTxGrWoJUBNThnyZzKn4D4WlXM9mZ37PIr7fL4GtxOLCKXKza3ISSIRdd etTqxJFHdaQ3Q== X-Received: by 2002:a05:600c:1daa:b0:49c:fc6c:bdfc with SMTP id 5b1f17b1804b1-49fc574643bmr185523675e9.19.1790086852782; Tue, 22 Sep 2026 07:20:52 -0700 (PDT) Sender: "Ivan A. Melnikov" Date: Tue, 22 Sep 2026 18:20:50 +0400 From: "Ivan A. Melnikov" To: Daniil Gnusarev Message-ID: Mail-Followup-To: Daniil Gnusarev , devel-kernel@lists.altlinux.org References: <20260714061503.170801-1-gnusarevda@basealt.ru> <20260714061503.170801-2-gnusarevda@basealt.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20260714061503.170801-2-gnusarevda@basealt.ru> Cc: devel-kernel@lists.altlinux.org Subject: Re: [d-kernel] [PATCH 1/1] drm: rockchip: dwhdmiqp-rockchip: attach next bridge to the HDMI bridge X-BeenThere: devel-kernel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux kernel packages development List-Id: ALT Linux kernel packages development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Sep 2026 14:20:57 -0000 Archived-At: List-Archive: List-Post: On Tue, Jul 14, 2026 at 10:15:02AM +0400, Daniil Gnusarev wrote: > For embedded systems, additional bridges may be connected after > the HDMI bridge being created. To ensure full functionality, they > must be added to the DRM bridge chain. > > Signed-off-by: Daniil Gnusarev > --- > .../gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 22 +++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c > index 409f1a1e82a061..9485d85a16f35c 100644 > --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c > +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c > @@ -430,6 +430,8 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev, struct device *master, > struct drm_connector *connector; > struct drm_encoder *encoder; > struct rockchip_hdmi_qp *hdmi; > + struct drm_bridge *hdmi_bridge; > + struct drm_bridge *next_bridge; > struct resource *res; > struct clk_bulk_data *clks; > int ret, irq, i; > @@ -441,6 +443,11 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev, struct device *master, > if (!hdmi) > return -ENOMEM; > > + next_bridge = NULL; > + ret = drm_of_find_panel_or_bridge(pdev->dev.of_node, 1, 0, NULL, &next_bridge); > + if (ret && ret != -ENODEV) > + return ret; Довольно (недовольно) интересную ситуацию придумал здесь upstream: чуть выше через devm_kzalloc выделяется память под struct rockchip_hdmi_qp, и в случае ошиьбки она остаётся выделенной пока живо устройство. Вызов drm_of_find_panel_or_bridge делает эту ситуацию ещё интереснее, поскольку drm_of_find_panel_or_bridge может вернуть  ︎-EPROBE_DEFER. > + > res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > if (!res) > return -ENODEV; > @@ -556,6 +563,21 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev, struct device *master, > return ret; > } > > + if (next_bridge) { > + hdmi_bridge = drm_bridge_chain_get_last_bridge(encoder); > + if (hdmi_bridge) > + ret = drm_bridge_attach(encoder, next_bridge, hdmi_bridge, > + DRM_BRIDGE_ATTACH_NO_CONNECTOR); > + else > + ret = -ENODEV; Just a note: этот код никогда не выполнится, у encoder'а хотя бы один bridge в этом месте точно есть. > + if (hdmi_bridge) > + drm_bridge_put(hdmi_bridge); Почему бы не присоединить этот if к предыдущему? Ну или воспользоваться __free(drm_bridge_put). > + if (ret) { > + dev_err(hdmi->dev, "failed to attach next bridge: %d\n", ret); > + return ret; Кажется, в этом месте должен быть вызов `drm_encoder_cleanup`. Как и в следующем early return, но это уже апстримный баг. > + } > + } > + > connector = drm_bridge_connector_init(drm, encoder); > if (IS_ERR(connector)) { > ret = PTR_ERR(connector); > -- > 2.42.2 Короче, прям вот неудобно присоединять следующий bridge отсюда. -- wbr, iv m.