From nobody Mon May 25 08:11:42 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 67E0D3DCDA4 for ; Fri, 15 May 2026 17:20:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778865647; cv=none; b=tQV9T9N5PW3sgQCRka2fZfoIf4S2Sv6WMmK4km3seSVF5nNBejDQF9VOmuwYID6LLlnW35Um/BHnc6CNYKXd+90/Yvh10vQI56/pkKHNb4MknKXCGLGvpSUCGrbm4nWxW1sIbcOS/7csuCRSohFQ7aBQp5FxjlUPRd3fBxs2x74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778865647; c=relaxed/simple; bh=lGBlNCNijk/Efa5PcvFYiun6BRP1lu0JZOhZHIl9RTg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n8iCLI2zpPEYPma1/nfVLhX0F8WLMzdCsalj7UBoO00RChqwTNDbtAM41gLEig1e96H+P9AB1bR9fibI9hU3h2Gwz+XQYlr3fXgacylrIGvic8WopyhMzZqGqLiaYTHqymEnV25FkjMnB0NX478Q57EHOshDkGE7L9oqLYbiK1o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JufiQFUS; arc=none smtp.client-ip=209.85.214.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JufiQFUS" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2babfd18435so629945ad.1 for ; Fri, 15 May 2026 10:20:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778865646; x=1779470446; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=7wVByEQNzHAoTLnCJhtnshp7ljQBgBd5RO0oGJrAuAM=; b=JufiQFUSUayxPPH9ccsv9H2/uLndVlYMNVFO7j3+M6r/IhIWQTfd/Bjg1DPPM5sokz AhJFzkbRU1DiNhocUL+KXcXwiOIBuvKZdrZXYRoXLOuV9m1XQJG4PrGhRTAkbWFK/o4w 4cd6iiSHwrtygyzVYiDW9evODbU9zYoO/trkwWKVDzM6Gmz3UMoaakDqX6cFXHsekEBV 5ZF34z+JYYkJVFtibXy4PBOf+N6hxvPAJCIVJHXBKNHWYFjDlt9rNtP9/lFBiCSk9Bg/ mXTHAe0KAQbQfvc5zuawmx025iD7ap2sGhIhnoOlaOGl7ov8HxJWiu2vsDLMKq7t1tBe Tsuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778865646; x=1779470446; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=7wVByEQNzHAoTLnCJhtnshp7ljQBgBd5RO0oGJrAuAM=; b=GjGppb38AiZCu4/EdvT8vxqBfFOnwAe95qV7iIMU4dEJlOK8jzMphriFo0933TywIQ +KG+AQpzXee/wZWq4WAJpLYYqR7EdbJUw/1mMYflMSyKF4BrOMsorWQCbUjgSshv9sta 9jUDd5AXYrKTpAKeAUAmmuiC1b+nlpy/9Rvy6otAqLyGTpDsxdW3CfepOd/OENCLBWJh yy0lldpicHgv6d5rxMXX7k2Agles/G/6ATVQ7dKMUoFNdWCmlkXzkuEKSqhrSUyAzMzc Gu1CGMpenQcR1PQ7k5pD+D/7sK1C9kmGLGVSGJKs7cwSLuZYPMJQcJIltGE18+HXrzSw KqsA== X-Forwarded-Encrypted: i=1; AFNElJ+76k+jv1xullmKf1pqjpxCnApkwXGfO+KthlnhEu7VKeBxY4eldEuYGH8XAAAqJo7EVz3qFKltmqmljzU=@vger.kernel.org X-Gm-Message-State: AOJu0YyDq5yBSeYkwsYrKVXBZ1bVLvz8m8qSbt+MFoZrhE+m0yxhFe83 ZtXEa2ODF23yZ8vB2OkoWAssUakxF3ePMCLeu7GFKfAbCO/TWqluaIhf X-Gm-Gg: Acq92OG6WhUZ9ItYLSDxVovvucvkLY3/vjtraSYaIm5/2cUJWYMYS84blAlDFSrLXHL DOjUzCQtv2iQplMV9jPXK2+gAmavNJzqIYvy3a+lkWyh2OOhuFiAeJgZIvN2nJdmQZf5OFHXW+L 5jIqpHOT/8s5vPH7TUtKYXDcIwERSKREacZOMzbsEhf60UkfWzdsjFYuDMUKjOoDHSMSKauLE1r 9FFiVr29azHLNxqJXUNisBzcxpLbZY/p+5ZVLUFXP2sRpwwcwRLlRW/zyQsd//75IvIAEYkWFnh SdyLxicZ2K6iNKmMOfLZwtsvSuhiUNBGgM34wHXCyIdIZ3UDmNIB8gS8qxHiE2rgfCGsbL2K0vQ 0aq2xEKwFPGXrWasxl8fkiKbNL9EFTz/SU4BvyEExkXYlUfL9Y82ZRgXnA0nq2FOezgoGvQyOUn BsoL8kjEfiDCPDUzYkCYBNaxc4HgPL7cLT8sjaehp0S4gxGO0NZ1j5UTBhE4UA3X3eyO6faOGR2 nPOIkchzzAXjyudlYw= X-Received: by 2002:a17:902:bb96:b0:2bd:147d:c712 with SMTP id d9443c01a7336-2bd7e78540bmr38358085ad.1.1778865645369; Fri, 15 May 2026 10:20:45 -0700 (PDT) Received: from junjungu-PC.localdomain ([223.166.246.30]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5c0600c3sm63151085ad.29.2026.05.15.10.20.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 May 2026 10:20:44 -0700 (PDT) From: Felix Gu Date: Sat, 16 May 2026 01:20:34 +0800 Subject: [PATCH 1/2] spi: atmel: fix resource leak on DMA buffer allocation failure Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260516-atmel-v1-1-674fb4707af6@gmail.com> References: <20260516-atmel-v1-0-674fb4707af6@gmail.com> In-Reply-To: <20260516-atmel-v1-0-674fb4707af6@gmail.com> To: Ryan Wanner , Mark Brown , Nicolas Ferre , Alexandre Belloni , Claudiu Beznea , Radu Pirea , Richard Genoud , Wenyou Yang Cc: linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Mark Brown , Felix Gu X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778865636; l=5833; i=ustc.gu@gmail.com; h=from:subject:message-id; bh=lGBlNCNijk/Efa5PcvFYiun6BRP1lu0JZOhZHIl9RTg=; b=5Q+74fz79MgI4YIBMsTxIncGfHx+moPofA723Hs/A6xnwjiRnVh8nzw2LNOwc4mgE2iWD/nBL HHV9kWxV/dkBpiXGKjC6jk+WyFnJypGwKXXSKG6GakYrEojezMZrrMB X-Developer-Key: i=ustc.gu@gmail.com; a=ed25519; pk=fjUXwmjchVN7Ja6KGP55IXOzFeCl9edaHoQIEUA+/hw= The original code set use_dma to false when dma_alloc_coherent() fails, so DMA channels allocated earlier were never freed, causing a resource leak. Fix by moving the bounce buffer allocation into atmel_spi_configure_dma() and extending atmel_spi_release_dma() to also free the bounce buffers. Any allocation failure in the DMA configuration path now rolls back both channels and buffers through the same release function. Fixes: a9889ed62d06 ("spi: atmel: Implements transfers with bounce buffer") Signed-off-by: Felix Gu --- drivers/spi/spi-atmel.c | 113 ++++++++++++++++++++++++--------------------= ---- 1 file changed, 57 insertions(+), 56 deletions(-) diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index 25aa294631c8..e519a86a2b45 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c @@ -559,6 +559,34 @@ static int atmel_spi_dma_slave_config(struct atmel_spi= *as, u8 bits_per_word) return err; } =20 +static void atmel_spi_release_dma(struct spi_controller *host, + struct atmel_spi *as) +{ + if (host->dma_rx) { + dma_release_channel(host->dma_rx); + host->dma_rx =3D NULL; + } + if (host->dma_tx) { + dma_release_channel(host->dma_tx); + host->dma_tx =3D NULL; + } + + if (IS_ENABLED(CONFIG_SOC_SAM_V4_V5)) { + if (as->addr_tx_bbuf) { + dma_free_coherent(&as->pdev->dev, SPI_MAX_DMA_XFER, + as->addr_tx_bbuf, + as->dma_addr_tx_bbuf); + as->addr_tx_bbuf =3D NULL; + } + if (as->addr_rx_bbuf) { + dma_free_coherent(&as->pdev->dev, SPI_MAX_DMA_XFER, + as->addr_rx_bbuf, + as->dma_addr_rx_bbuf); + as->addr_rx_bbuf =3D NULL; + } + } +} + static int atmel_spi_configure_dma(struct spi_controller *host, struct atmel_spi *as) { @@ -569,7 +597,8 @@ static int atmel_spi_configure_dma(struct spi_controlle= r *host, if (IS_ERR(host->dma_tx)) { err =3D PTR_ERR(host->dma_tx); dev_dbg(dev, "No TX DMA channel, DMA is disabled\n"); - goto error_clear; + host->dma_tx =3D NULL; + return err; } =20 host->dma_rx =3D dma_request_chan(dev, "rx"); @@ -580,12 +609,31 @@ static int atmel_spi_configure_dma(struct spi_control= ler *host, * requested tx channel. */ dev_dbg(dev, "No RX DMA channel, DMA is disabled\n"); - goto error; + host->dma_rx =3D NULL; + goto err_release_dma; } =20 err =3D atmel_spi_dma_slave_config(as, 8); if (err) - goto error; + goto err_release_dma; + + if (IS_ENABLED(CONFIG_SOC_SAM_V4_V5)) { + as->addr_tx_bbuf =3D dma_alloc_coherent(dev, SPI_MAX_DMA_XFER, + &as->dma_addr_tx_bbuf, + GFP_KERNEL | GFP_DMA); + if (!as->addr_tx_bbuf) { + err =3D -ENOMEM; + goto err_release_dma; + } + + as->addr_rx_bbuf =3D dma_alloc_coherent(dev, SPI_MAX_DMA_XFER, + &as->dma_addr_rx_bbuf, + GFP_KERNEL | GFP_DMA); + if (!as->addr_rx_bbuf) { + err =3D -ENOMEM; + goto err_release_dma; + } + } =20 dev_info(&as->pdev->dev, "Using %s (tx) and %s (rx) for DMA transfers\n", @@ -593,13 +641,10 @@ static int atmel_spi_configure_dma(struct spi_control= ler *host, dma_chan_name(host->dma_rx)); =20 return 0; -error: - if (!IS_ERR(host->dma_rx)) - dma_release_channel(host->dma_rx); - if (!IS_ERR(host->dma_tx)) - dma_release_channel(host->dma_tx); -error_clear: - host->dma_tx =3D host->dma_rx =3D NULL; + +err_release_dma: + atmel_spi_release_dma(host, as); + return err; } =20 @@ -611,18 +656,6 @@ static void atmel_spi_stop_dma(struct spi_controller *= host) dmaengine_terminate_all(host->dma_tx); } =20 -static void atmel_spi_release_dma(struct spi_controller *host) -{ - if (host->dma_rx) { - dma_release_channel(host->dma_rx); - host->dma_rx =3D NULL; - } - if (host->dma_tx) { - dma_release_channel(host->dma_tx); - host->dma_tx =3D NULL; - } -} - /* This function is called by the DMA driver from tasklet context */ static void dma_callback(void *data) { @@ -1581,30 +1614,6 @@ static int atmel_spi_probe(struct platform_device *p= dev) as->use_pdc =3D true; } =20 - if (IS_ENABLED(CONFIG_SOC_SAM_V4_V5)) { - as->addr_rx_bbuf =3D dma_alloc_coherent(&pdev->dev, - SPI_MAX_DMA_XFER, - &as->dma_addr_rx_bbuf, - GFP_KERNEL | GFP_DMA); - if (!as->addr_rx_bbuf) { - as->use_dma =3D false; - } else { - as->addr_tx_bbuf =3D dma_alloc_coherent(&pdev->dev, - SPI_MAX_DMA_XFER, - &as->dma_addr_tx_bbuf, - GFP_KERNEL | GFP_DMA); - if (!as->addr_tx_bbuf) { - as->use_dma =3D false; - dma_free_coherent(&pdev->dev, SPI_MAX_DMA_XFER, - as->addr_rx_bbuf, - as->dma_addr_rx_bbuf); - } - } - if (!as->use_dma) - dev_info(host->dev.parent, - " can not allocate dma coherent memory\n"); - } - if (as->caps.has_dma_support && !as->use_dma) dev_info(&pdev->dev, "Atmel SPI Controller using PIO only\n"); =20 @@ -1666,7 +1675,7 @@ static int atmel_spi_probe(struct platform_device *pd= ev) pm_runtime_set_suspended(&pdev->dev); =20 if (as->use_dma) - atmel_spi_release_dma(host); + atmel_spi_release_dma(host, as); =20 spi_writel(as, CR, SPI_BIT(SWRST)); spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */ @@ -1689,15 +1698,7 @@ static void atmel_spi_remove(struct platform_device = *pdev) /* reset the hardware and block queue progress */ if (as->use_dma) { atmel_spi_stop_dma(host); - atmel_spi_release_dma(host); - if (IS_ENABLED(CONFIG_SOC_SAM_V4_V5)) { - dma_free_coherent(&pdev->dev, SPI_MAX_DMA_XFER, - as->addr_tx_bbuf, - as->dma_addr_tx_bbuf); - dma_free_coherent(&pdev->dev, SPI_MAX_DMA_XFER, - as->addr_rx_bbuf, - as->dma_addr_rx_bbuf); - } + atmel_spi_release_dma(host, as); } =20 spin_lock_irq(&as->lock); --=20 2.43.0 From nobody Mon May 25 08:11:42 2026 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A91E13DB997 for ; Fri, 15 May 2026 17:20:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778865652; cv=none; b=ho2UDZLFhrhfL3OBDt1qZpxooBH8FOMowMFiP+YYDReIy4jUL7YAK6tEyvXZ3sG/QjG/PpKb9yfsi5ZXryb6KbUOKaXjRKCo51JZvCijgoA/E/Z5RUiLFAGidkogDGW6UHFf87fGZMwXxqt4PB5xadAqUJyv32ThQS+EHU42oug= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778865652; c=relaxed/simple; bh=Y4G8qeOAlLyitSmwDgedqstgSrqLdlv00S5ry4Dhr3o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KuacXHeEJ9rRxVKp2rJU6oEW44xnTPejbzScvwWajliVc+H60oZi/xlG8f+jKpdUjUIjeNNNTr2Fs3CsEg+8Tjc6vvmKDez7Op4JKKiHhSxseyElKQyfGUXZkDGKDiHrWFoP4rLNKJiemT0E9ptVCRNKcl/PfrD5FmP3+kouRh4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=O8BI/IGl; arc=none smtp.client-ip=209.85.214.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="O8BI/IGl" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2bd266f6fc0so619595ad.2 for ; Fri, 15 May 2026 10:20:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778865650; x=1779470450; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=wLuPzKvrSzHkaCJJGeMDqoTA3l2mSjliAhV8bnUhOhA=; b=O8BI/IGlPM5gCq3yzV6j3VX0tzIK4wLLmwLrf8HPFMog5ByUS5hXgVxBw4tAJ5GQaT ZDZkcynXdIsXqC+fckJymwcAJYhavO2oWevqj3CjgeB56NMuH+JHYib6lacsG6CAlx6b BXxFlynhfxShaJZ6Jg8rE+46TSojsk+k6GyHld2yowrkK0CRoLi2bBbElkKVH8MBVYw5 jGBklH6O6ENvzjixyE7TZX/qMv76dfMHG9dsuMUrvIv/+H7bvaxj0q2Ulju/qHoTi0xo tIBz0T950/Kwi0ER9MxL0WFkE2Upkrt5wpKSdLyDLIpzr8POnlABz7MxwRl5XyJYfXn5 GAmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778865650; x=1779470450; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=wLuPzKvrSzHkaCJJGeMDqoTA3l2mSjliAhV8bnUhOhA=; b=sXtdZ/ocbAUNPvx33p6FxzxGs9Fkx4XL6U+MLluJmuUDN+XGQXTwoY1FDiZ52+Ydro ES+kccGQQtRBDTUW0/2HRTj5JK0EAc+MQnqr3J16rVKr68bbDjPv1nw/JBcWbmHxOI9Y V/yKY9jZxdIWbfzLi/hXmmMgjY07Qf+XjDoD4FM2Ug/m7gjs8uYcyh51EXdAh0lpTQHf gFKI4DRR8617ymx7tLznwNfPaI7bJgQxwN8gY275PlM79OEafvVBS2IUP5i2h3IzQjzI WBYBSb5dgWUj0zKHVpome0EDLgGaaCbXiBWFQfFS6I46lV7bdM3kcQ1cWi0CnEALWzTV VBvg== X-Forwarded-Encrypted: i=1; AFNElJ/u6DruwlHLkuL59bvEUA3Fm8ac1f3+tQGG14HFvBqL8ZOFdAcF8vBEEEpYAOMADCOpcGKPxkcxkA7WWQw=@vger.kernel.org X-Gm-Message-State: AOJu0Yy8IY0pwBDMb+aR1vCtBuafbs4bozlAawadh35N+qXFqZ6kPpNi o9rU8rTMR2wmTuJiC+ykerr0cnLGBtQVQuQ19KSKNzHL1g74Zr2JU3LK X-Gm-Gg: Acq92OHVLmr0GHVZHVeTx9casv5m+bVfSitiKb5NRQxuZNQZgteGSzvgNgt54KN/Y0U G23SKaGhbxCW7P0Lx8UfVJZklxpkNjZrH1DDe+q4vhZYFJZdvzxVBg9TDiSB+Gum/gzixjclSUO 5WCOIx2RKU+nyNTy/pBzdpxwC0YYLeayEiMVIYyWLfNSCkqKLpIY+RIlF2K8t/cmIkxl8SM3HoL tVCdT/7Z4ivLMbNrnJce3bteLiGeS5Ooverh9J+9nEGTYvejPi1WUOEMrXyq8eC4hPLOEjBToaZ e6Mljf2Ih5uz5rNHDqAe4AjAgE5dwn3SD/v4zjNJp3VcpHJoLmOjoTPJbVSaRuL6i/NpbQTYqBu U5LMP23/hmgatc15k16/aiBvxt1LTQCY85wvM+X/5D+aFIpSQW2KCkSJmr1q5+elLJrmSXksyvv qArmWa1FyuiftI94PTi9G6nyG+wJXoDn63mj4cXD6Q5u3Lts8F/St9iPHe3OQFnOPFrVHuwAcfN DAcBWD4ySZek8dR+78= X-Received: by 2002:a17:902:7688:b0:2ba:22db:e1e0 with SMTP id d9443c01a7336-2bd7e8aad48mr43607435ad.10.1778865649587; Fri, 15 May 2026 10:20:49 -0700 (PDT) Received: from junjungu-PC.localdomain ([223.166.246.30]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5c0600c3sm63151085ad.29.2026.05.15.10.20.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 May 2026 10:20:49 -0700 (PDT) From: Felix Gu Date: Sat, 16 May 2026 01:20:35 +0800 Subject: [PATCH 2/2] spi: atmel: fix DMA resource leak on probe error paths Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260516-atmel-v1-2-674fb4707af6@gmail.com> References: <20260516-atmel-v1-0-674fb4707af6@gmail.com> In-Reply-To: <20260516-atmel-v1-0-674fb4707af6@gmail.com> To: Ryan Wanner , Mark Brown , Nicolas Ferre , Alexandre Belloni , Claudiu Beznea , Radu Pirea , Richard Genoud , Wenyou Yang Cc: linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Mark Brown , Felix Gu X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778865636; l=2147; i=ustc.gu@gmail.com; h=from:subject:message-id; bh=Y4G8qeOAlLyitSmwDgedqstgSrqLdlv00S5ry4Dhr3o=; b=vYNHvbuBkLq8xy1hzqJDfrUoFwFc/yX8ohsH1Ku1L/igMJWL76sCYmv8fpBw6zA8qxw6a1iTU C9wu8+ztKqzCZWaWMXRx17ntiRkxLkkTHsfeLpeTZ0bF0iyuliCoVIx X-Developer-Key: i=ustc.gu@gmail.com; a=ed25519; pk=fjUXwmjchVN7Ja6KGP55IXOzFeCl9edaHoQIEUA+/hw= The DMA resources allocated by atmel_spi_configure_dma() were not released when devm_request_irq() or clk_prepare_enable() failed. Route these two error paths through out_free_dma so that atmel_spi_release_dma() releases the channels. The same issue existed in the gclk_prepare_enable() failure path, which jumped to out_disable_clk and returned without DMA cleanup. The new fall-through from out_disable_clk into out_free_dma now handles it as well. Fixes: 1ccc404a7fc4 ("spi/spi-atmel: add dmaengine support") Signed-off-by: Felix Gu --- drivers/spi/spi-atmel.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index e519a86a2b45..893f7c7ce358 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c @@ -1625,12 +1625,12 @@ static int atmel_spi_probe(struct platform_device *= pdev) 0, dev_name(&pdev->dev), host); } if (ret) - return ret; + goto out_free_dma; =20 /* Initialize the hardware */ ret =3D clk_prepare_enable(clk); if (ret) - return ret; + goto out_free_dma; =20 /* * In cases where the peripheral clock is higher,the FLEX_SPI_CSRx.SCBR @@ -1661,7 +1661,7 @@ static int atmel_spi_probe(struct platform_device *pd= ev) =20 ret =3D spi_register_controller(host); if (ret) - goto out_free_dma; + goto out_disable_rpm; =20 /* go! */ dev_info(&pdev->dev, "Atmel SPI Controller version 0x%x at 0x%08lx (irq %= d)\n", @@ -1670,18 +1670,18 @@ static int atmel_spi_probe(struct platform_device *= pdev) =20 return 0; =20 -out_free_dma: +out_disable_rpm: pm_runtime_disable(&pdev->dev); pm_runtime_set_suspended(&pdev->dev); - - if (as->use_dma) - atmel_spi_release_dma(host, as); - spi_writel(as, CR, SPI_BIT(SWRST)); spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */ - clk_disable_unprepare(as->gclk); + if (as->gclk) + clk_disable_unprepare(as->gclk); out_disable_clk: clk_disable_unprepare(clk); +out_free_dma: + if (as->use_dma) + atmel_spi_release_dma(host, as); =20 return ret; } --=20 2.43.0