dmaengine Archive on lore.kernel.org
 help / color / Atom feed
* [PATCHv2 1/2] dt-bindings: pl330: document the optional resets property
@ 2019-06-11 15:34 Dinh Nguyen
  2019-06-11 15:34 ` [PATCHv2 2/2] dmagengine: pl330: add code to get reset property Dinh Nguyen
  2019-06-14  5:56 ` [PATCHv2 1/2] dt-bindings: pl330: document the optional resets property Vinod Koul
  0 siblings, 2 replies; 3+ messages in thread
From: Dinh Nguyen @ 2019-06-11 15:34 UTC (permalink / raw)
  To: dmaengine; +Cc: dinguyen, robh+dt, mark.rutland, vkoul, geert, devicetree

Add the optional resets property the pl330 dma node.

Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
---
v2: no change
---
 Documentation/devicetree/bindings/dma/arm-pl330.txt | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Documentation/devicetree/bindings/dma/arm-pl330.txt b/Documentation/devicetree/bindings/dma/arm-pl330.txt
index db7e2260f9c5..2c7fd1941abb 100644
--- a/Documentation/devicetree/bindings/dma/arm-pl330.txt
+++ b/Documentation/devicetree/bindings/dma/arm-pl330.txt
@@ -16,6 +16,9 @@ Optional properties:
   - dma-channels: contains the total number of DMA channels supported by the DMAC
   - dma-requests: contains the total number of DMA requests supported by the DMAC
   - arm,pl330-broken-no-flushp: quirk for avoiding to execute DMAFLUSHP
+  - resets: contains an entry for each entry in reset-names.
+	    See ../reset/reset.txt for details.
+  - reset-names: must contain at least "dma", and optional is "dma-ocp".
 
 Example:
 
-- 
2.20.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCHv2 2/2] dmagengine: pl330: add code to get reset property
  2019-06-11 15:34 [PATCHv2 1/2] dt-bindings: pl330: document the optional resets property Dinh Nguyen
@ 2019-06-11 15:34 ` Dinh Nguyen
  2019-06-14  5:56 ` [PATCHv2 1/2] dt-bindings: pl330: document the optional resets property Vinod Koul
  1 sibling, 0 replies; 3+ messages in thread
From: Dinh Nguyen @ 2019-06-11 15:34 UTC (permalink / raw)
  To: dmaengine; +Cc: dinguyen, robh+dt, mark.rutland, vkoul, geert, devicetree

The DMA controller on some SoCs can be held in reset, and thus requires
the reset signal(s) to deasserted. Most SoCs will have just one reset
signal, but there are others, i.e. Arria10/Stratix10 will have an
additional reset signal, referred to as the OCP.

Add code to get the reset property from the device tree for deassert and
assert.

Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
---
v2: Update error handling and messages when pointers to the reset controller is
    not found.
---
 drivers/dma/pl330.c | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
index 6e6837214210..5208c6a80a39 100644
--- a/drivers/dma/pl330.c
+++ b/drivers/dma/pl330.c
@@ -29,6 +29,7 @@
 #include <linux/err.h>
 #include <linux/pm_runtime.h>
 #include <linux/bug.h>
+#include <linux/reset.h>
 
 #include "dmaengine.h"
 #define PL330_MAX_CHAN		8
@@ -500,6 +501,9 @@ struct pl330_dmac {
 	unsigned int num_peripherals;
 	struct dma_pl330_chan *peripherals; /* keep at end */
 	int quirks;
+
+	struct reset_control	*rstc;
+	struct reset_control	*rstc_ocp;
 };
 
 static struct pl330_of_quirks {
@@ -3028,6 +3032,32 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
 
 	amba_set_drvdata(adev, pl330);
 
+	pl330->rstc = devm_reset_control_get_optional(&adev->dev, "dma");
+	if (IS_ERR(pl330->rstc)) {
+		if (PTR_ERR(pl330->rstc) != -EPROBE_DEFER)
+			dev_err(&adev->dev, "Failed to get reset!\n");
+		return PTR_ERR(pl330->rstc);
+	} else {
+		ret = reset_control_deassert(pl330->rstc);
+		if (ret) {
+			dev_err(&adev->dev, "Couldn't deassert the device from reset!\n");
+			return ret;
+		}
+	}
+
+	pl330->rstc_ocp = devm_reset_control_get_optional(&adev->dev, "dma-ocp");
+	if (IS_ERR(pl330->rstc_ocp)) {
+		if (PTR_ERR(pl330->rstc_ocp) != -EPROBE_DEFER)
+			dev_err(&adev->dev, "Failed to get OCP reset!\n");
+		return PTR_ERR(pl330->rstc_ocp);
+	} else {
+		ret = reset_control_deassert(pl330->rstc_ocp);
+		if (ret) {
+			dev_err(&adev->dev, "Couldn't deassert the device from OCP reset!\n");
+			return ret;
+		}
+	}
+
 	for (i = 0; i < AMBA_NR_IRQS; i++) {
 		irq = adev->irq[i];
 		if (irq) {
@@ -3168,6 +3198,11 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
 probe_err2:
 	pl330_del(pl330);
 
+	if (pl330->rstc_ocp)
+		reset_control_assert(pl330->rstc_ocp);
+
+	if (pl330->rstc)
+		reset_control_assert(pl330->rstc);
 	return ret;
 }
 
@@ -3206,6 +3241,11 @@ static int pl330_remove(struct amba_device *adev)
 
 	pl330_del(pl330);
 
+	if (pl330->rstc_ocp)
+		reset_control_assert(pl330->rstc_ocp);
+
+	if (pl330->rstc)
+		reset_control_assert(pl330->rstc);
 	return 0;
 }
 
-- 
2.20.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCHv2 1/2] dt-bindings: pl330: document the optional resets property
  2019-06-11 15:34 [PATCHv2 1/2] dt-bindings: pl330: document the optional resets property Dinh Nguyen
  2019-06-11 15:34 ` [PATCHv2 2/2] dmagengine: pl330: add code to get reset property Dinh Nguyen
@ 2019-06-14  5:56 ` Vinod Koul
  1 sibling, 0 replies; 3+ messages in thread
From: Vinod Koul @ 2019-06-14  5:56 UTC (permalink / raw)
  To: Dinh Nguyen; +Cc: dmaengine, robh+dt, mark.rutland, geert, devicetree

On 11-06-19, 10:34, Dinh Nguyen wrote:
> Add the optional resets property the pl330 dma node.

Applied both, thanks
-- 
~Vinod

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, back to index

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-11 15:34 [PATCHv2 1/2] dt-bindings: pl330: document the optional resets property Dinh Nguyen
2019-06-11 15:34 ` [PATCHv2 2/2] dmagengine: pl330: add code to get reset property Dinh Nguyen
2019-06-14  5:56 ` [PATCHv2 1/2] dt-bindings: pl330: document the optional resets property Vinod Koul

dmaengine Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/dmaengine/0 dmaengine/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dmaengine dmaengine/ https://lore.kernel.org/dmaengine \
		dmaengine@vger.kernel.org dmaengine@archiver.kernel.org
	public-inbox-index dmaengine


Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.dmaengine


AGPL code for this site: git clone https://public-inbox.org/ public-inbox