Unverified Commit abe572f6 authored by Johan Hovold's avatar Johan Hovold Committed by Mark Brown
Browse files

spi: ch341: fix devres lifetime



USB drivers bind to USB interfaces and any device managed resources
should have their lifetime tied to the interface rather than parent USB
device. This avoids issues like memory leaks when drivers are unbound
without their devices being physically disconnected (e.g. on probe
deferral or configuration changes).

Fix the controller and driver data lifetime so that they are released
on driver unbind.

Note that this also makes sure that the SPI controller is placed
correctly under the USB interface in the device tree.

Fixes: 8846739f ("spi: add ch341a usb2spi driver")
Cc: stable@vger.kernel.org	# 6.11
Cc: Johannes Thumshirn <jth@kernel.org>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20260327104305.1309915-3-johan@kernel.org


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b99e3ddb
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -152,7 +152,7 @@ static int ch341_probe(struct usb_interface *intf,
	if (ret)
		return ret;

	ctrl = devm_spi_alloc_host(&udev->dev, sizeof(struct ch341_spi_dev));
	ctrl = devm_spi_alloc_host(&intf->dev, sizeof(struct ch341_spi_dev));
	if (!ctrl)
		return -ENOMEM;

@@ -163,7 +163,7 @@ static int ch341_probe(struct usb_interface *intf,
	ch341->read_pipe = usb_rcvbulkpipe(udev, usb_endpoint_num(in));

	ch341->rx_len = usb_endpoint_maxp(in);
	ch341->rx_buf = devm_kzalloc(&udev->dev, ch341->rx_len, GFP_KERNEL);
	ch341->rx_buf = devm_kzalloc(&intf->dev, ch341->rx_len, GFP_KERNEL);
	if (!ch341->rx_buf)
		return -ENOMEM;

@@ -171,8 +171,7 @@ static int ch341_probe(struct usb_interface *intf,
	if (!ch341->rx_urb)
		return -ENOMEM;

	ch341->tx_buf =
		devm_kzalloc(&udev->dev, CH341_PACKET_LENGTH, GFP_KERNEL);
	ch341->tx_buf = devm_kzalloc(&intf->dev, CH341_PACKET_LENGTH, GFP_KERNEL);
	if (!ch341->tx_buf) {
		ret = -ENOMEM;
		goto err_free_urb;