]> xenbits.xensource.com Git - people/aperard/linux.git/commitdiff
media: sun8i-di: Fix power on/off sequences
authorJernej Skrabec <jernej.skrabec@gmail.com>
Sat, 16 Dec 2023 13:34:21 +0000 (14:34 +0100)
committerSasha Levin <sashal@kernel.org>
Tue, 26 Mar 2024 22:20:49 +0000 (18:20 -0400)
[ Upstream commit cff104e33bad38f4b2c8d58816a7accfaa2879f9 ]

According to user manual, reset line should be deasserted before clocks
are enabled. Also fix power down sequence to be reverse of that.

Fixes: a4260ea49547 ("media: sun4i: Add H3 deinterlace driver")
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/media/platform/sunxi/sun8i-di/sun8i-di.c

index 3e58de58cd89dda9ee50dbddf61bc6473956579d..01b44dd708bd3b6b710b0ef082768c44961e0f86 100644 (file)
@@ -931,11 +931,18 @@ static int deinterlace_runtime_resume(struct device *device)
                return ret;
        }
 
+       ret = reset_control_deassert(dev->rstc);
+       if (ret) {
+               dev_err(dev->dev, "Failed to apply reset\n");
+
+               goto err_exclusive_rate;
+       }
+
        ret = clk_prepare_enable(dev->bus_clk);
        if (ret) {
                dev_err(dev->dev, "Failed to enable bus clock\n");
 
-               goto err_exclusive_rate;
+               goto err_rst;
        }
 
        ret = clk_prepare_enable(dev->mod_clk);
@@ -952,23 +959,16 @@ static int deinterlace_runtime_resume(struct device *device)
                goto err_mod_clk;
        }
 
-       ret = reset_control_deassert(dev->rstc);
-       if (ret) {
-               dev_err(dev->dev, "Failed to apply reset\n");
-
-               goto err_ram_clk;
-       }
-
        deinterlace_init(dev);
 
        return 0;
 
-err_ram_clk:
-       clk_disable_unprepare(dev->ram_clk);
 err_mod_clk:
        clk_disable_unprepare(dev->mod_clk);
 err_bus_clk:
        clk_disable_unprepare(dev->bus_clk);
+err_rst:
+       reset_control_assert(dev->rstc);
 err_exclusive_rate:
        clk_rate_exclusive_put(dev->mod_clk);
 
@@ -979,11 +979,12 @@ static int deinterlace_runtime_suspend(struct device *device)
 {
        struct deinterlace_dev *dev = dev_get_drvdata(device);
 
-       reset_control_assert(dev->rstc);
-
        clk_disable_unprepare(dev->ram_clk);
        clk_disable_unprepare(dev->mod_clk);
        clk_disable_unprepare(dev->bus_clk);
+
+       reset_control_assert(dev->rstc);
+
        clk_rate_exclusive_put(dev->mod_clk);
 
        return 0;