diff mbox series

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

Message ID 20211014085929.2579695-3-horatiu.vultur@microchip.com (mailing list archive)
State New, archived
Headers show
Series pinctrl: pinctrl-microchip-sgpio: Extend to call reset driver | expand

Commit Message

Horatiu Vultur Oct. 14, 2021, 8:59 a.m. UTC
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(+)

Comments

Philipp Zabel Oct. 14, 2021, 11:47 a.m. UTC | #1
Hi Horatiu,

On Thu, 2021-10-14 at 10:59 +0200, Horatiu Vultur wrote:
> 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
Horatiu Vultur Oct. 14, 2021, 2:37 p.m. UTC | #2
The 10/14/2021 13:47, Philipp Zabel wrote:
> 
> Hi Horatiu,

Hi Philipp
> 
> > +     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.

> 
> > +     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/
Philipp Zabel Oct. 15, 2021, 1:46 p.m. UTC | #3
On Thu, 2021-10-14 at 16:37 +0200, Horatiu Vultur wrote:
> The 10/14/2021 13:47, Philipp Zabel wrote:
> > Hi Horatiu,
> 
> Hi Philipp
> > > +     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.

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
diff mbox series

Patch

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");