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(+)
@@ -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
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(+)
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(+)
@@ -803,6 +804,7 @@ static int microchip_sgpio_probe(struct platform_device *pdev)intdiv_clock=0,ret,port,i,nbanks;structdevice*dev=&pdev->dev;structfwnode_handle*fwnode;+structreset_control*reset;structsgpio_priv*priv;structclk*clk;u32val;
@@ -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))returndev_err_probe(dev,PTR_ERR(clk),"Failed to get clock\n");
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(+)
@@ -803,6 +804,7 @@ static int microchip_sgpio_probe(struct platform_device *pdev)intdiv_clock=0,ret,port,i,nbanks;structdevice*dev=&pdev->dev;structfwnode_handle*fwnode;+structreset_control*reset;structsgpio_priv*priv;structclk*clk;u32val;
@@ -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
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);
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