Hi Tony, On Mon, 2020-10-26 at 13:10 +0200, Tony Lindgren wrote: > In order to move wkup_m3 to probe without platform data, let's add > support for using optional reset control driver if configured in the > dts. With this change and the related dts change, we can start > dropping the platform data for am335x. > > And once wkup_m3 no longer needs platform data, we can simply drop the > related legacy reset platform data callbacks from wkup_m3 driver later > on after also am437x no longer depends on it. > > Cc: linux-remoteproc@xxxxxxxxxxxxxxx > Cc: Bjorn Andersson <bjorn.andersson@xxxxxxxxxx> > Cc: Dave Gerlach <d-gerlach@xxxxxx> > Cc: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> > Cc: Suman Anna <s-anna@xxxxxx> > Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx> > --- > > Please review and ack if no issues. If you guys instead want to set up an > immutable remoteproc branch with just this patch in it against v5.10-rc1 > that works too :) > > --- > drivers/remoteproc/wkup_m3_rproc.c | 28 +++++++++++++++++++++------- > 1 file changed, 21 insertions(+), 7 deletions(-) > > diff --git a/drivers/remoteproc/wkup_m3_rproc.c b/drivers/remoteproc/wkup_m3_rproc.c > --- a/drivers/remoteproc/wkup_m3_rproc.c > +++ b/drivers/remoteproc/wkup_m3_rproc.c > @@ -17,6 +17,7 @@ > #include <linux/platform_device.h> > #include <linux/pm_runtime.h> > #include <linux/remoteproc.h> > +#include <linux/reset.h> > > #include <linux/platform_data/wkup_m3.h> > > @@ -43,11 +44,13 @@ struct wkup_m3_mem { > * @rproc: rproc handle > * @pdev: pointer to platform device > * @mem: WkupM3 memory information > + * @rsts: reset control > */ > struct wkup_m3_rproc { > struct rproc *rproc; > struct platform_device *pdev; > struct wkup_m3_mem mem[WKUPM3_MEM_MAX]; > + struct reset_control *rsts; > }; > > static int wkup_m3_rproc_start(struct rproc *rproc) > @@ -57,6 +60,9 @@ static int wkup_m3_rproc_start(struct rproc *rproc) > struct device *dev = &pdev->dev; > struct wkup_m3_platform_data *pdata = dev_get_platdata(dev); > > + if (wkupm3->rsts) No need for this check, reset_control_deassert() just returns 0 if the rstc parameter is NULL. > + return reset_control_deassert(wkupm3->rsts); > + > if (pdata->deassert_reset(pdev, pdata->reset_name)) { > dev_err(dev, "Unable to reset wkup_m3!\n"); > return -ENODEV; > @@ -72,6 +78,9 @@ static int wkup_m3_rproc_stop(struct rproc *rproc) > struct device *dev = &pdev->dev; > struct wkup_m3_platform_data *pdata = dev_get_platdata(dev); > > + if (wkupm3->rsts) Same as above. > + return reset_control_assert(wkupm3->rsts); > + > if (pdata->assert_reset(pdev, pdata->reset_name)) { > dev_err(dev, "Unable to assert reset of wkup_m3!\n"); > return -ENODEV; > @@ -132,12 +141,6 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev) > int ret; > int i; > > - if (!(pdata && pdata->deassert_reset && pdata->assert_reset && > - pdata->reset_name)) { > - dev_err(dev, "Platform data missing!\n"); > - return -ENODEV; > - } > - > ret = of_property_read_string(dev->of_node, "ti,pm-firmware", > &fw_name); > if (ret) { > @@ -165,6 +168,17 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev) > wkupm3->rproc = rproc; > wkupm3->pdev = pdev; > > + wkupm3->rsts = devm_reset_control_get_optional_shared(dev, "rstctrl"); > + if (PTR_ERR_OR_ZERO(wkupm3->rsts)) { Please properly return errors. rsts will be NULL if the optional rstctrl reset is not specified: if (IS_ERR(wkump3->rsts)) return PTR_ERR(wkump3->rsts); if (!wkump3->rsts) { > + if (!(pdata && pdata->deassert_reset && pdata->assert_reset && > + pdata->reset_name)) { > + dev_err(dev, "Platform data missing!\n"); > + ret = -ENODEV; > + goto err_put_rproc; > + } > + wkupm3->rsts = NULL; I assume this will later be dropped with the platform data support? > + } > + > for (i = 0; i < ARRAY_SIZE(mem_names); i++) { > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, > mem_names[i]); > @@ -173,7 +187,7 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev) > dev_err(&pdev->dev, "devm_ioremap_resource failed for resource %d\n", > i); > ret = PTR_ERR(wkupm3->mem[i].cpu_addr); > - goto err; > + goto err_put_rproc; > } > wkupm3->mem[i].bus_addr = res->start; > wkupm3->mem[i].size = resource_size(res); regards Philipp