Message ID | 20220504190609.94375-3-biju.das.jz@bp.renesas.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add support for RZ/G2L VSPD | expand |
Hi Biju, On Wed, May 4, 2022 at 9:06 PM Biju Das <biju.das.jz@bp.renesas.com> wrote: > As the resets DT property is mandatory, and is present in all .dtsi > in mainline, add support to perform deassert/assert using reference > counted reset handle. > > Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> > Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> > Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> > Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > v9->v10: > * Moved {deassert,assert} calls to vsp1_pm_runtime_{resume,suspend} Thanks for the update! > --- a/drivers/media/platform/renesas/vsp1/vsp1_drv.c > +++ b/drivers/media/platform/renesas/vsp1/vsp1_drv.c > @@ -631,13 +633,21 @@ static int __maybe_unused vsp1_pm_runtime_resume(struct device *dev) > struct vsp1_device *vsp1 = dev_get_drvdata(dev); > int ret; > > + ret = reset_control_deassert(vsp1->rstc); > + if (ret < 0) > + return ret; > + > if (vsp1->info) { > ret = vsp1_device_init(vsp1); > if (ret < 0) Missing reset_control_assert(). > return ret; > } > > - return rcar_fcp_enable(vsp1->fcp); > + ret = rcar_fcp_enable(vsp1->fcp); > + if (ret < 0) > + reset_control_assert(vsp1->rstc); > + > + return ret; > } > > static const struct dev_pm_ops vsp1_pm_ops = { Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
Hi Geert, Thanks for the feedback. > Subject: Re: [PATCH v10 2/5] media: renesas: vsp1: Add support to > deassert/assert reset line > > Hi Biju, > > On Wed, May 4, 2022 at 9:06 PM Biju Das <biju.das.jz@bp.renesas.com> wrote: > > As the resets DT property is mandatory, and is present in all .dtsi in > > mainline, add support to perform deassert/assert using reference > > counted reset handle. > > > > Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> > > Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> > > Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> > > Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > --- > > v9->v10: > > * Moved {deassert,assert} calls to vsp1_pm_runtime_{resume,suspend} > > Thanks for the update! > > > --- a/drivers/media/platform/renesas/vsp1/vsp1_drv.c > > +++ b/drivers/media/platform/renesas/vsp1/vsp1_drv.c > > @@ -631,13 +633,21 @@ static int __maybe_unused > vsp1_pm_runtime_resume(struct device *dev) > > struct vsp1_device *vsp1 = dev_get_drvdata(dev); > > int ret; > > > > + ret = reset_control_deassert(vsp1->rstc); > > + if (ret < 0) > > + return ret; > > + > > if (vsp1->info) { > > ret = vsp1_device_init(vsp1); > > if (ret < 0) > > Missing reset_control_assert(). OK, will fix this, by adding goto statement, which can be used for below error handling as well. Cheers, Biju > > > return ret; > > } > > > > - return rcar_fcp_enable(vsp1->fcp); > > + ret = rcar_fcp_enable(vsp1->fcp); > > + if (ret < 0) > > + reset_control_assert(vsp1->rstc); > > + > > + return ret; > > } > > > > static const struct dev_pm_ops vsp1_pm_ops = { > > Gr{oetje,eeting}s, > > Geert > > -- > Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux- > m68k.org > > In personal conversations with technical people, I call myself a hacker. > But when I'm talking to journalists I just say "programmer" or something > like that. > -- Linus Torvalds
diff --git a/drivers/media/platform/renesas/vsp1/vsp1.h b/drivers/media/platform/renesas/vsp1/vsp1.h index 37cf33c7e6ca..baf898d577ec 100644 --- a/drivers/media/platform/renesas/vsp1/vsp1.h +++ b/drivers/media/platform/renesas/vsp1/vsp1.h @@ -22,6 +22,7 @@ struct clk; struct device; struct rcar_fcp_device; +struct reset_control; struct vsp1_drm; struct vsp1_entity; @@ -79,6 +80,7 @@ struct vsp1_device { void __iomem *mmio; struct rcar_fcp_device *fcp; struct device *bus_master; + struct reset_control *rstc; struct vsp1_brx *brs; struct vsp1_brx *bru; diff --git a/drivers/media/platform/renesas/vsp1/vsp1_drv.c b/drivers/media/platform/renesas/vsp1/vsp1_drv.c index 1f73c48eb738..2a18cd6ec538 100644 --- a/drivers/media/platform/renesas/vsp1/vsp1_drv.c +++ b/drivers/media/platform/renesas/vsp1/vsp1_drv.c @@ -16,6 +16,7 @@ #include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> +#include <linux/reset.h> #include <linux/videodev2.h> #include <media/rcar-fcp.h> @@ -622,6 +623,7 @@ static int __maybe_unused vsp1_pm_runtime_suspend(struct device *dev) struct vsp1_device *vsp1 = dev_get_drvdata(dev); rcar_fcp_disable(vsp1->fcp); + reset_control_assert(vsp1->rstc); return 0; } @@ -631,13 +633,21 @@ static int __maybe_unused vsp1_pm_runtime_resume(struct device *dev) struct vsp1_device *vsp1 = dev_get_drvdata(dev); int ret; + ret = reset_control_deassert(vsp1->rstc); + if (ret < 0) + return ret; + if (vsp1->info) { ret = vsp1_device_init(vsp1); if (ret < 0) return ret; } - return rcar_fcp_enable(vsp1->fcp); + ret = rcar_fcp_enable(vsp1->fcp); + if (ret < 0) + reset_control_assert(vsp1->rstc); + + return ret; } static const struct dev_pm_ops vsp1_pm_ops = { @@ -825,6 +835,11 @@ static int vsp1_probe(struct platform_device *pdev) if (irq < 0) return irq; + vsp1->rstc = devm_reset_control_get_shared(&pdev->dev, NULL); + if (IS_ERR(vsp1->rstc)) + return dev_err_probe(&pdev->dev, PTR_ERR(vsp1->rstc), + "failed to get reset control\n"); + /* FCP (optional). */ fcp_node = of_parse_phandle(pdev->dev.of_node, "renesas,fcp", 0); if (fcp_node) {