Commit 4fc17b1c authored by Johan Hovold's avatar Johan Hovold Committed by Vinod Koul
Browse files

dmaengine: ti: dma-crossbar: fix device leak on am335x route allocation



Make sure to drop the reference taken when looking up the crossbar
platform device during am335x route allocation.

Fixes: 42dbdcc6 ("dmaengine: ti-dma-crossbar: Add support for crossbar on AM33xx/AM43xx")
Cc: stable@vger.kernel.org	# 4.4
Cc: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20251117161258.10679-15-johan@kernel.org


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent dc7e44db
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -79,34 +79,35 @@ static void *ti_am335x_xbar_route_allocate(struct of_phandle_args *dma_spec,
{
	struct platform_device *pdev = of_find_device_by_node(ofdma->of_node);
	struct ti_am335x_xbar_data *xbar = platform_get_drvdata(pdev);
	struct ti_am335x_xbar_map *map;
	struct ti_am335x_xbar_map *map = ERR_PTR(-EINVAL);

	if (dma_spec->args_count != 3)
		return ERR_PTR(-EINVAL);
		goto out_put_pdev;

	if (dma_spec->args[2] >= xbar->xbar_events) {
		dev_err(&pdev->dev, "Invalid XBAR event number: %d\n",
			dma_spec->args[2]);
		return ERR_PTR(-EINVAL);
		goto out_put_pdev;
	}

	if (dma_spec->args[0] >= xbar->dma_requests) {
		dev_err(&pdev->dev, "Invalid DMA request line number: %d\n",
			dma_spec->args[0]);
		return ERR_PTR(-EINVAL);
		goto out_put_pdev;
	}

	/* The of_node_put() will be done in the core for the node */
	dma_spec->np = of_parse_phandle(ofdma->of_node, "dma-masters", 0);
	if (!dma_spec->np) {
		dev_err(&pdev->dev, "Can't get DMA master\n");
		return ERR_PTR(-EINVAL);
		goto out_put_pdev;
	}

	map = kzalloc(sizeof(*map), GFP_KERNEL);
	if (!map) {
		of_node_put(dma_spec->np);
		return ERR_PTR(-ENOMEM);
		map = ERR_PTR(-ENOMEM);
		goto out_put_pdev;
	}

	map->dma_line = (u16)dma_spec->args[0];
@@ -120,6 +121,9 @@ static void *ti_am335x_xbar_route_allocate(struct of_phandle_args *dma_spec,

	ti_am335x_xbar_write(xbar->iomem, map->dma_line, map->mux_val);

out_put_pdev:
	put_device(&pdev->dev);

	return map;
}