Thread (19 messages) 19 messages, 4 authors, 2021-11-25

Re: Re: [PATCH 1/7] media: hantro: add support for reset lines

From: Jernej Škrabec <jernej.skrabec@gmail.com>
Date: 2021-11-23 16:46:38
Also in: linux-arm-kernel, linux-media, linux-staging, linux-sunxi, lkml

Hi all,

Dne torek, 23. november 2021 ob 17:36:57 CET je Andrzej Pietrasiewicz 
napisal(a):
Hi Dan, hi Jernej,

W dniu 23.11.2021 o 15:59, Dan Carpenter pisze:
quoted
On Tue, Nov 23, 2021 at 12:09:03PM +0100, Andrzej Pietrasiewicz wrote:
quoted
quoted
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/
media/hantro/hantro_drv.c
quoted
quoted
quoted
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)
quoted
quoted
quoted
   			return PTR_ERR(vpu->clocks[0].clk);
   	}
+	vpu->resets = devm_reset_control_array_get(&pdev->dev, false, 
true);
quoted
quoted
quoted
+	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);
quoted
quoted
quoted
@@ -978,10 +982,16 @@ static int hantro_probe(struct platform_device 
*pdev)
quoted
quoted
quoted
   	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
quoted
quoted
+	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

quoted
quoted
+	}
+
   	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.
So we probably want a separate patch addressing that first, and then
the series proper on top of that.
I was just about to suggest that.

Other drivers usually enable PM last, so they don't have PM calls in unwind 
code. However, I think current approach is just as valid (with a fix).

Best regards,
Jernej
Regards,

Andrzej
quoted
quoted
quoted
+		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...
quoted
   	}
   	ret = v4l2_device_register(&pdev->dev, &vpu->v4l2_dev);
@@ -1037,6 +1047,8 @@ static int hantro_probe(struct platform_device 
*pdev)
quoted
quoted
quoted
   	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...
quoted
   	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
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help