2018-04-03 17:46 GMT+09:00 Philipp Zabel <p.zabel@xxxxxxxxxxxxxx>:
On Tue, 2018-04-03 at 17:30 +0900, Masahiro Yamada wrote:If this were really a problem, the driver would have to check
2018-04-03 17:00 GMT+09:00 Philipp Zabel <p.zabel@xxxxxxxxxxxxxx>:Thanks, this is helpful information.
On Thu, 2018-03-29 at 15:07 +0900, Masahiro Yamada wrote:This patch is necessary for Socionext SoCs.
This driver handles the reset control in a common manner; deassertIs this preemptive cleanup, or do you have hardware on the horizon that
resets before use, assert them after use. There is no good reason
why it should be exclusive.
shares these reset lines with other peripherals?
The same reset lines are shared between
this dwc3-of_simple and other glue circuits.
Sorry for the confusion, I have mixed up things here.Also, use devm_ for clean-up.At the time I was concerned with the reset_control_array addition and
Signed-off-by: Masahiro Yamada <yamada.masahiro@xxxxxxxxxxxxx>
---
CCing Philipp Zabel.
I see his sob in commit 06c47e6286d5.
didn't look closely at the exclusive vs shared issue.
drivers/usb/dwc3/dwc3-of-simple.c | 7 ++-----From the usage in the driver, it does indeed look like _shared reset
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c
index e54c362..bd6ab65 100644
--- a/drivers/usb/dwc3/dwc3-of-simple.c
+++ b/drivers/usb/dwc3/dwc3-of-simple.c
@@ -91,7 +91,7 @@ static int dwc3_of_simple_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, simple);
simple->dev = dev;
- simple->resets = of_reset_control_array_get_optional_exclusive(np);
+ simple->resets = devm_reset_control_array_get_optional_shared(dev);
usage is appropriate. I assume that the hardware has no need for the
reset to be asserted right before probe or after remove, it just
requires that the reset line is kept deasserted while the driver is
probed.
if (IS_ERR(simple->resets)) {Changing to devm_ changes the order here. Whether or not it could be a
ret = PTR_ERR(simple->resets);
dev_err(dev, "failed to get device resets, err=%d\n", ret);
@@ -100,7 +100,7 @@ static int dwc3_of_simple_probe(struct platform_device *pdev)
ret = reset_control_deassert(simple->resets);
if (ret)
- goto err_resetc_put;
+ return ret;
ret = dwc3_of_simple_clk_init(simple, of_count_phandle_with_args(np,
"clocks", "#clock-cells"));
@@ -126,8 +126,6 @@ static int dwc3_of_simple_probe(struct platform_device *pdev)
err_resetc_assert:
reset_control_assert(simple->resets);
-err_resetc_put:
- reset_control_put(simple->resets);
return ret;
}
@@ -146,7 +144,6 @@ static int dwc3_of_simple_remove(struct platform_device *pdev)
simple->num_clocks = 0;
reset_control_assert(simple->resets);
- reset_control_put(simple->resets);
pm_runtime_put_sync(dev);
pm_runtime_disable(dev);
problem to assert the reset only after pm_runtime_put (or potentially
never), I can't say. I assume this is a non-issue, but somebody who
knows the hardware better would have to decide.
I do not understand what you mean.
Can you describe your concern in more details?With the change to shared reset control, reset_control_assert
I am not touching reset_control_assert() here.
potentially does nothing, so it could be possible that
pm_runtime_put_sync cuts the power before the reset es asserted again.
I am delaying the call for reset_control_put().Yes, please disregard my comment about the devm_ change, that should
have no effect whatsoever and looks fine to me.
If I understand reset_control_put() correctly,Correct.
the effects of this change are:
- The ref_count and module ownership for the reset controller
driver will be held a little longer
- The call for kfree() will be a little bit delayed.
Why do you need knowledge about this hardware?Is it ok to keep the reset deasserted while the power is cut?
Or do you
have to guarantee that drivers sharing the same reset also keep the same
power domains active?
the error code from reset_control_assert().
ret = reset_control_assert(simple->resets);
if (ret)
return ret; /* if we cannot assert reset, do not allow
driver detach */
pm_runtime_put_sync(dev);
pm_runtime_disable(dev);
return 0;
What I can tell is, the current situation is
blocking hardware with shared reset lines
from using this driver.