Message ID | 20201012205957.889185-5-adrian.ratiu@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add Hantro regmap and VC8000 h264 decode support | expand |
Hi Adrian, On Mon, 2020-10-12 at 23:59 +0300, Adrian Ratiu wrote: > Some SoCs might have a reset controller which disables clocks > by default in reset state which then drivers need to unreset > before being able to ungate a specific clock. > > In this specific case, the hantro driver needs to ensure the > peripheral clock can be properly ungated otherwise MMIO reg > values can't be accessed. > > If the SoC has no reset controller or there is no "resets" DT > property defined, this new code will have no effect. > > Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com> > Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> > --- > drivers/staging/media/hantro/hantro.h | 1 + > drivers/staging/media/hantro/hantro_drv.c | 8 ++++++++ > 2 files changed, 9 insertions(+) > > diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h > index 65f9f7ea7dcf..bb442eb1974e 100644 > --- a/drivers/staging/media/hantro/hantro.h > +++ b/drivers/staging/media/hantro/hantro.h > @@ -183,6 +183,7 @@ struct hantro_dev { > struct platform_device *pdev; > struct device *dev; > struct clk_bulk_data *clocks; > + struct reset_control *reset; > void __iomem **reg_bases; > void __iomem *enc_base; > void __iomem *dec_base; > diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c > index 3cd00cc0a364..c2ea54552ce9 100644 > --- a/drivers/staging/media/hantro/hantro_drv.c > +++ b/drivers/staging/media/hantro/hantro_drv.c > @@ -17,6 +17,7 @@ > #include <linux/pm.h> > #include <linux/pm_runtime.h> > #include <linux/slab.h> > +#include <linux/reset.h> > #include <linux/videodev2.h> > #include <linux/workqueue.h> > #include <media/v4l2-event.h> > @@ -747,6 +748,13 @@ static int hantro_probe(struct platform_device *pdev) > > INIT_DELAYED_WORK(&vpu->watchdog_work, hantro_watchdog); > > + vpu->reset = devm_reset_control_get_optional_exclusive(&pdev->dev, > + NULL); > + if (IS_ERR(vpu->reset)) > + vpu->reset = NULL; Please return the error. If the optional reset is missing from the device tree, devm_reset_control_get_optional_exclusive() returns NULL already. regards Philipp
diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h index 65f9f7ea7dcf..bb442eb1974e 100644 --- a/drivers/staging/media/hantro/hantro.h +++ b/drivers/staging/media/hantro/hantro.h @@ -183,6 +183,7 @@ struct hantro_dev { struct platform_device *pdev; struct device *dev; struct clk_bulk_data *clocks; + struct reset_control *reset; void __iomem **reg_bases; void __iomem *enc_base; void __iomem *dec_base; diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c index 3cd00cc0a364..c2ea54552ce9 100644 --- a/drivers/staging/media/hantro/hantro_drv.c +++ b/drivers/staging/media/hantro/hantro_drv.c @@ -17,6 +17,7 @@ #include <linux/pm.h> #include <linux/pm_runtime.h> #include <linux/slab.h> +#include <linux/reset.h> #include <linux/videodev2.h> #include <linux/workqueue.h> #include <media/v4l2-event.h> @@ -747,6 +748,13 @@ static int hantro_probe(struct platform_device *pdev) INIT_DELAYED_WORK(&vpu->watchdog_work, hantro_watchdog); + vpu->reset = devm_reset_control_get_optional_exclusive(&pdev->dev, + NULL); + if (IS_ERR(vpu->reset)) + vpu->reset = NULL; + + reset_control_reset(vpu->reset); + vpu->clocks = devm_kcalloc(&pdev->dev, vpu->variant->num_clocks, sizeof(*vpu->clocks), GFP_KERNEL); if (!vpu->clocks)