From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 9960A226CF6 for ; Sat, 18 Jul 2026 23:17:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784416639; cv=none; b=JwmO4cbCBYAsRAjiOsnpzhcx7yZXhTd3grUgFHT3mLucAmhYstHNtyRfx38x03Dv8UpI50t2rFVkVlXIabvDTRq2WUYczQfAnYKMY+PynH8b6+epixg/sbI/xph96BPn6EybsaP+uU2kf9Z3y8rO0ZWNUSNI9/AqpB6gXGTWii4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784416639; c=relaxed/simple; bh=UJ7vyM2rJp8+CcOLDMMT2R4YtHzDWXlxufszC5uVg2M=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=io8+3hJf+yhx/atg0Qt27VA/LGzT9Fyh0IcGzg+6LcTmzTmJNjXkiBmUprVKsiYNkgL08O1BxvQIQeHEyLTBM8evPdijuXkJZXHTPfpZcKAC4IXcEPUEmDBDSwoeVLvAhhu+F5+PCLTlJuuZLWV/2LY1XCUl294OVJmqZc1YmOE= 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=TeuhCAt5; arc=none smtp.client-ip=209.85.214.173 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="TeuhCAt5" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2cca0c5799eso65265745ad.0 for ; Sat, 18 Jul 2026 16:17:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784416638; x=1785021438; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=QAs/jDOkLcxZMEnK/1/+jTZT0MCD6a9ikkJvf7W+O2E=; b=TeuhCAt5Bv7PEQjreLE3XycvZgaeNa5WMUCFOL1F5qwMqOqj8oioeqIblGfukW/jda 54gBpkhgl8dmGB8/BgELuUzeSGMbT0RofkcEa6syw1v9EXhBFPFbrwSKAtzzeekCP747 ooYUlCa5rB17xaE9yQjsphDJj0cfvWjaH8NDF1L58PP2cPWX+yYdQ86gl5Q6fJ39WCG6 NgiPefXPZkOv8Y2XDtr3SHeb/v3IQndwGOcG7L661vtlvYquRqvngoyArcuXehfxUKpN D0U5dyL/VoHEEMWnAYGYZOG87LG/u1XMSErI+U+QbXMrgHCJ1eED2C6K33S41tOa6IuC npZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784416638; x=1785021438; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=QAs/jDOkLcxZMEnK/1/+jTZT0MCD6a9ikkJvf7W+O2E=; b=aOnQGvpn0uGxbdBGorS6hO2pu5c+7xxXbTrXPMVjfxKAzxpmt1Jm6diW5MCyJbINML bYam73re76ZMpCdixZTGNqMfi2R10X4k8cyBuB9AwAL843KZYrpbMxb2kLuqa44uoiJf 8ApCmMl7GVPRolFKK+xMFYEIVojPXtrn5x1VRjMk1Jl2bNbq8FeDpK4i2BPX7IgaPQFa QohBUSwdhyCabwpe97Jo9Ix8QIfidT3M1xI0iKjo9IhCj6kDv1hSQlzKONy+hfGKaYV+ msMfTp324o5MOQRos/MN4ygAGqXpI9aDMi0F+5+yPfME1uae5kREc0kytWAo18p5GzqV NeyA== X-Forwarded-Encrypted: i=1; AHgh+RqMoO6xkypsNRW/xJUwBeJIvimX7sLp/KlpOin6CJFm+hnYz+x6zZAoxVPQhbQe/MTNyo/c736wDmfgY8I=@vger.kernel.org X-Gm-Message-State: AOJu0YwlpvxKbkVneVrMP+WGk9QeM1p5GcmIrDS69/j6xaHxWkL+YTnZ U4GTiADcxIhSWikIR4zNxW9GXNhcGHoiLmV977sEDaOnFf7se6uouTO9 X-Gm-Gg: AfdE7cm0t3zFVChcHmSbnEIMXl4bOgGP+z4oXB7CtcvqXNyYzMnf2SA/7GQw9ftVgrM bcy9LQL9tx5NLAdQNKjrJGhsJAOnuDYZDfzyxlLDa1e7XOX/ea6ukbzLN5HE3DbpCz7OnZZvHPK sYxV+ulTsVQWnKf5Obv+5Ro64VQ1PvRlqIbewpGTx4Jx46hBhapbCOJ5del7Ns2qn4tNRCKfKEo fTFWvM/5RK9HCblgFzsUVouCMKR4WRWEmHp+7BtEerg2seJo3vZvf/C7w1EjH1g4OsXIM3UDNl8 PR2Phi14ft58Bg/wRwLw7Z/MdI7tqgkWgatsQU+vihjEURXtQHN2seqJCd0pgUvp9Qd6nIvByKC MQ2SdtSuMfEzSd+xisG9hiMOnfG9KbIg5V4VL3sb6tY61C/BspeLqpQlWOOJlfuxvyyYrSUDZq+ MNBfGJj1ma1NY7tLIMsaCjfG/Fw3JuTO8G19vVd2nqgenM3Jgr2MEnFjeoiIoqh4GKV6/6YnqEQ lSJ8KSupmUL4GfkzBtnVzlPtmT2YFKT2sIT5byL3h6U47gjkBBiuts= X-Received: by 2002:a17:903:ad0:b0:2ca:d976:95ce with SMTP id d9443c01a7336-2cf349f20f7mr86498375ad.39.1784416637917; Sat, 18 Jul 2026 16:17:17 -0700 (PDT) Received: from ryzen.lan ([2601:644:8000:7a86::e35]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2cf344f8c27sm32731155ad.34.2026.07.18.16.17.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Jul 2026 16:17:17 -0700 (PDT) From: Rosen Penev To: dmaengine@vger.kernel.org Cc: Vinod Koul , Frank Li , Xuelin Shi , Harninder Rai , linux-kernel@vger.kernel.org (open list) Subject: [PATCH] dmaengine: fsl_raid: free resources in probe Date: Sat, 18 Jul 2026 16:17:15 -0700 Message-ID: <20260718231716.230144-1-rosenp@gmail.com> X-Mailer: git-send-email 2.55.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Add free_irq() in the error unwind of fsl_re_chan_probe() and in fsl_re_remove_chan() so the interrupt is always released. Also add tasklet_kill(). Present in _remove but not _probe. Also add platform_device_put on failure as of_platform_device_create() increases the reference count and needs platform_device_put on failure. Requires placing the pointer in the struct for the _remove function. While at it, use platform_get/set_drvdata as there's no need for using a device pointer for that. Fixes: ad80da658bbc ("dmaengine: Driver support for FSL RaidEngine device.") Assisted-by: opencode:hy3-free Signed-off-by: Rosen Penev --- drivers/dma/fsl_raid.c | 32 ++++++++++++++++++++------------ drivers/dma/fsl_raid.h | 1 + 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/drivers/dma/fsl_raid.c b/drivers/dma/fsl_raid.c index 0b0b4e8fc821..b1a10292324d 100644 --- a/drivers/dma/fsl_raid.c +++ b/drivers/dma/fsl_raid.c @@ -212,10 +212,11 @@ static void fsl_re_dequeue(struct tasklet_struct *t) /* Per Job Ring interrupt handler */ static irqreturn_t fsl_re_isr(int irq, void *data) { + struct platform_device *pdata = data; struct fsl_re_chan *re_chan; u32 irqstate, status; - re_chan = dev_get_drvdata((struct device *)data); + re_chan = platform_get_drvdata(pdata); irqstate = in_be32(&re_chan->jrregs->jr_interrupt_status); if (!irqstate) @@ -645,7 +646,7 @@ static int fsl_re_chan_probe(struct platform_device *ofdev, struct platform_device *chan_ofdev; dev = &ofdev->dev; - re_priv = dev_get_drvdata(dev); + re_priv = platform_get_drvdata(ofdev); dma_dev = &re_priv->dma_dev; chan = devm_kzalloc(dev, sizeof(*chan), GFP_KERNEL); @@ -656,8 +657,7 @@ static int fsl_re_chan_probe(struct platform_device *ofdev, chan_ofdev = of_platform_device_create(np, NULL, dev); if (!chan_ofdev) { dev_err(dev, "Not able to create ofdev for jr %d\n", q); - ret = -EINVAL; - goto err_free; + return -EINVAL; } /* read reg property from dts */ @@ -683,17 +683,18 @@ static int fsl_re_chan_probe(struct platform_device *ofdev, chandev = &chan_ofdev->dev; tasklet_setup(&chan->irqtask, fsl_re_dequeue); - ret = request_irq(chan->irq, fsl_re_isr, 0, chan->name, chandev); + ret = request_irq(chan->irq, fsl_re_isr, 0, chan->name, chan_ofdev); if (ret) { dev_err(dev, "Unable to register interrupt for JR %d\n", q); ret = -EINVAL; - goto err_free; + goto err_free_tasklet; } re_priv->re_jrs[q] = chan; chan->chan.device = dma_dev; chan->chan.private = chan; chan->dev = chandev; + chan->ofdev = chan_ofdev; chan->re_dev = re_priv; spin_lock_init(&chan->desc_lock); @@ -707,7 +708,7 @@ static int fsl_re_chan_probe(struct platform_device *ofdev, if (!chan->inb_ring_virt_addr) { dev_err(dev, "No dma memory for inb_ring_virt_addr\n"); ret = -ENOMEM; - goto err_free; + goto err_free_irq; } chan->oub_ring_virt_addr = dma_pool_alloc(chan->re_dev->hw_desc_pool, @@ -739,7 +740,7 @@ static int fsl_re_chan_probe(struct platform_device *ofdev, out_be32(&chan->jrregs->jr_config_1, FSL_RE_CFG1_CBSI | FSL_RE_CFG1_CBS0 | status); - dev_set_drvdata(chandev, chan); + platform_set_drvdata(chan_ofdev, chan); /* Enable RE/CHAN */ out_be32(&chan->jrregs->jr_command, FSL_RE_ENABLE); @@ -749,7 +750,12 @@ static int fsl_re_chan_probe(struct platform_device *ofdev, err_free_1: dma_pool_free(chan->re_dev->hw_desc_pool, chan->inb_ring_virt_addr, chan->inb_phys_addr); +err_free_irq: + free_irq(chan->irq, chan_ofdev); +err_free_tasklet: + tasklet_kill(&chan->irqtask); err_free: + platform_device_put(chan_ofdev); return ret; } @@ -828,7 +834,7 @@ static int fsl_re_probe(struct platform_device *ofdev) return -ENOMEM; } - dev_set_drvdata(dev, re_priv); + platform_set_drvdata(ofdev, re_priv); /* Parse Device tree to find out the total number of JQs present */ for_each_compatible_node_scoped(np, NULL, "fsl,raideng-v1.0-job-queue") { @@ -864,21 +870,23 @@ static void fsl_re_remove_chan(struct fsl_re_chan *chan) { tasklet_kill(&chan->irqtask); + free_irq(chan->irq, chan->ofdev); + dma_pool_free(chan->re_dev->hw_desc_pool, chan->inb_ring_virt_addr, chan->inb_phys_addr); dma_pool_free(chan->re_dev->hw_desc_pool, chan->oub_ring_virt_addr, chan->oub_phys_addr); + + platform_device_put(chan->ofdev); } static void fsl_re_remove(struct platform_device *ofdev) { struct fsl_re_drv_private *re_priv; - struct device *dev; int i; - dev = &ofdev->dev; - re_priv = dev_get_drvdata(dev); + re_priv = platform_get_drvdata(ofdev); /* Cleanup chan related memory areas */ for (i = 0; i < re_priv->total_chans; i++) diff --git a/drivers/dma/fsl_raid.h b/drivers/dma/fsl_raid.h index adbfede330a7..34d362803610 100644 --- a/drivers/dma/fsl_raid.h +++ b/drivers/dma/fsl_raid.h @@ -270,6 +270,7 @@ struct fsl_re_chan { struct list_head active_q; /* already issued on hw, not completed */ struct list_head submit_q; struct list_head free_q; /* alloc available queue */ + struct platform_device *ofdev; struct device *dev; struct fsl_re_drv_private *re_dev; struct dma_chan chan; -- 2.55.0