| From sashal@kernel.org Thu Aug 21 15:32:48 2025 | 
 | From: Sasha Levin <sashal@kernel.org> | 
 | Date: Thu, 21 Aug 2025 09:32:43 -0400 | 
 | Subject: usb: musb: omap2430: fix device leak at unbind | 
 | To: stable@vger.kernel.org | 
 | Cc: Johan Hovold <johan@kernel.org>, Roger Quadros <rogerq@kernel.org>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Sasha Levin <sashal@kernel.org> | 
 | Message-ID: <20250821133244.715359-2-sashal@kernel.org> | 
 |  | 
 | From: Johan Hovold <johan@kernel.org> | 
 |  | 
 | [ Upstream commit 1473e9e7679bd4f5a62d1abccae894fb86de280f ] | 
 |  | 
 | Make sure to drop the reference to the control device taken by | 
 | of_find_device_by_node() during probe when the driver is unbound. | 
 |  | 
 | Fixes: 8934d3e4d0e7 ("usb: musb: omap2430: Don't use omap_get_control_dev()") | 
 | Cc: stable@vger.kernel.org	# 3.13 | 
 | Cc: Roger Quadros <rogerq@kernel.org> | 
 | Signed-off-by: Johan Hovold <johan@kernel.org> | 
 | Link: https://lore.kernel.org/r/20250724091910.21092-5-johan@kernel.org | 
 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 
 | Signed-off-by: Sasha Levin <sashal@kernel.org> | 
 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 
 | --- | 
 |  drivers/usb/musb/omap2430.c |   14 +++++++++----- | 
 |  1 file changed, 9 insertions(+), 5 deletions(-) | 
 |  | 
 | --- a/drivers/usb/musb/omap2430.c | 
 | +++ b/drivers/usb/musb/omap2430.c | 
 | @@ -400,7 +400,7 @@ static int omap2430_probe(struct platfor | 
 |  	ret = platform_device_add_resources(musb, pdev->resource, pdev->num_resources); | 
 |  	if (ret) { | 
 |  		dev_err(&pdev->dev, "failed to add resources\n"); | 
 | -		goto err2; | 
 | +		goto err_put_control_otghs; | 
 |  	} | 
 |   | 
 |  	if (populate_irqs) { | 
 | @@ -413,7 +413,7 @@ static int omap2430_probe(struct platfor | 
 |  		res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 
 |  		if (!res) { | 
 |  			ret = -EINVAL; | 
 | -			goto err2; | 
 | +			goto err_put_control_otghs; | 
 |  		} | 
 |   | 
 |  		musb_res[i].start = res->start; | 
 | @@ -441,14 +441,14 @@ static int omap2430_probe(struct platfor | 
 |  		ret = platform_device_add_resources(musb, musb_res, i); | 
 |  		if (ret) { | 
 |  			dev_err(&pdev->dev, "failed to add IRQ resources\n"); | 
 | -			goto err2; | 
 | +			goto err_put_control_otghs; | 
 |  		} | 
 |  	} | 
 |   | 
 |  	ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); | 
 |  	if (ret) { | 
 |  		dev_err(&pdev->dev, "failed to add platform_data\n"); | 
 | -		goto err2; | 
 | +		goto err_put_control_otghs; | 
 |  	} | 
 |   | 
 |  	pm_runtime_enable(glue->dev); | 
 | @@ -463,7 +463,9 @@ static int omap2430_probe(struct platfor | 
 |   | 
 |  err3: | 
 |  	pm_runtime_disable(glue->dev); | 
 | - | 
 | +err_put_control_otghs: | 
 | +	if (!IS_ERR(glue->control_otghs)) | 
 | +		put_device(glue->control_otghs); | 
 |  err2: | 
 |  	platform_device_put(musb); | 
 |   | 
 | @@ -477,6 +479,8 @@ static void omap2430_remove(struct platf | 
 |   | 
 |  	platform_device_unregister(glue->musb); | 
 |  	pm_runtime_disable(glue->dev); | 
 | +	if (!IS_ERR(glue->control_otghs)) | 
 | +		put_device(glue->control_otghs); | 
 |  } | 
 |   | 
 |  #ifdef CONFIG_PM |