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 |
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
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/
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 --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");
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(+)