From nobody Sat Jun 20 14:12:40 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D32E279DAD for ; Tue, 14 Apr 2026 18:17:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776190661; cv=none; b=cljRCFuR/8lPGwEBO0YDSd1CXVlT9NanHMW13PojTI6+XT44w7SWnyd3JDe1yoJKMNox5mhHiELJ/f143lnyTAKDGEcTyhWF9XX/CyT6UPqicerzpOOHWfkFSqZNz5MwEPQdQaJ3mjb3w6tv8FWLsntqT8v774nh4KN5aNYiPwI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776190661; c=relaxed/simple; bh=tfqndsSnFlyrt7kxXt/YVylSG2DfGCm03SxpAspoVJ4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=Vz+/xq8whY0vxxXfVw4cAAfl5mPFNnapcCZIEXy560MYg+I8+YLmKsVqZSlBHSJ7dQG4eWkN6P9Lck8omQJ7jDgRot60cmm9+MsDrHL53MgyBWv/NJrI2jXJY6rXWl6pXyS3NCUe+YMXl0UbM1S7WXiPI1Ls51WrAc0ROrjRSoI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XHw5SmG4; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XHw5SmG4" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-483487335c2so65639535e9.2 for ; Tue, 14 Apr 2026 11:17:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776190658; x=1776795458; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=a17qkKgLycvB9UF11qiLM7OBOR2drTyk3swDqmbXW8c=; b=XHw5SmG4aO6AN89Q4uDxUpdqWMP4ohg5yB0dn6spoZvSIOHXNPO6LzvkQWX2k6f7WG LTp9O4HOTAf4xTerqhzd4tpNFa8R50ul71QGbyG29w1im7DI3VlEEpR2Wko0E0MYDddp /UIPqPo1gNlMj8+BtBO9VFsA0oJZCy9clpzoXyOTMMGugZD3phcDotFcpquNBqohowpb tEt7NBFNhgDgOz1rPTdles/VukM+5hOGM5G4h1x5sLKYm12ieP8WA1ugE+5prT787M94 XGWkczmshR+09YykrtSEsz3j8E7Vv+LnuXA4sHRklg5wQUROgFco/xj5iPE0F41hbsrZ iGbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776190658; x=1776795458; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=a17qkKgLycvB9UF11qiLM7OBOR2drTyk3swDqmbXW8c=; b=T3rz4oP5Rv3xki+EeL+6oFDNf8XAxDqgtCNyjHG8ma8MsCVCFbOH/votQI7KEzzbE3 b1Fe77d8BhLqe4yk6gePr/sSIpJVd/JMmLq0SMBbVQ0LH9ShIMtUaliF6tFbtf3KQz3D d5ENzKKTFZwvepKLb/4wDzlnGjX71MBM5AyOXvKmLUUxQQTEFmSPNavbnGRHBlUFNlDe xbjB/FPHibNtackrN7F9JxBsmxpZ06+HAj99JW1l1Tg/3U9hjtj5BRQ8iMOYSQ+juRXL x3fobEmLZFaHzdx1j/b7rHLLcXklakp6q3sAaYOFv261VSwcEzONqcJO0sV87nr8F9iL c/ZA== X-Forwarded-Encrypted: i=1; AFNElJ9Bwz23vDupBxmxek2J4MYvp9byv44BMuIC5WD47RO3MvLqw1vRuhuCEHU1GLOwV4eIGjS8W6qa552eQIE=@vger.kernel.org X-Gm-Message-State: AOJu0Yw+E72jLgb9Rr3PDbqfBdcymV4j7a2icNa0BZBm9NBlWKOBp6h1 rVgRK9P/MH5wnLBd7qp95Vj8gscpfsv9fGh3xSQ2AGia33t9Z7Ck5D+z X-Gm-Gg: AeBDietKann9zlQHr5ubeUNYLVIozNyQlXrnVn2HAg9W1iCqM/yjxeUywNdvz/GVsC+ YZpEqc4glSAyKg78vCjriKcyefMaRczsRP+lR8rvM2m4b0EN9R85MV7AiC/bUMtjyzBI7l3nyAk Z9bPSP5sXBO/kMEFq551WYbKm0q/HV8dLLR9Rxgv3krTJFi9E0JatY+JTavhy6SH2zBYuNU0Ds3 6m/6AvrymKDWlDV0LjMd6SXn+8+1+Ib2cTFEOeX9Q7H0zSDHWY+VHHy80/rqAgUWfvaIBANPgat fClZqF6LzODWla6fl+ef7HidO32F55F2gMq6IGFLK3zoWzr/hSRpPPvnNlNd1SV3zMfHlKdHoWD oYTZjO3Lt9vgaPGCkflm2cXRBMuS93r9+RBzJJBb7YIg2TKbZqY8UhyXePLQ9uls/TZYiWYj4No T0O/r2wRGY7U6U0XUTtGjOjy80QCrqrFu2YCEJderLnCGj2dNmUkv3DGDTPcEa X-Received: by 2002:a05:600d:d:b0:485:2a85:e5ec with SMTP id 5b1f17b1804b1-488d67b8db8mr197770685e9.2.1776190658370; Tue, 14 Apr 2026 11:17:38 -0700 (PDT) Received: from osama.. ([2a02:908:1b6:8980:cb49:f403:bb20:cc84]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488ede1e217sm116926665e9.5.2026.04.14.11.17.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Apr 2026 11:17:37 -0700 (PDT) From: Osama Abdelkader To: luca.ceresoli@bootlin.com, Alain Volmat , Raphael Gallais-Pou , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: Osama Abdelkader Subject: [PATCH v2] drm/sti: hdmi: simplify probe with devm DDC and bridge Date: Tue, 14 Apr 2026 20:17:25 +0200 Message-ID: <20260414181726.177168-1-osama.abdelkader@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use devm_add_action_or_reset() to release the DDC I2C adapter from of_get_i2c_adapter_by_node(), eliminating the release_adapter goto path. Switch to devm_drm_bridge_add() so the bridge is released on probe failure without manual drm_bridge_remove() in remove(). v2: devm_add_action_or_reset for DDC + devm_drm_bridge_add (reviewer) Signed-off-by: Osama Abdelkader --- drivers/gpu/drm/sti/sti_hdmi.c | 48 ++++++++++++++-------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c index 839c80a7d954..19beaede8501 100644 --- a/drivers/gpu/drm/sti/sti_hdmi.c +++ b/drivers/gpu/drm/sti/sti_hdmi.c @@ -1373,6 +1373,11 @@ static const struct of_device_id hdmi_of_match[] =3D= { }; MODULE_DEVICE_TABLE(of, hdmi_of_match); =20 +static void sti_hdmi_i2c_put(void *ptr) +{ + i2c_put_adapter(ptr); +} + static int sti_hdmi_probe(struct platform_device *pdev) { struct device *dev =3D &pdev->dev; @@ -1393,14 +1398,15 @@ static int sti_hdmi_probe(struct platform_device *p= dev) of_node_put(ddc); if (!hdmi->ddc_adapt) return -EPROBE_DEFER; + ret =3D devm_add_action_or_reset(dev, sti_hdmi_i2c_put, hdmi->ddc_adapt); + if (ret) + return ret; } =20 hdmi->dev =3D pdev->dev; hdmi->regs =3D devm_platform_ioremap_resource_byname(pdev, "hdmi-reg"); - if (IS_ERR(hdmi->regs)) { - ret =3D PTR_ERR(hdmi->regs); - goto release_adapter; - } + if (IS_ERR(hdmi->regs)) + return PTR_ERR(hdmi->regs); =20 hdmi->phy_ops =3D (struct hdmi_phy_ops *) of_match_node(hdmi_of_match, np)->data; @@ -1409,29 +1415,25 @@ static int sti_hdmi_probe(struct platform_device *p= dev) hdmi->clk_pix =3D devm_clk_get(dev, "pix"); if (IS_ERR(hdmi->clk_pix)) { DRM_ERROR("Cannot get hdmi_pix clock\n"); - ret =3D PTR_ERR(hdmi->clk_pix); - goto release_adapter; + return PTR_ERR(hdmi->clk_pix); } =20 hdmi->clk_tmds =3D devm_clk_get(dev, "tmds"); if (IS_ERR(hdmi->clk_tmds)) { DRM_ERROR("Cannot get hdmi_tmds clock\n"); - ret =3D PTR_ERR(hdmi->clk_tmds); - goto release_adapter; + return PTR_ERR(hdmi->clk_tmds); } =20 hdmi->clk_phy =3D devm_clk_get(dev, "phy"); if (IS_ERR(hdmi->clk_phy)) { DRM_ERROR("Cannot get hdmi_phy clock\n"); - ret =3D PTR_ERR(hdmi->clk_phy); - goto release_adapter; + return PTR_ERR(hdmi->clk_phy); } =20 hdmi->clk_audio =3D devm_clk_get(dev, "audio"); if (IS_ERR(hdmi->clk_audio)) { DRM_ERROR("Cannot get hdmi_audio clock\n"); - ret =3D PTR_ERR(hdmi->clk_audio); - goto release_adapter; + return PTR_ERR(hdmi->clk_audio); } =20 hdmi->hpd =3D readl(hdmi->regs + HDMI_STA) & HDMI_STA_HOT_PLUG; @@ -1441,15 +1443,14 @@ static int sti_hdmi_probe(struct platform_device *p= dev) hdmi->irq =3D platform_get_irq_byname(pdev, "irq"); if (hdmi->irq < 0) { DRM_ERROR("Cannot get HDMI irq\n"); - ret =3D hdmi->irq; - goto release_adapter; + return hdmi->irq; } =20 ret =3D devm_request_threaded_irq(dev, hdmi->irq, hdmi_irq, - hdmi_irq_thread, IRQF_ONESHOT, dev_name(dev), hdmi); + hdmi_irq_thread, IRQF_ONESHOT, dev_name(dev), hdmi); if (ret) { DRM_ERROR("Failed to register HDMI interrupt\n"); - goto release_adapter; + return ret; } =20 hdmi->reset =3D devm_reset_control_get(dev, "hdmi"); @@ -1459,29 +1460,20 @@ static int sti_hdmi_probe(struct platform_device *p= dev) =20 platform_set_drvdata(pdev, hdmi); =20 - drm_bridge_add(&hdmi->bridge); - ret =3D component_add(&pdev->dev, &sti_hdmi_ops); + ret =3D devm_drm_bridge_add(dev, &hdmi->bridge); if (ret) - goto remove_bridge; - return 0; - - remove_bridge: - drm_bridge_remove(&hdmi->bridge); - release_adapter: - i2c_put_adapter(hdmi->ddc_adapt); + return ret; =20 - return ret; + return component_add(&pdev->dev, &sti_hdmi_ops); } =20 static void sti_hdmi_remove(struct platform_device *pdev) { struct sti_hdmi *hdmi =3D dev_get_drvdata(&pdev->dev); =20 - i2c_put_adapter(hdmi->ddc_adapt); if (hdmi->audio_pdev) platform_device_unregister(hdmi->audio_pdev); component_del(&pdev->dev, &sti_hdmi_ops); - drm_bridge_remove(&hdmi->bridge); } =20 struct platform_driver sti_hdmi_driver =3D { --=20 2.43.0