Commit b081f13c authored by Biju Das's avatar Biju Das Committed by Philipp Zabel

reset: rzg2l-usbphy-ctrl: Move reset controller registration

As soon as the reset controller is registered, it could be used by a
reset consumer. That means hardware setup to be done first and then the
registration of the reset controller. So move the registration of reset
controller at the end of probe().

While at it, fix the issue that the reset is not re-asserted in case
devm_reset_controller_register() fails and also use goto statements to
simplify the error path in probe().
Signed-off-by: default avatarBiju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/r/20240610164845.89666-1-biju.das.jz@bp.renesas.comSigned-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
parent 1613e604
...@@ -125,25 +125,14 @@ static int rzg2l_usbphy_ctrl_probe(struct platform_device *pdev) ...@@ -125,25 +125,14 @@ static int rzg2l_usbphy_ctrl_probe(struct platform_device *pdev)
if (error) if (error)
return error; return error;
priv->rcdev.ops = &rzg2l_usbphy_ctrl_reset_ops;
priv->rcdev.of_reset_n_cells = 1;
priv->rcdev.nr_resets = NUM_PORTS;
priv->rcdev.of_node = dev->of_node;
priv->rcdev.dev = dev;
error = devm_reset_controller_register(dev, &priv->rcdev);
if (error)
return error;
spin_lock_init(&priv->lock); spin_lock_init(&priv->lock);
dev_set_drvdata(dev, priv); dev_set_drvdata(dev, priv);
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
error = pm_runtime_resume_and_get(&pdev->dev); error = pm_runtime_resume_and_get(&pdev->dev);
if (error < 0) { if (error < 0) {
pm_runtime_disable(&pdev->dev); dev_err_probe(&pdev->dev, error, "pm_runtime_resume_and_get failed");
reset_control_assert(priv->rstc); goto err_pm_disable_reset_deassert;
return dev_err_probe(&pdev->dev, error, "pm_runtime_resume_and_get failed");
} }
/* put pll and phy into reset state */ /* put pll and phy into reset state */
...@@ -153,7 +142,24 @@ static int rzg2l_usbphy_ctrl_probe(struct platform_device *pdev) ...@@ -153,7 +142,24 @@ static int rzg2l_usbphy_ctrl_probe(struct platform_device *pdev)
writel(val, priv->base + RESET); writel(val, priv->base + RESET);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
priv->rcdev.ops = &rzg2l_usbphy_ctrl_reset_ops;
priv->rcdev.of_reset_n_cells = 1;
priv->rcdev.nr_resets = NUM_PORTS;
priv->rcdev.of_node = dev->of_node;
priv->rcdev.dev = dev;
error = devm_reset_controller_register(dev, &priv->rcdev);
if (error)
goto err_pm_runtime_put;
return 0; return 0;
err_pm_runtime_put:
pm_runtime_put(&pdev->dev);
err_pm_disable_reset_deassert:
pm_runtime_disable(&pdev->dev);
reset_control_assert(priv->rstc);
return error;
} }
static int rzg2l_usbphy_ctrl_remove(struct platform_device *pdev) static int rzg2l_usbphy_ctrl_remove(struct platform_device *pdev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment