[PATCH v3] drm/tilcdc: Fix removal actions in case of failed probe

Kory Maincent posted 1 patch 1 week, 6 days ago
There is a newer version of this series
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(-)
[PATCH v3] drm/tilcdc: Fix removal actions in case of failed probe
Posted by Kory Maincent 1 week, 6 days ago
From: "Kory Maincent (TI.com)" <kory.maincent@bootlin.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_all+0x90/0x1c8
[    8.005885]  drm_atomic_helper_disable_all from drm_atomic_helper_shutdown+0x90/0x144
[    8.005911]  drm_atomic_helper_shutdown from tilcdc_fini+0x68/0xf8 [tilcdc]
[    8.005957]  tilcdc_fini [tilcdc] from tilcdc_pdev_probe+0xb0/0x6d4 [tilcdc]

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/remove time for misc drivers")
Signed-off-by: Kory Maincent (TI.com) <kory.maincent@bootlin.com>
---

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 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);
 }
 
-static void tilcdc_crtc_destroy(struct drm_crtc *crtc)
+void tilcdc_crtc_destroy(struct drm_crtc *crtc)
 {
 	struct tilcdc_drm_private *priv = crtc->dev->dev_private;
 
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index 7caec4d38ddf0..2a88cce445b8f 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);
 
-	if (priv->is_registered)
-		drm_dev_unregister(dev);
+	drm_dev_unregister(dev);
 
 	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 = alloc_ordered_workqueue("tilcdc", 0);
 	if (!priv->wq) {
 		ret = -ENOMEM;
-		goto init_failed;
+		goto put_drm;
 	}
 
 	priv->mmio = devm_platform_ioremap_resource(pdev, 0);
 	if (IS_ERR(priv->mmio)) {
 		dev_err(dev, "failed to request / ioremap\n");
 		ret = PTR_ERR(priv->mmio);
-		goto init_failed;
+		goto free_wq;
 	}
 
 	priv->clk = clk_get(dev, "fck");
 	if (IS_ERR(priv->clk)) {
 		dev_err(dev, "failed to get functional clock\n");
 		ret = -ENODEV;
-		goto init_failed;
+		goto free_wq;
 	}
 
 	pm_runtime_enable(dev);
@@ -313,7 +312,7 @@ static int tilcdc_init(const struct drm_driver *ddrv, struct device *dev)
 	ret = tilcdc_crtc_create(ddev);
 	if (ret < 0) {
 		dev_err(dev, "failed to create crtc\n");
-		goto init_failed;
+		goto disable_pm;
 	}
 	modeset_init(ddev);
 
@@ -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 = NULL;
-		goto init_failed;
+		goto destroy_crtc;
 	}
 #endif
 
 	if (priv->is_componentized) {
 		ret = component_bind_all(dev, ddev);
 		if (ret < 0)
-			goto init_failed;
+			goto unregister_cpufreq_notif;
 
 		ret = tilcdc_add_component_encoder(ddev);
 		if (ret < 0)
-			goto init_failed;
+			goto unbind_component;
 	} else {
 		ret = tilcdc_attach_external_device(ddev);
 		if (ret)
-			goto init_failed;
+			goto unregister_cpufreq_notif;
 	}
 
 	if (!priv->external_connector &&
 	    ((priv->num_encoders == 0) || (priv->num_connectors == 0))) {
 		dev_err(dev, "no encoders/connectors found\n");
 		ret = -EPROBE_DEFER;
-		goto init_failed;
+		goto unbind_component;
 	}
 
 	ret = drm_vblank_init(ddev, 1);
 	if (ret < 0) {
 		dev_err(dev, "failed to initialize vblank\n");
-		goto init_failed;
+		goto unbind_component;
 	}
 
 	ret = platform_get_irq(pdev, 0);
 	if (ret < 0)
-		goto init_failed;
+		goto unbind_component;
 	priv->irq = ret;
 
 	ret = tilcdc_irq_install(ddev, priv->irq);
 	if (ret < 0) {
 		dev_err(dev, "failed to install IRQ handler\n");
-		goto init_failed;
+		goto unbind_component;
 	}
 
 	drm_mode_config_reset(ddev);
@@ -372,16 +371,34 @@ static int tilcdc_init(const struct drm_driver *ddrv, struct device *dev)
 
 	ret = drm_dev_register(ddev, 0);
 	if (ret)
-		goto init_failed;
-	priv->is_registered = true;
+		goto stop_poll;
 
 	drm_client_setup_with_color_mode(ddev, bpp);
 
 	return 0;
 
-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);
+#endif
+destroy_crtc:
+	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 = NULL;
+	drm_dev_put(ddev);
 
 	return ret;
 }
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.h b/drivers/gpu/drm/tilcdc/tilcdc_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;
 
-	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);
-- 
2.43.0
Re: [PATCH v3] drm/tilcdc: Fix removal actions in case of failed probe
Posted by Luca Ceresoli 1 week, 5 days ago
Hello Köry,

On Tue Nov 18, 2025 at 2:38 PM CET, Kory Maincent wrote:
> From: "Kory Maincent (TI.com)" <kory.maincent@bootlin.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_all+0x90/0x1c8
> [    8.005885]  drm_atomic_helper_disable_all from drm_atomic_helper_shutdown+0x90/0x144
> [    8.005911]  drm_atomic_helper_shutdown from tilcdc_fini+0x68/0xf8 [tilcdc]
> [    8.005957]  tilcdc_fini [tilcdc] from tilcdc_pdev_probe+0xb0/0x6d4 [tilcdc]
>
> 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/remove time for misc drivers")
> Signed-off-by: Kory Maincent (TI.com) <kory.maincent@bootlin.com>

Except for the bug reported by the kernel test robot, this patch looks
good to me. Just a couple thoughts, below.

> @@ -372,16 +371,34 @@ static int tilcdc_init(const struct drm_driver *ddrv, struct device *dev)
>
>  	ret = drm_dev_register(ddev, 0);
>  	if (ret)
> -		goto init_failed;
> -	priv->is_registered = true;
> +		goto stop_poll;
>
>  	drm_client_setup_with_color_mode(ddev, bpp);
>
>  	return 0;
>
> -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);
> +#endif
> +destroy_crtc:
> +	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);

I'm not 100% sure this is needed, but perhaps it is because of the
component framework being used.

If it is needed, then shouldn't it be present in tilcdc_fini() as well?

> +	ddev->dev_private = NULL;
> +	drm_dev_put(ddev);
>
>  	return ret;
>  }

About tilcdc_fini(), I think it can be itself cleaned up a lot (in another patch). Basically
it should do the same thing (almost) that are here below the 'return 0'
line, and in the same order. Now the list of actions is auite different and
the order is very different.

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
Re: [PATCH v3] drm/tilcdc: Fix removal actions in case of failed probe
Posted by Kory Maincent 1 week, 3 days ago
On Wed, 19 Nov 2025 18:12:40 +0100
"Luca Ceresoli" <luca.ceresoli@bootlin.com> wrote:

> Hello Köry,
> 
> On Tue Nov 18, 2025 at 2:38 PM CET, Kory Maincent wrote:
> > From: "Kory Maincent (TI.com)" <kory.maincent@bootlin.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_all+0x90/0x1c8 [
> >  8.005885]  drm_atomic_helper_disable_all from
> > drm_atomic_helper_shutdown+0x90/0x144 [    8.005911]
> > drm_atomic_helper_shutdown from tilcdc_fini+0x68/0xf8 [tilcdc] [
> > 8.005957]  tilcdc_fini [tilcdc] from tilcdc_pdev_probe+0xb0/0x6d4 [tilcdc]
> >
> > 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/remove time for misc drivers") Signed-off-by: Kory Maincent
> > (TI.com) <kory.maincent@bootlin.com>  
> 
> Except for the bug reported by the kernel test robot, this patch looks
> good to me. Just a couple thoughts, below.
> 
> > @@ -372,16 +371,34 @@ static int tilcdc_init(const struct drm_driver *ddrv,
> > struct device *dev)
> >
> >  	ret = drm_dev_register(ddev, 0);
> >  	if (ret)
> > -		goto init_failed;
> > -	priv->is_registered = true;
> > +		goto stop_poll;
> >
> >  	drm_client_setup_with_color_mode(ddev, bpp);
> >
> >  	return 0;
> >
> > -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);
> > +#endif
> > +destroy_crtc:
> > +	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);  
> 
> I'm not 100% sure this is needed, but perhaps it is because of the
> component framework being used.

Yes not sure either but as it was already present I let it here.
Do you think I should remove it?

> 
> If it is needed, then shouldn't it be present in tilcdc_fini() as well?
> 
> > +	ddev->dev_private = NULL;
> > +	drm_dev_put(ddev);
> >
> >  	return ret;
> >  }  
> 
> About tilcdc_fini(), I think it can be itself cleaned up a lot (in another
> patch). Basically it should do the same thing (almost) that are here below
> the 'return 0' line, and in the same order. Now the list of actions is auite
> different and the order is very different.

Yes indeed, but this won't be a fix as there is no real issue in the remove
AFAIK.

Regards,
-- 
Köry Maincent, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com
Re: [PATCH v3] drm/tilcdc: Fix removal actions in case of failed probe
Posted by Luca Ceresoli 1 week ago
Hi Köry,

On Fri Nov 21, 2025 at 11:24 AM CET, Kory Maincent wrote:
> On Wed, 19 Nov 2025 18:12:40 +0100
> "Luca Ceresoli" <luca.ceresoli@bootlin.com> wrote:
>
>> Hello Köry,
>>
>> On Tue Nov 18, 2025 at 2:38 PM CET, Kory Maincent wrote:
>> > From: "Kory Maincent (TI.com)" <kory.maincent@bootlin.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_all+0x90/0x1c8 [
>> >  8.005885]  drm_atomic_helper_disable_all from
>> > drm_atomic_helper_shutdown+0x90/0x144 [    8.005911]
>> > drm_atomic_helper_shutdown from tilcdc_fini+0x68/0xf8 [tilcdc] [
>> > 8.005957]  tilcdc_fini [tilcdc] from tilcdc_pdev_probe+0xb0/0x6d4 [tilcdc]
>> >
>> > 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/remove time for misc drivers") Signed-off-by: Kory Maincent
>> > (TI.com) <kory.maincent@bootlin.com>
>>
>> Except for the bug reported by the kernel test robot, this patch looks
>> good to me. Just a couple thoughts, below.
>>
>> > @@ -372,16 +371,34 @@ static int tilcdc_init(const struct drm_driver *ddrv,
>> > struct device *dev)
>> >
>> >  	ret = drm_dev_register(ddev, 0);
>> >  	if (ret)
>> > -		goto init_failed;
>> > -	priv->is_registered = true;
>> > +		goto stop_poll;
>> >
>> >  	drm_client_setup_with_color_mode(ddev, bpp);
>> >
>> >  	return 0;
>> >
>> > -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);
>> > +#endif
>> > +destroy_crtc:
>> > +	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);
>>
>> I'm not 100% sure this is needed, but perhaps it is because of the
>> component framework being used.
>
> Yes not sure either but as it was already present I let it here.
> Do you think I should remove it?

At a quick look at the component framework, it does not seem to
care. However you are fixing a bug, so it's fine if you leave
platform_set_drvdata() untouched out of caution.

>> If it is needed, then shouldn't it be present in tilcdc_fini() as well?
>>
>> > +	ddev->dev_private = NULL;
>> > +	drm_dev_put(ddev);
>> >
>> >  	return ret;
>> >  }
>>
>> About tilcdc_fini(), I think it can be itself cleaned up a lot (in another
>> patch). Basically it should do the same thing (almost) that are here below
>> the 'return 0' line, and in the same order. Now the list of actions is auite
>> different and the order is very different.
>
> Yes indeed, but this won't be a fix as there is no real issue in the remove
> AFAIK.

Sure! Cleaning up tilcdc_fini() would be a cleanup, not a bugfix, so you
can do it in a separate series without affecting this bugfix patch.

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
Re: [PATCH v3] drm/tilcdc: Fix removal actions in case of failed probe
Posted by kernel test robot 1 week, 5 days ago
Hi Kory,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v6.18-rc6 next-20251118]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Kory-Maincent/drm-tilcdc-Fix-removal-actions-in-case-of-failed-probe/20251118-214022
base:   linus/master
patch link:    https://lore.kernel.org/r/20251118133850.125561-1-kory.maincent%40bootlin.com
patch subject: [PATCH v3] drm/tilcdc: Fix removal actions in case of failed probe
config: arm-randconfig-004-20251119 (https://download.01.org/0day-ci/archive/20251119/202511191045.bW4DdgHX-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 13.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251119/202511191045.bW4DdgHX-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511191045.bW4DdgHX-lkp@intel.com/

All warnings (new ones prefixed by >>):

   drivers/gpu/drm/tilcdc/tilcdc_drv.c: In function 'tilcdc_init':
>> drivers/gpu/drm/tilcdc/tilcdc_drv.c:391:1: warning: label 'destroy_crtc' defined but not used [-Wunused-label]
     391 | destroy_crtc:
         | ^~~~~~~~~~~~


vim +/destroy_crtc +391 drivers/gpu/drm/tilcdc/tilcdc_drv.c

   329	
   330		if (priv->is_componentized) {
   331			ret = component_bind_all(dev, ddev);
   332			if (ret < 0)
   333				goto unregister_cpufreq_notif;
   334	
   335			ret = tilcdc_add_component_encoder(ddev);
   336			if (ret < 0)
   337				goto unbind_component;
   338		} else {
   339			ret = tilcdc_attach_external_device(ddev);
   340			if (ret)
   341				goto unregister_cpufreq_notif;
   342		}
   343	
   344		if (!priv->external_connector &&
   345		    ((priv->num_encoders == 0) || (priv->num_connectors == 0))) {
   346			dev_err(dev, "no encoders/connectors found\n");
   347			ret = -EPROBE_DEFER;
   348			goto unbind_component;
   349		}
   350	
   351		ret = drm_vblank_init(ddev, 1);
   352		if (ret < 0) {
   353			dev_err(dev, "failed to initialize vblank\n");
   354			goto unbind_component;
   355		}
   356	
   357		ret = platform_get_irq(pdev, 0);
   358		if (ret < 0)
   359			goto unbind_component;
   360		priv->irq = ret;
   361	
   362		ret = tilcdc_irq_install(ddev, priv->irq);
   363		if (ret < 0) {
   364			dev_err(dev, "failed to install IRQ handler\n");
   365			goto unbind_component;
   366		}
   367	
   368		drm_mode_config_reset(ddev);
   369	
   370		drm_kms_helper_poll_init(ddev);
   371	
   372		ret = drm_dev_register(ddev, 0);
   373		if (ret)
   374			goto stop_poll;
   375	
   376		drm_client_setup_with_color_mode(ddev, bpp);
   377	
   378		return 0;
   379	
   380	stop_poll:
   381		drm_kms_helper_poll_fini(ddev);
   382		tilcdc_irq_uninstall(ddev);
   383	unbind_component:
   384		if (priv->is_componentized)
   385			component_unbind_all(dev, ddev);
   386	unregister_cpufreq_notif:
   387	#ifdef CONFIG_CPU_FREQ
   388		cpufreq_unregister_notifier(&priv->freq_transition,
   389					    CPUFREQ_TRANSITION_NOTIFIER);
   390	#endif
 > 391	destroy_crtc:
   392		tilcdc_crtc_destroy(priv->crtc);
   393	disable_pm:
   394		pm_runtime_disable(dev);
   395		clk_put(priv->clk);
   396	free_wq:
   397		destroy_workqueue(priv->wq);
   398	put_drm:
   399		platform_set_drvdata(pdev, NULL);
   400		ddev->dev_private = NULL;
   401		drm_dev_put(ddev);
   402	
   403		return ret;
   404	}
   405	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Re: [PATCH v3] drm/tilcdc: Fix removal actions in case of failed probe
Posted by kernel test robot 1 week, 6 days ago
Hi Kory,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v6.18-rc6 next-20251118]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Kory-Maincent/drm-tilcdc-Fix-removal-actions-in-case-of-failed-probe/20251118-214022
base:   linus/master
patch link:    https://lore.kernel.org/r/20251118133850.125561-1-kory.maincent%40bootlin.com
patch subject: [PATCH v3] drm/tilcdc: Fix removal actions in case of failed probe
config: arm-randconfig-003-20251119 (https://download.01.org/0day-ci/archive/20251119/202511191009.muedhmup-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 0bba1e76581bad04e7d7f09f5115ae5e2989e0d9)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251119/202511191009.muedhmup-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511191009.muedhmup-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/gpu/drm/tilcdc/tilcdc_drv.c:391:1: warning: unused label 'destroy_crtc' [-Wunused-label]
     391 | destroy_crtc:
         | ^~~~~~~~~~~~~
   1 warning generated.


vim +/destroy_crtc +391 drivers/gpu/drm/tilcdc/tilcdc_drv.c

   329	
   330		if (priv->is_componentized) {
   331			ret = component_bind_all(dev, ddev);
   332			if (ret < 0)
   333				goto unregister_cpufreq_notif;
   334	
   335			ret = tilcdc_add_component_encoder(ddev);
   336			if (ret < 0)
   337				goto unbind_component;
   338		} else {
   339			ret = tilcdc_attach_external_device(ddev);
   340			if (ret)
   341				goto unregister_cpufreq_notif;
   342		}
   343	
   344		if (!priv->external_connector &&
   345		    ((priv->num_encoders == 0) || (priv->num_connectors == 0))) {
   346			dev_err(dev, "no encoders/connectors found\n");
   347			ret = -EPROBE_DEFER;
   348			goto unbind_component;
   349		}
   350	
   351		ret = drm_vblank_init(ddev, 1);
   352		if (ret < 0) {
   353			dev_err(dev, "failed to initialize vblank\n");
   354			goto unbind_component;
   355		}
   356	
   357		ret = platform_get_irq(pdev, 0);
   358		if (ret < 0)
   359			goto unbind_component;
   360		priv->irq = ret;
   361	
   362		ret = tilcdc_irq_install(ddev, priv->irq);
   363		if (ret < 0) {
   364			dev_err(dev, "failed to install IRQ handler\n");
   365			goto unbind_component;
   366		}
   367	
   368		drm_mode_config_reset(ddev);
   369	
   370		drm_kms_helper_poll_init(ddev);
   371	
   372		ret = drm_dev_register(ddev, 0);
   373		if (ret)
   374			goto stop_poll;
   375	
   376		drm_client_setup_with_color_mode(ddev, bpp);
   377	
   378		return 0;
   379	
   380	stop_poll:
   381		drm_kms_helper_poll_fini(ddev);
   382		tilcdc_irq_uninstall(ddev);
   383	unbind_component:
   384		if (priv->is_componentized)
   385			component_unbind_all(dev, ddev);
   386	unregister_cpufreq_notif:
   387	#ifdef CONFIG_CPU_FREQ
   388		cpufreq_unregister_notifier(&priv->freq_transition,
   389					    CPUFREQ_TRANSITION_NOTIFIER);
   390	#endif
 > 391	destroy_crtc:
   392		tilcdc_crtc_destroy(priv->crtc);
   393	disable_pm:
   394		pm_runtime_disable(dev);
   395		clk_put(priv->clk);
   396	free_wq:
   397		destroy_workqueue(priv->wq);
   398	put_drm:
   399		platform_set_drvdata(pdev, NULL);
   400		ddev->dev_private = NULL;
   401		drm_dev_put(ddev);
   402	
   403		return ret;
   404	}
   405	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki