[PATCH v3 0/2] pinctrl: pinctrl-microchip-sgpio: Extend to call reset driver

STALE1753d

Revision v3 of 5 in this series.

7 messages, 2 authors, 2021-10-15 · open the first message on its own page

[PATCH v3 0/2] pinctrl: pinctrl-microchip-sgpio: Extend to call reset driver

From: Horatiu Vultur <horatiu.vultur@microchip.com>
Date: 2021-10-14 08:58:42

This allows the driver to call an optional reset driver.

v2->v3:
 - fix warnings reported by 'make dtbs_check'

v1->v2:
 - add dt-bindings changes

Horatiu Vultur (2):
  dt-bindings: pinctrl: pinctrl-microchip-sgpio: Add reset binding
  pinctrl: microchip sgpio: use reset driver

 .../devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml | 6 ++++++
 drivers/pinctrl/pinctrl-microchip-sgpio.c                   | 6 ++++++
 2 files changed, 12 insertions(+)

-- 
2.33.0

[PATCH v3 1/2] dt-bindings: pinctrl: pinctrl-microchip-sgpio: Add reset binding

From: Horatiu Vultur <horatiu.vultur@microchip.com>
Date: 2021-10-14 08:58:51

This describes the new binding for calling the reset driver in the
pinctrl-microchip-sgpio driver.

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
---
 .../devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml | 6 ++++++
 1 file changed, 6 insertions(+)
diff --git a/Documentation/devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml b/Documentation/devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml
index 4fe35e650909..d7b3aa726e1d 100644
--- a/Documentation/devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml
@@ -68,6 +68,12 @@ properties:
       clock, and larger than zero.
     default: 12500000
 
+  resets:
+    maxItems: 1
+
+  reset-names:
+    maxItems: 1
+
 patternProperties:
   "^gpio@[0-1]$":
     type: object
-- 
2.33.0

Re: [PATCH v3 1/2] dt-bindings: pinctrl: pinctrl-microchip-sgpio: Add reset binding

From: Philipp Zabel <p.zabel@pengutronix.de>
Date: 2021-10-14 11:48:38

On Thu, 2021-10-14 at 10:59 +0200, Horatiu Vultur wrote:
quoted hunk
This describes the new binding for calling the reset driver in the
pinctrl-microchip-sgpio driver.

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
---
 .../devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml | 6 ++++++
 1 file changed, 6 insertions(+)
diff --git a/Documentation/devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml b/Documentation/devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml
index 4fe35e650909..d7b3aa726e1d 100644
--- a/Documentation/devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml
@@ -68,6 +68,12 @@ properties:
       clock, and larger than zero.
     default: 12500000
 
+  resets:
+    maxItems: 1
+
+  reset-names:
+    maxItems: 1
I'd expect reset-names to specify the name if it exists.

regards
Philipp

[PATCH v3 2/2] pinctrl: microchip sgpio: use reset driver

From: Horatiu Vultur <horatiu.vultur@microchip.com>
Date: 2021-10-14 08:59:12

On lan966x platform when the switch gets reseted then also the sgpio
gets reseted. The fix for this is to extend also the sgpio driver to
call the reset driver which will be reseted only once by the first
driver that is probed.

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
---
 drivers/pinctrl/pinctrl-microchip-sgpio.c | 6 ++++++
 1 file changed, 6 insertions(+)
diff --git a/drivers/pinctrl/pinctrl-microchip-sgpio.c b/drivers/pinctrl/pinctrl-microchip-sgpio.c
index 072bccdea2a5..e8a91d0824cb 100644
--- a/drivers/pinctrl/pinctrl-microchip-sgpio.c
+++ b/drivers/pinctrl/pinctrl-microchip-sgpio.c
@@ -17,6 +17,7 @@
 #include <linux/pinctrl/pinmux.h>
 #include <linux/platform_device.h>
 #include <linux/property.h>
+#include <linux/reset.h>
 
 #include "core.h"
 #include "pinconf.h"
@@ -803,6 +804,7 @@ static int microchip_sgpio_probe(struct platform_device *pdev)
 	int div_clock = 0, ret, port, i, nbanks;
 	struct device *dev = &pdev->dev;
 	struct fwnode_handle *fwnode;
+	struct reset_control *reset;
 	struct sgpio_priv *priv;
 	struct clk *clk;
 	u32 val;
@@ -813,6 +815,10 @@ static int microchip_sgpio_probe(struct platform_device *pdev)
 
 	priv->dev = dev;
 
+	reset = devm_reset_control_get_shared(&pdev->dev, "switch");
+	if (!IS_ERR(reset))
+		reset_control_reset(reset);
+
 	clk = devm_clk_get(dev, NULL);
 	if (IS_ERR(clk))
 		return dev_err_probe(dev, PTR_ERR(clk), "Failed to get clock\n");
-- 
2.33.0

Re: [PATCH v3 2/2] pinctrl: microchip sgpio: use reset driver

From: Philipp Zabel <p.zabel@pengutronix.de>
Date: 2021-10-14 11:48:05

Hi Horatiu,

On Thu, 2021-10-14 at 10:59 +0200, Horatiu Vultur wrote:
quoted hunk
On lan966x platform when the switch gets reseted then also the sgpio
gets reseted. The fix for this is to extend also the sgpio driver to
call the reset driver which will be reseted only once by the first
driver that is probed.

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
---
 drivers/pinctrl/pinctrl-microchip-sgpio.c | 6 ++++++
 1 file changed, 6 insertions(+)
diff --git a/drivers/pinctrl/pinctrl-microchip-sgpio.c b/drivers/pinctrl/pinctrl-microchip-sgpio.c
index 072bccdea2a5..e8a91d0824cb 100644
--- a/drivers/pinctrl/pinctrl-microchip-sgpio.c
+++ b/drivers/pinctrl/pinctrl-microchip-sgpio.c
@@ -17,6 +17,7 @@
 #include <linux/pinctrl/pinmux.h>
 #include <linux/platform_device.h>
 #include <linux/property.h>
+#include <linux/reset.h>
 
 #include "core.h"
 #include "pinconf.h"
@@ -803,6 +804,7 @@ static int microchip_sgpio_probe(struct platform_device *pdev)
 	int div_clock = 0, ret, port, i, nbanks;
 	struct device *dev = &pdev->dev;
 	struct fwnode_handle *fwnode;
+	struct reset_control *reset;
 	struct sgpio_priv *priv;
 	struct clk *clk;
 	u32 val;
@@ -813,6 +815,10 @@ static int microchip_sgpio_probe(struct platform_device *pdev)
 
 	priv->dev = dev;
 
+	reset = devm_reset_control_get_shared(&pdev->dev, "switch");
Please use devm_reset_control_get_optional_shared() for optional resets
and handle errors. That will return NULL in case the optional reset is
not specified in the device tree.

It seems weird to me that the reset input to the GPIO controller is
called "switch" reset. You can request a single unnamed reset with

	reset = devm_reset_control_get_shared(&pdev->dev, NULL);

although that would limit future extendability in case this driver will
ever require to handle multiple separate resets. If you decide to
request the reset control by name, the yaml binding should specify the
same name.
+	if (!IS_ERR(reset))
+		reset_control_reset(reset);
With optional resets, this can be just:

	reset_control_reset(reset);

regards
Philipp

Re: [PATCH v3 2/2] pinctrl: microchip sgpio: use reset driver

From: Horatiu Vultur <horatiu.vultur@microchip.com>
Date: 2021-10-14 14:36:07

The 10/14/2021 13:47, Philipp Zabel wrote:
Hi Horatiu,
Hi Philipp
quoted
+     reset = devm_reset_control_get_shared(&pdev->dev, "switch");
Please use devm_reset_control_get_optional_shared() for optional resets
and handle errors. That will return NULL in case the optional reset is
not specified in the device tree.
I will do that.
It seems weird to me that the reset input to the GPIO controller is
called "switch" reset. You can request a single unnamed reset with

        reset = devm_reset_control_get_shared(&pdev->dev, NULL);

although that would limit future extendability in case this driver will
ever require to handle multiple separate resets. If you decide to
request the reset control by name, the yaml binding should specify the
same name.
I think this requires a little bit more explanation from my side. On
lan966x we are facing the following issue. When we try to reset just the
switch core then also the sgpio device was reset and there was no way
from HW perspective to prevent this.

So our solutions was to create a reset driver[1] that will be triggered
only one time, by the sgpio driver or by the switch driver. That is the
reason why it was called "switch" reset. And that is the purpose of this
patch to allow the sgpio driver to reset the switch in case is probed
before the switch driver so it would not get reset after that.
quoted
+     if (!IS_ERR(reset))
+             reset_control_reset(reset);
With optional resets, this can be just:

        reset_control_reset(reset);
Great I will do that.
regards
Philipp
[1] https://lore.kernel.org/lkml/20211013073807.2282230-1-horatiu.vultur@microchip.com/

-- 
/Horatiu

Re: [PATCH v3 2/2] pinctrl: microchip sgpio: use reset driver

From: Philipp Zabel <p.zabel@pengutronix.de>
Date: 2021-10-15 13:46:52

On Thu, 2021-10-14 at 16:37 +0200, Horatiu Vultur wrote:
The 10/14/2021 13:47, Philipp Zabel wrote:
quoted
Hi Horatiu,
Hi Philipp
quoted
quoted
+     reset = devm_reset_control_get_shared(&pdev->dev, "switch");
Please use devm_reset_control_get_optional_shared() for optional resets
and handle errors. That will return NULL in case the optional reset is
not specified in the device tree.
I will do that.
quoted
It seems weird to me that the reset input to the GPIO controller is
called "switch" reset. You can request a single unnamed reset with

        reset = devm_reset_control_get_shared(&pdev->dev, NULL);

although that would limit future extendability in case this driver will
ever require to handle multiple separate resets. If you decide to
request the reset control by name, the yaml binding should specify the
same name.
I think this requires a little bit more explanation from my side. On
lan966x we are facing the following issue. When we try to reset just the
switch core then also the sgpio device was reset and there was no way
from HW perspective to prevent this.

So our solutions was to create a reset driver[1] that will be triggered
only one time, by the sgpio driver or by the switch driver. That is the
reason why it was called "switch" reset. And that is the purpose of this
patch to allow the sgpio driver to reset the switch in case is probed
before the switch driver so it would not get reset after that.
Thank you for the explanation, it is perfectly fine to request the
shared reset line with another name, or use no name at all if it is the
only reset input to the sgpio controller.

regards
Philipp
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help