From nobody Mon Feb 9 05:53:07 2026 Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) (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 C0050334374 for ; Thu, 16 Oct 2025 15:46:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760629596; cv=none; b=oZOZzSzUyPHFQiM5vwDLao8AwQemm/yG5JruEQG2TI4gD9vlA3SkymjitFda7VnkCF1tGhUi4++DVyUU+PoR9+WOlKYiiN52O1HSFKgRggOXkgoS5AFoEdTpgP6xOCAKov7djYXCf+LAAgc5DheRJxzWasx2I6XOM+DelnpYlro= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760629596; c=relaxed/simple; bh=OzK0aYW2LWITX9fdd4z7rDbgFG5oDHlyFtFytqntWLc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=J/Lqv9ulYKIXTUEgBFEIJAAdXMCFbihDu9tGVfjccA/iFobs0Kjh632PhBbacD3qt9JWO9k7DPB/3v7l+++grzpGLStLitgPmuXSZQo9uYh/EzixtHgHZJoC5jqBUNA46EGF0n3gG10ProYHRHySbbPtJGxZUqWvk/H5TRMP7MQ= 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=mRQrZ46W; arc=none smtp.client-ip=209.85.208.41 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="mRQrZ46W" Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-63c1006fdcfso1539125a12.2 for ; Thu, 16 Oct 2025 08:46:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760629593; x=1761234393; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KXSMFjXcnbUgtoA/eC/AHIzf0ylAZ7zJ33rVYw0AFyk=; b=mRQrZ46WeSWPrHBajjqXmUEaaXTD0TBKQV16FGs1AMW04zcJfo9Th/xQdtGiPL4EWm HZvGgCg8XjxF59orln/gtghQOWLZ44hJRc9DDgo4CLumm32vw6TKGMpp8XvfDNBsK6eh l/FRFtongyCuVHaUWG0f4BYNE/2ajkBJnlqc7xCWOXrhVbAwSkqX1vh3xZAKDyEmYtNy F2qbZ3EipxTe5j71XrVHXgaxHIkEvwKFUoc1/xAjNkK3v/LoCOSanFtBKWODZCyJZf9O EjnFeRFoMP2YmS30sLUL3zcl3RsvS3sj2loZO6wg7Lo7CThFU7WcsKkwJKMgcipXZa95 kwxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760629593; x=1761234393; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KXSMFjXcnbUgtoA/eC/AHIzf0ylAZ7zJ33rVYw0AFyk=; b=F6aw4salWcJbtpKlAwvkxmc4YjJOus7/CMUTu6F88oMFO9OetgqLNO8sxSGEQiJ9T8 +s0aqE1EDRVfHr1PVb2llK6CIFobejI80RiyPMJMdUQ99ZPrwMDJFPLZtsVCI1dbvBvg Ues+ixGhmPK1ELcHOxHMVWle0fCx5JMb4unW7pJuVhsTyVyoJ7BbeAP/WX/bvuZRXfux xEtTIkr5JmRlx50kGuj6fKB2PFR0owUBlu7R1A/wMOm1AMgebjaft7580KhMIrPlUGfl cHU99bPycczR6yuI/Cx9ejrw60P3ojEinzfn4M1MnAVEmCKgonGJhgbGeYDQy8m8bq44 Xawg== X-Forwarded-Encrypted: i=1; AJvYcCV3o+BGDmW6/lHO+orgb2lt5j/zpAT/LSBDWy/4Mu/ltvPAYWCN6WupdVwmskg4B0VtH0OX/Tk6STypaTE=@vger.kernel.org X-Gm-Message-State: AOJu0Yzo8o33aXFL4UyYB1N7mTPiUlGWi6O5tdvcH6TZlvNtwjXvw8Hg oo44GlgUhi6HBOxR0MwX4eAxMtffJtVDERh3ZvrO3ziaOPmYBs5t8+F7n4bmwQ== X-Gm-Gg: ASbGncv1KcNfZfAr2dAe1uQ1Hzcns8U5VHCp7XFeBo7IAMvT7Hot07RiLK5cpH4MFC+ D6EIzx6+i7ibV62TgEfYmUBV9scrUR+e9zd+iQbB08Ft016QDJGV87+T/Sh+HshAhRtHWst/jua Bo2diPUEZjMIf3zHT2Knw05VdL5uVPp4hJOuTHEFIGqZv4TLyxDYMsDpCdOrtrz32fF+/c2mN8J AKYhlqhrGpppmNxcyq3UqRD6rgUlz2/jlJOHnQ7AlZvmFgM87ilWFCKTKrK3k3zDcT7QEk8uUSY xWRIII7i8WBpUnT31NiNtZZkUMLr+nj0vyIv4Y1VitNbgTA7XZnHa8hkLMWt2Ei3k7YD7Zzcopq u5CmDhVMRMJTQ4LglsXiVbJ3ZMJmB776vxv9wEohIcSLtQgWhL5OuaaU+L7a7nIZocgmmUkufxr UnT7QKGZe0aRXxHQiXL20o/FJHnBZz X-Google-Smtp-Source: AGHT+IGa47IwIEhUciz8R5X/HKhA6vp9Amv7n7WiwS9+yqHKoStQugBWBhHlks75VQUoSvBoKGi9kA== X-Received: by 2002:a05:6402:3491:b0:63c:1e95:dd62 with SMTP id 4fb4d7f45d1cf-63c1f6c36c0mr374154a12.26.1760629592939; Thu, 16 Oct 2025 08:46:32 -0700 (PDT) Received: from NB-6746.corp.yadro.com ([188.243.183.84]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-63c12279a54sm1237989a12.11.2025.10.16.08.46.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Oct 2025 08:46:32 -0700 (PDT) From: Artem Shimko To: Eugeniy Paltsev , Vinod Koul Cc: p.zabel@pengutronix.de, Artem Shimko , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 1/2] dmaengine: dw-axi-dmac: simplify PM functions and use modern macros Date: Thu, 16 Oct 2025 18:46:25 +0300 Message-ID: <20251016154627.175796-2-a.shimko.dev@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251016154627.175796-1-a.shimko.dev@gmail.com> References: <20251016154627.175796-1-a.shimko.dev@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Simplify the power management code by removing redundant wrapper functions and using modern kernel PM macros. This reduces code duplication and improves maintainability. The changes convert the suspend/resume functions to take device pointer directly instead of the chip structure, allowing removal of the runtime PM wrapper functions. The manual PM ops definition is replaced with DEFINE_RUNTIME_DEV_PM_OPS() macro and pm_ptr() is used for the platform driver. Probe and remove functions are updated to call PM functions with device pointer. Signed-off-by: Artem Shimko --- .../dma/dw-axi-dmac/dw-axi-dmac-platform.c | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c b/drivers/dma/d= w-axi-dmac/dw-axi-dmac-platform.c index b23536645ff7..8b7cf3baf5d3 100644 --- a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c +++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c @@ -1314,8 +1314,10 @@ static int dma_chan_resume(struct dma_chan *dchan) return 0; } =20 -static int axi_dma_suspend(struct axi_dma_chip *chip) +static int axi_dma_suspend(struct device *dev) { + struct axi_dma_chip *chip =3D dev_get_drvdata(dev); + axi_dma_irq_disable(chip); axi_dma_disable(chip); =20 @@ -1325,9 +1327,10 @@ static int axi_dma_suspend(struct axi_dma_chip *chip) return 0; } =20 -static int axi_dma_resume(struct axi_dma_chip *chip) +static int axi_dma_resume(struct device *dev) { int ret; + struct axi_dma_chip *chip =3D dev_get_drvdata(dev); =20 ret =3D clk_prepare_enable(chip->cfgr_clk); if (ret < 0) @@ -1343,20 +1346,6 @@ static int axi_dma_resume(struct axi_dma_chip *chip) return 0; } =20 -static int __maybe_unused axi_dma_runtime_suspend(struct device *dev) -{ - struct axi_dma_chip *chip =3D dev_get_drvdata(dev); - - return axi_dma_suspend(chip); -} - -static int __maybe_unused axi_dma_runtime_resume(struct device *dev) -{ - struct axi_dma_chip *chip =3D dev_get_drvdata(dev); - - return axi_dma_resume(chip); -} - static struct dma_chan *dw_axi_dma_of_xlate(struct of_phandle_args *dma_sp= ec, struct of_dma *ofdma) { @@ -1590,7 +1579,7 @@ static int dw_probe(struct platform_device *pdev) * driver to work also without Runtime PM. */ pm_runtime_get_noresume(chip->dev); - ret =3D axi_dma_resume(chip); + ret =3D axi_dma_resume(chip->dev); if (ret < 0) goto err_pm_disable; =20 @@ -1638,7 +1627,7 @@ static void dw_remove(struct platform_device *pdev) axi_dma_disable(chip); =20 pm_runtime_disable(chip->dev); - axi_dma_suspend(chip); + axi_dma_suspend(chip->dev); =20 for (i =3D 0; i < DMAC_MAX_CHANNELS; i++) if (chip->irq[i] > 0) @@ -1653,9 +1642,7 @@ static void dw_remove(struct platform_device *pdev) } } =20 -static const struct dev_pm_ops dw_axi_dma_pm_ops =3D { - SET_RUNTIME_PM_OPS(axi_dma_runtime_suspend, axi_dma_runtime_resume, NULL) -}; +static DEFINE_RUNTIME_DEV_PM_OPS(dw_axi_dma_pm_ops, axi_dma_suspend, axi_d= ma_resume, NULL); =20 static const struct of_device_id dw_dma_of_id_table[] =3D { { @@ -1680,7 +1667,7 @@ static struct platform_driver dw_driver =3D { .driver =3D { .name =3D KBUILD_MODNAME, .of_match_table =3D dw_dma_of_id_table, - .pm =3D &dw_axi_dma_pm_ops, + .pm =3D pm_ptr(&dw_axi_dma_pm_ops), }, }; module_platform_driver(dw_driver); --=20 2.43.0 From nobody Mon Feb 9 05:53:07 2026 Received: from mail-ed1-f50.google.com (mail-ed1-f50.google.com [209.85.208.50]) (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 0C81234F47D for ; Thu, 16 Oct 2025 15:46:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760629598; cv=none; b=hejx1c/V32E1IMR6gGhv0KS25/zzwgRaJRq/nQJXpCo+zvcn2c6HM9MEZcqLV6DiwSBF8TXD5qy0XB8WpqTl0E3whKhwXWv5Y/dfMRd+VCIdvmAX4yYNf9vH1cQuaIrOGwZV/jaZS5oZkTWZpBRq+qMGHOK3EQNLg8ZDW/LHV9o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760629598; c=relaxed/simple; bh=kUCeFgHQMCRWh0vi3n2eXqVII7Jhb7VzNj8JhwyAw1E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cQpFPYosApqWpFfQg7GKuGJop/z2hIFy7V/HvEKTDXuN5BIyAGhQk/63d9QAa7tIAojFpj2dGprWPVLDN7VbVdZhe/LD5w7dUrfsforSMbQNQ5W0CZYb8X8CCs/hIRrH4YFr+LyaBdM77ZXfkFYGQqiITPlHzhB00fyCjD1l7S8= 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=fE11jwQ6; arc=none smtp.client-ip=209.85.208.50 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="fE11jwQ6" Received: by mail-ed1-f50.google.com with SMTP id 4fb4d7f45d1cf-6394938e0ecso1574466a12.1 for ; Thu, 16 Oct 2025 08:46:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760629595; x=1761234395; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=eTOdQ6EvuzATlkoQOWo/SqmOTJM5gobylAZ7Hzz1+yw=; b=fE11jwQ6TDyFYms1RVcFZdjvxB0vpm5q6nUsUK+EhQZdk5SnAGt1LPp6fRn3T022L0 ZmGlm+sjUIXKNFoAXdIrxMyYdvLVop6HKZR+NDZZckVzcD0sfYOSqeqgLMKa7LP9TqVq z/soEQFvBEeRdzLg0/hM0hGrx+2IeuIiaPpmICN2o9KrVmZZlGhxsBHakaY7VUzgFnUS CQaj/rmTjOj5u8Ymh4SqvtIvLeERe1Ftj3+8URXWEfLmT/s0ijBjHouYwmkoV7nZ53TT mpI2QdywaHyNiJqdYQEXDJA15j0rsab12Uc1XXI9JZB/+TIFz14IT6kFHLRCw4cm/JYr BCIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760629595; x=1761234395; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=eTOdQ6EvuzATlkoQOWo/SqmOTJM5gobylAZ7Hzz1+yw=; b=N3UzMdwEE7RfsLXqkO6UYWu37qSDmDfAQ0zCfJXSh/FvZkZWBgbQBh5lmK9nCD8VUb b5VuNBSubtFiYAbxjpXOWm9dzcOkGvm59WMjMtdlDqyepwFAKUgfybMv+TujNmPl7x7O NcQR1yhHfatfo8p93dgr6wtJz/Uzt8OBZQakxstEsRVoaf57YNp+XABE5U59zw1ZR9sS Ra0BLZxoubA+A5EVDe+/VtTY9llfctBs6d6IRWP13GOhYv1J6L0aeo1EO8gcgY3whSY9 P2fCIjmFUeFSAdCSQsUKDTER1wSa09Ojh6CN841dldjk59jduwgFIpo3OuR+KM0aTEtI 7ZRw== X-Forwarded-Encrypted: i=1; AJvYcCV6u5cMFbA6oEr4aQt/g5NUIRP3WYCkFczxUl3O+jmlJhLJ6ntVMiP8Mj2NPNL4HbtvbiO29z3MUvDRo0k=@vger.kernel.org X-Gm-Message-State: AOJu0YyMB0qfAZGKpdc+zW8wO91LJL5CsU/hYD1eGtwgiXRz/3G4/Hma +W2T07OH2V3NNPinrvvIoM6bxrXSElvI4glWQPUUDW/q2yde+xrrYViz X-Gm-Gg: ASbGnct+pR5sz78cEMbi5Jb7PbZpfgfeWOblWrd8oKYXFNohmrs0jHqpb1BIVP558AV LKButX0vdr6BiEfX3i7VQ0Q6Cp05VVtvpKTIwCtb20g45rjw8t5BCzelsqOMwBgc8pi6RrJ40rh LXtD9RuXiK83M41vrDaoVHT0zrdZJkzfkxMf2eOSLUeFQjdPPuF0v+V7jVB1bH4lQYy9OwVWKR7 UQVoEbzeMx8OAjXz6r0jTMTty/ZxSfiPsBygzlAONfOpwgU0pwWsz5YN4BY6WercAcejD1ScjBB mRBrj/8fYIDugeoi0+BE43/PJ3GSYaMpPY3SYF3UP/1vMEAMTBW8e9d88OI8XJaVcTqqhFRdLyp TTcDX0rmJ+F5HK2vSPRRGhu38x3JuqJ+jXtAW53Wj2R4J+sQhY6uE+K2CY2E0db8cL2N4pusEOV V8iNa8b76gRkpx/RkzqQ== X-Google-Smtp-Source: AGHT+IHPF8qvl92qn4O9HhTI1Ru2B9M2uJdkrL9b57C7ScKd/dNGobpzHj6JIHuzPjJ880jsHGaSFQ== X-Received: by 2002:aa7:c551:0:b0:634:544b:a756 with SMTP id 4fb4d7f45d1cf-63c1f6dfbe8mr243723a12.32.1760629595073; Thu, 16 Oct 2025 08:46:35 -0700 (PDT) Received: from NB-6746.corp.yadro.com ([188.243.183.84]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-63c12279a54sm1237989a12.11.2025.10.16.08.46.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Oct 2025 08:46:34 -0700 (PDT) From: Artem Shimko To: Eugeniy Paltsev , Vinod Koul , Philipp Zabel Cc: Artem Shimko , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 2/2] dmaengine: dw-axi-dmac: add reset control support Date: Thu, 16 Oct 2025 18:46:26 +0300 Message-ID: <20251016154627.175796-3-a.shimko.dev@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251016154627.175796-1-a.shimko.dev@gmail.com> References: <20251016154627.175796-1-a.shimko.dev@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add proper reset control handling to the AXI DMA driver to ensure reliable initialization and power management. The driver now manages resets during probe, remove, and system suspend/resume operations. The implementation stores reset control in the chip structure and adds reset assert/deassert calls at the appropriate points: resets are deasserted during probe after clock acquisition, asserted during remove and error cleanup, and properly managed during suspend/resume cycles. Additionally, proper error handling is implemented for reset control operations to ensure robust behavior. This ensures the controller is properly reset during power transitions and prevents potential issues with incomplete initialization. Signed-off-by: Artem Shimko --- .../dma/dw-axi-dmac/dw-axi-dmac-platform.c | 42 ++++++++++++------- drivers/dma/dw-axi-dmac/dw-axi-dmac.h | 1 + 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c b/drivers/dma/d= w-axi-dmac/dw-axi-dmac-platform.c index 8b7cf3baf5d3..ac23e1a5e218 100644 --- a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c +++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c @@ -1321,6 +1321,8 @@ static int axi_dma_suspend(struct device *dev) axi_dma_irq_disable(chip); axi_dma_disable(chip); =20 + reset_control_assert(chip->resets); + clk_disable_unprepare(chip->core_clk); clk_disable_unprepare(chip->cfgr_clk); =20 @@ -1340,6 +1342,8 @@ static int axi_dma_resume(struct device *dev) if (ret < 0) return ret; =20 + reset_control_deassert(chip->resets); + axi_dma_enable(chip); axi_dma_irq_enable(chip); =20 @@ -1455,7 +1459,6 @@ static int dw_probe(struct platform_device *pdev) struct axi_dma_chip *chip; struct dw_axi_dma *dw; struct dw_axi_dma_hcfg *hdata; - struct reset_control *resets; unsigned int flags; u32 i; int ret; @@ -1487,16 +1490,6 @@ static int dw_probe(struct platform_device *pdev) return PTR_ERR(chip->apb_regs); } =20 - if (flags & AXI_DMA_FLAG_HAS_RESETS) { - resets =3D devm_reset_control_array_get_exclusive(&pdev->dev); - if (IS_ERR(resets)) - return PTR_ERR(resets); - - ret =3D reset_control_deassert(resets); - if (ret) - return ret; - } - chip->dw->hdata->use_cfg2 =3D !!(flags & AXI_DMA_FLAG_USE_CFG2); =20 chip->core_clk =3D devm_clk_get(chip->dev, "core-clk"); @@ -1507,18 +1500,28 @@ static int dw_probe(struct platform_device *pdev) if (IS_ERR(chip->cfgr_clk)) return PTR_ERR(chip->cfgr_clk); =20 + chip->resets =3D devm_reset_control_array_get_optional_exclusive(&pdev->d= ev); + if (IS_ERR(chip->resets)) + return PTR_ERR(chip->resets); + + ret =3D reset_control_deassert(chip->resets); + if (ret) + return dev_err_probe(&pdev->dev, ret, "Failed to deassert resets\n"); + ret =3D parse_device_properties(chip); if (ret) - return ret; + goto err_exit; =20 dw->chan =3D devm_kcalloc(chip->dev, hdata->nr_channels, sizeof(*dw->chan), GFP_KERNEL); - if (!dw->chan) - return -ENOMEM; + if (!dw->chan) { + ret =3D -ENOMEM; + goto err_exit; + } =20 ret =3D axi_req_irqs(pdev, chip); if (ret) - return ret; + goto err_exit; =20 INIT_LIST_HEAD(&dw->dma.channels); for (i =3D 0; i < hdata->nr_channels; i++) { @@ -1605,6 +1608,8 @@ static int dw_probe(struct platform_device *pdev) =20 err_pm_disable: pm_runtime_disable(chip->dev); +err_exit: + reset_control_assert(chip->resets); =20 return ret; } @@ -1616,9 +1621,14 @@ static void dw_remove(struct platform_device *pdev) struct axi_dma_chan *chan, *_chan; u32 i; =20 - /* Enable clk before accessing to registers */ + /* + * The peripheral must be clocked and out of reset + * before its registers can be accessed. + */ clk_prepare_enable(chip->cfgr_clk); clk_prepare_enable(chip->core_clk); + reset_control_deassert(chip->resets); + axi_dma_irq_disable(chip); for (i =3D 0; i < dw->hdata->nr_channels; i++) { axi_chan_disable(&chip->dw->chan[i]); diff --git a/drivers/dma/dw-axi-dmac/dw-axi-dmac.h b/drivers/dma/dw-axi-dma= c/dw-axi-dmac.h index b842e6a8d90d..c74affb9f344 100644 --- a/drivers/dma/dw-axi-dmac/dw-axi-dmac.h +++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac.h @@ -71,6 +71,7 @@ struct axi_dma_chip { struct clk *core_clk; struct clk *cfgr_clk; struct dw_axi_dma *dw; + struct reset_control *resets; }; =20 /* LLI =3D=3D Linked List Item */ --=20 2.43.0