On Tue, Nov 23, 2021 at 12:09:03PM +0100, Andrzej Pietrasiewicz wrote: > > diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c > > index ab2467998d29..8c3de31f51b3 100644 > > --- a/drivers/staging/media/hantro/hantro_drv.c > > +++ b/drivers/staging/media/hantro/hantro_drv.c > > @@ -905,6 +905,10 @@ static int hantro_probe(struct platform_device *pdev) > > return PTR_ERR(vpu->clocks[0].clk); > > } > > + vpu->resets = devm_reset_control_array_get(&pdev->dev, false, true); > > + if (IS_ERR(vpu->resets)) > > + return PTR_ERR(vpu->resets); > > + > > num_bases = vpu->variant->num_regs ?: 1; > > vpu->reg_bases = devm_kcalloc(&pdev->dev, num_bases, > > sizeof(*vpu->reg_bases), GFP_KERNEL); > > @@ -978,10 +982,16 @@ static int hantro_probe(struct platform_device *pdev) > > pm_runtime_use_autosuspend(vpu->dev); > > pm_runtime_enable(vpu->dev); ^^^^^^^^^^^^^^^^^^^^^^^^^^^ It looks like this is the pm stuff that we have to unwind on error > > + ret = reset_control_deassert(vpu->resets); > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to deassert resets\n"); > > + return ret; ^^^^^^^^^^ So this return should be a goto undo_pm_stuff > > + } > > + > > ret = clk_bulk_prepare(vpu->variant->num_clocks, vpu->clocks); > > if (ret) { > > dev_err(&pdev->dev, "Failed to prepare clocks\n"); > > - return ret; And this return should also have been a goto so it's a bug in the original code. > > + goto err_rst_assert; > > Before your patch is applied if clk_bulk_prepare() fails, we > simply return on the spot. After the patch is applied not only > do you... > > > } > > ret = v4l2_device_register(&pdev->dev, &vpu->v4l2_dev); > > @@ -1037,6 +1047,8 @@ static int hantro_probe(struct platform_device *pdev) > > v4l2_device_unregister(&vpu->v4l2_dev); > > err_clk_unprepare: > > clk_bulk_unprepare(vpu->variant->num_clocks, vpu->clocks); > > +err_rst_assert: > > + reset_control_assert(vpu->resets); > > ...revert the effect of reset_control_deassert(), you also... > > > pm_runtime_dont_use_autosuspend(vpu->dev); > > pm_runtime_disable(vpu->dev); > > ... do pm_*() stuff. Is there any reason why this is needed? So, yes, it's needed, but you're correct to spot that it's not consistent. regards, dan carpenter