From nobody Tue Dec 2 00:03:25 2025 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED350296BBA; Tue, 25 Nov 2025 09:06:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764061570; cv=none; b=I+1xtGa/m/7lIH05i5Cn5CwnVLysbljG+rnS9Bw+kGInxKvH2985jYuEwCyqS/J9SBLLL0SpGMnnjHXH30uK9LQCV7GwTXMNMaD6aXzZdyftDSLK5LxG/aqXUEsJyXKVoyJtS03jvN8z7SWEcD3n4+tnY4ti+AXz1IoyT17aM8E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764061570; c=relaxed/simple; bh=RIDASrut4MLaYIYmCaxCQsOX0rmWlQ43uP2CXFqtMPE=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=JBYmCtxS3p6Jx3LfP0JxQnVrClcaLQZcZzaYg2AQEPcIvQu1nmSpF/gTAF0YBAsRBENJBIKrbrrXftxZbo4ZpOrBRwqhnJXKDr+mpibGR/Z3mbvn0GiaZsYYeOjKCr5HbE33Aci96l7sz7NYLLm7227xGZ7rwqqGkgrYqLDsfos= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=GtNHZDjy; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="GtNHZDjy" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 35B5E1A1D30; Tue, 25 Nov 2025 09:05:56 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0690660705; Tue, 25 Nov 2025 09:05:56 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id D323A10371616; Tue, 25 Nov 2025 10:05:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1764061555; h=from:subject:date:message-id:to:cc:mime-version: content-transfer-encoding; bh=EnzzFaoxZT2moKRMTZsQDsdt2u8wjYq4N0N97zM8DBg=; b=GtNHZDjyEMK9SYW8TzeBNrhCQkE+Xyk+fCtvTs+Mf0Ey1TbK+IXutOS3EM6jDTSM85qRf4 WQMywkVBEwYTs7Sf7cjhf9H2/BoqC+egvCX5f2PWTx+iyqZPpSzkvkdKJLtmrXy7CFc05W Y/+KYbls7GD56om3QY5tRdvQITenHI+6psgW+wKb2vRRVEGfu5EZ0GwJlkJFBLsTcY96qu plpMDrNIK2XctZtXXWl/Jyl0NAoqApc4wdc051RTGnLha82QSf9UQ2m8ZWeIfVnJ2WD8uF JWh8Ktnai/2qnOS+xHasUCknyl/emsB8rGEIjPgQjdlSHyfHiDZxGUGdgd+R3g== From: Kory Maincent To: Tomi Valkeinen , Maxime Ripard , Douglas Anderson , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: Bajjuri Praneeth , Luca Ceresoli , Louis Chauvet , "Kory Maincent (TI.com)" , stable@vger.kernel.org, thomas.petazzoni@bootlin.com, Jyri Sarha , Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Subject: [PATCH v4] drm/tilcdc: Fix removal actions in case of failed probe Date: Tue, 25 Nov 2025 10:05:44 +0100 Message-ID: <20251125090546.137193-1-kory.maincent@bootlin.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 X-Last-TLS-Session-Version: TLSv1.3 Content-Type: text/plain; charset="utf-8" From: "Kory Maincent (TI.com)" The drm_kms_helper_poll_fini() and drm_atomic_helper_shutdown() helpers should only be called when the device has been successfully registered. Currently, these functions are called unconditionally in tilcdc_fini(), which causes warnings during probe deferral scenarios. [ 7.972317] WARNING: CPU: 0 PID: 23 at drivers/gpu/drm/drm_atomic_state_= helper.c:175 drm_atomic_helper_crtc_duplicate_state+0x60/0x68 ... [ 8.005820] drm_atomic_helper_crtc_duplicate_state from drm_atomic_get_= crtc_state+0x68/0x108 [ 8.005858] drm_atomic_get_crtc_state from drm_atomic_helper_disable_al= l+0x90/0x1c8 [ 8.005885] drm_atomic_helper_disable_all from drm_atomic_helper_shutdo= wn+0x90/0x144 [ 8.005911] drm_atomic_helper_shutdown from tilcdc_fini+0x68/0xf8 [tilc= dc] [ 8.005957] tilcdc_fini [tilcdc] from tilcdc_pdev_probe+0xb0/0x6d4 [til= cdc] Fix this by rewriting the failed probe cleanup path using the standard goto error handling pattern, which ensures that cleanup functions are only called on successfully initialized resources. Additionally, remove the now-unnecessary is_registered flag. Cc: stable@vger.kernel.org Fixes: 3c4babae3c4a ("drm: Call drm_atomic_helper_shutdown() at shutdown/re= move time for misc drivers") Signed-off-by: Kory Maincent (TI.com) Reviewed-by: Douglas Anderson Reviewed-by: Luca Ceresoli --- I'm working on removing the usage of deprecated functions as well as general improvements to this driver, but it will take some time so for now this is a simple fix to a functional bug. Change in v4: - Fix an unused label warning reported by the kernel test robot. Change in v3: - Rewrite the failed probe clean up path using goto - Remove the is_registered flag Change in v2: - Add missing cc: stable tag - Add Swamil reviewed-by --- drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 2 +- drivers/gpu/drm/tilcdc/tilcdc_drv.c | 53 ++++++++++++++++++---------- drivers/gpu/drm/tilcdc/tilcdc_drv.h | 2 +- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/= tilcdc_crtc.c index 5718d9d83a49f..52c95131af5af 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c @@ -586,7 +586,7 @@ static void tilcdc_crtc_recover_work(struct work_struct= *work) drm_modeset_unlock(&crtc->mutex); } =20 -static void tilcdc_crtc_destroy(struct drm_crtc *crtc) +void tilcdc_crtc_destroy(struct drm_crtc *crtc) { struct tilcdc_drm_private *priv =3D crtc->dev->dev_private; =20 diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/t= ilcdc_drv.c index 7caec4d38ddf0..3dcbec312bacb 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c @@ -172,8 +172,7 @@ static void tilcdc_fini(struct drm_device *dev) if (priv->crtc) tilcdc_crtc_shutdown(priv->crtc); =20 - if (priv->is_registered) - drm_dev_unregister(dev); + drm_dev_unregister(dev); =20 drm_kms_helper_poll_fini(dev); drm_atomic_helper_shutdown(dev); @@ -220,21 +219,21 @@ static int tilcdc_init(const struct drm_driver *ddrv,= struct device *dev) priv->wq =3D alloc_ordered_workqueue("tilcdc", 0); if (!priv->wq) { ret =3D -ENOMEM; - goto init_failed; + goto put_drm; } =20 priv->mmio =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(priv->mmio)) { dev_err(dev, "failed to request / ioremap\n"); ret =3D PTR_ERR(priv->mmio); - goto init_failed; + goto free_wq; } =20 priv->clk =3D clk_get(dev, "fck"); if (IS_ERR(priv->clk)) { dev_err(dev, "failed to get functional clock\n"); ret =3D -ENODEV; - goto init_failed; + goto free_wq; } =20 pm_runtime_enable(dev); @@ -313,7 +312,7 @@ static int tilcdc_init(const struct drm_driver *ddrv, s= truct device *dev) ret =3D tilcdc_crtc_create(ddev); if (ret < 0) { dev_err(dev, "failed to create crtc\n"); - goto init_failed; + goto disable_pm; } modeset_init(ddev); =20 @@ -324,46 +323,46 @@ static int tilcdc_init(const struct drm_driver *ddrv,= struct device *dev) if (ret) { dev_err(dev, "failed to register cpufreq notifier\n"); priv->freq_transition.notifier_call =3D NULL; - goto init_failed; + goto destroy_crtc; } #endif =20 if (priv->is_componentized) { ret =3D component_bind_all(dev, ddev); if (ret < 0) - goto init_failed; + goto unregister_cpufreq_notif; =20 ret =3D tilcdc_add_component_encoder(ddev); if (ret < 0) - goto init_failed; + goto unbind_component; } else { ret =3D tilcdc_attach_external_device(ddev); if (ret) - goto init_failed; + goto unregister_cpufreq_notif; } =20 if (!priv->external_connector && ((priv->num_encoders =3D=3D 0) || (priv->num_connectors =3D=3D 0))) { dev_err(dev, "no encoders/connectors found\n"); ret =3D -EPROBE_DEFER; - goto init_failed; + goto unbind_component; } =20 ret =3D drm_vblank_init(ddev, 1); if (ret < 0) { dev_err(dev, "failed to initialize vblank\n"); - goto init_failed; + goto unbind_component; } =20 ret =3D platform_get_irq(pdev, 0); if (ret < 0) - goto init_failed; + goto unbind_component; priv->irq =3D ret; =20 ret =3D tilcdc_irq_install(ddev, priv->irq); if (ret < 0) { dev_err(dev, "failed to install IRQ handler\n"); - goto init_failed; + goto unbind_component; } =20 drm_mode_config_reset(ddev); @@ -372,16 +371,34 @@ static int tilcdc_init(const struct drm_driver *ddrv,= struct device *dev) =20 ret =3D drm_dev_register(ddev, 0); if (ret) - goto init_failed; - priv->is_registered =3D true; + goto stop_poll; =20 drm_client_setup_with_color_mode(ddev, bpp); =20 return 0; =20 -init_failed: - tilcdc_fini(ddev); +stop_poll: + drm_kms_helper_poll_fini(ddev); + tilcdc_irq_uninstall(ddev); +unbind_component: + if (priv->is_componentized) + component_unbind_all(dev, ddev); +unregister_cpufreq_notif: +#ifdef CONFIG_CPU_FREQ + cpufreq_unregister_notifier(&priv->freq_transition, + CPUFREQ_TRANSITION_NOTIFIER); +destroy_crtc: +#endif + tilcdc_crtc_destroy(priv->crtc); +disable_pm: + pm_runtime_disable(dev); + clk_put(priv->clk); +free_wq: + destroy_workqueue(priv->wq); +put_drm: platform_set_drvdata(pdev, NULL); + ddev->dev_private =3D NULL; + drm_dev_put(ddev); =20 return ret; } diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.h b/drivers/gpu/drm/tilcdc/t= ilcdc_drv.h index b818448c83f61..58b276f82a669 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.h +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.h @@ -82,7 +82,6 @@ struct tilcdc_drm_private { struct drm_encoder *external_encoder; struct drm_connector *external_connector; =20 - bool is_registered; bool is_componentized; bool irq_enabled; }; @@ -164,6 +163,7 @@ void tilcdc_crtc_set_panel_info(struct drm_crtc *crtc, void tilcdc_crtc_set_simulate_vesa_sync(struct drm_crtc *crtc, bool simulate_vesa_sync); void tilcdc_crtc_shutdown(struct drm_crtc *crtc); +void tilcdc_crtc_destroy(struct drm_crtc *crtc); int tilcdc_crtc_update_fb(struct drm_crtc *crtc, struct drm_framebuffer *fb, struct drm_pending_vblank_event *event); --=20 2.43.0