media: s5p-mfc: drop static device variable in s5p_mfc_pm.c
authorKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Sun, 24 Dec 2023 15:44:14 +0000 (16:44 +0100)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Mon, 22 Jan 2024 11:16:44 +0000 (12:16 +0100)
Change the interface of power management functions in s5p_mfc_pm.c to
accept the pointer to S5P MFC device structure. instead of relying on
file-scope static variable.  This makes code easier to read and modify
in case more devices are added.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Reviewed-by: Aakarsh Jain <aakarsh.jain@samsung.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_ctrl.c
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v5.c
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_pm.c
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_pm.h

index 910f195ac6862dd380a3791c8710c9fff854957d..50451984d59f752c20143d5aa8affda341d20570 100644 (file)
@@ -183,7 +183,7 @@ static void s5p_mfc_watchdog_worker(struct work_struct *work)
                mfc_err("Error: some instance may be closing/opening\n");
        spin_lock_irqsave(&dev->irqlock, flags);
 
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
 
        for (i = 0; i < MFC_NUM_CONTEXTS; i++) {
                ctx = dev->ctx[i];
@@ -211,9 +211,9 @@ static void s5p_mfc_watchdog_worker(struct work_struct *work)
                        mfc_err("Failed to reload FW\n");
                        goto unlock;
                }
-               s5p_mfc_clock_on();
+               s5p_mfc_clock_on(dev);
                ret = s5p_mfc_init_hw(dev);
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
                if (ret)
                        mfc_err("Failed to reinit FW\n");
        }
@@ -393,7 +393,7 @@ static void s5p_mfc_handle_frame(struct s5p_mfc_ctx *ctx,
                s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev);
                wake_up_ctx(ctx, reason, err);
                WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0);
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
                s5p_mfc_hw_call(dev->mfc_ops, try_run, dev);
                return;
        }
@@ -465,7 +465,7 @@ leave_handle_frame:
        s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev);
        wake_up_ctx(ctx, reason, err);
        WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0);
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
        /* if suspending, wake up device and do not try_run again*/
        if (test_bit(0, &dev->enter_suspend))
                wake_up_dev(dev, reason, err);
@@ -509,7 +509,7 @@ static void s5p_mfc_handle_error(struct s5p_mfc_dev *dev,
        }
        WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0);
        s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev);
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
        wake_up_dev(dev, reason, err);
 }
 
@@ -565,7 +565,7 @@ static void s5p_mfc_handle_seq_done(struct s5p_mfc_ctx *ctx,
        s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev);
        clear_work_bit(ctx);
        WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0);
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
        s5p_mfc_hw_call(dev->mfc_ops, try_run, dev);
        wake_up_ctx(ctx, reason, err);
 }
@@ -601,7 +601,7 @@ static void s5p_mfc_handle_init_buffers(struct s5p_mfc_ctx *ctx,
                }
                WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0);
 
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
 
                wake_up(&ctx->queue);
                if (ctx->src_queue_cnt >= 1 && ctx->dst_queue_cnt >= 1)
@@ -610,7 +610,7 @@ static void s5p_mfc_handle_init_buffers(struct s5p_mfc_ctx *ctx,
        } else {
                WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0);
 
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
 
                wake_up(&ctx->queue);
        }
@@ -638,7 +638,7 @@ static void s5p_mfc_handle_stream_complete(struct s5p_mfc_ctx *ctx)
 
        WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0);
 
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
        wake_up(&ctx->queue);
        s5p_mfc_hw_call(dev->mfc_ops, try_run, dev);
 }
@@ -690,7 +690,7 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv)
                        }
                        s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev);
                        WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0);
-                       s5p_mfc_clock_off();
+                       s5p_mfc_clock_off(dev);
                        wake_up_ctx(ctx, reason, err);
                        s5p_mfc_hw_call(dev->mfc_ops, try_run, dev);
                } else {
@@ -754,7 +754,7 @@ irq_cleanup_hw:
        if (test_and_clear_bit(0, &dev->hw_lock) == 0)
                mfc_err("Failed to unlock hw\n");
 
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
        clear_work_bit(ctx);
        wake_up(&ctx->queue);
 
@@ -841,20 +841,20 @@ static int s5p_mfc_open(struct file *file)
                dev->watchdog_timer.expires = jiffies +
                                        msecs_to_jiffies(MFC_WATCHDOG_INTERVAL);
                add_timer(&dev->watchdog_timer);
-               ret = s5p_mfc_power_on();
+               ret = s5p_mfc_power_on(dev);
                if (ret < 0) {
                        mfc_err("power on failed\n");
                        goto err_pwr_enable;
                }
-               s5p_mfc_clock_on();
+               s5p_mfc_clock_on(dev);
                ret = s5p_mfc_load_firmware(dev);
                if (ret) {
-                       s5p_mfc_clock_off();
+                       s5p_mfc_clock_off(dev);
                        goto err_load_fw;
                }
                /* Init the FW */
                ret = s5p_mfc_init_hw(dev);
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
                if (ret)
                        goto err_init_hw;
        }
@@ -931,7 +931,7 @@ err_init_hw:
 err_load_fw:
 err_pwr_enable:
        if (dev->num_inst == 1) {
-               if (s5p_mfc_power_off() < 0)
+               if (s5p_mfc_power_off(dev) < 0)
                        mfc_err("power off failed\n");
                del_timer_sync(&dev->watchdog_timer);
        }
@@ -963,7 +963,7 @@ static int s5p_mfc_release(struct file *file)
        vb2_queue_release(&ctx->vq_src);
        vb2_queue_release(&ctx->vq_dst);
        if (dev) {
-               s5p_mfc_clock_on();
+               s5p_mfc_clock_on(dev);
 
                /* Mark context as idle */
                clear_work_bit_irqsave(ctx);
@@ -983,12 +983,12 @@ static int s5p_mfc_release(struct file *file)
                        mfc_debug(2, "Last instance\n");
                        s5p_mfc_deinit_hw(dev);
                        del_timer_sync(&dev->watchdog_timer);
-                       s5p_mfc_clock_off();
-                       if (s5p_mfc_power_off() < 0)
+                       s5p_mfc_clock_off(dev);
+                       if (s5p_mfc_power_off(dev) < 0)
                                mfc_err("Power off failed\n");
                } else {
                        mfc_debug(2, "Shutting down clock\n");
-                       s5p_mfc_clock_off();
+                       s5p_mfc_clock_off(dev);
                }
        }
        if (dev)
index 503487f34a800fc0ea6e535be3f99aeb493926f5..625d77b2be0ffe45c6fe81e6761cc992d8f02d91 100644 (file)
@@ -221,7 +221,7 @@ int s5p_mfc_init_hw(struct s5p_mfc_dev *dev)
 
        /* 0. MFC reset */
        mfc_debug(2, "MFC reset..\n");
-       s5p_mfc_clock_on();
+       s5p_mfc_clock_on(dev);
        dev->risc_on = 0;
        ret = s5p_mfc_reset(dev);
        if (ret) {
@@ -249,7 +249,7 @@ int s5p_mfc_init_hw(struct s5p_mfc_dev *dev)
        if (s5p_mfc_wait_for_done_dev(dev, S5P_MFC_R2H_CMD_FW_STATUS_RET)) {
                mfc_err("Failed to load firmware\n");
                s5p_mfc_reset(dev);
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
                return -EIO;
        }
        s5p_mfc_clean_dev_int_flags(dev);
@@ -258,14 +258,14 @@ int s5p_mfc_init_hw(struct s5p_mfc_dev *dev)
        if (ret) {
                mfc_err("Failed to send command to MFC - timeout\n");
                s5p_mfc_reset(dev);
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
                return ret;
        }
        mfc_debug(2, "Ok, now will wait for completion of hardware init\n");
        if (s5p_mfc_wait_for_done_dev(dev, S5P_MFC_R2H_CMD_SYS_INIT_RET)) {
                mfc_err("Failed to init hardware\n");
                s5p_mfc_reset(dev);
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
                return -EIO;
        }
        dev->int_cond = 0;
@@ -275,7 +275,7 @@ int s5p_mfc_init_hw(struct s5p_mfc_dev *dev)
                mfc_err("Failed to init firmware - error: %d int: %d\n",
                                                dev->int_err, dev->int_type);
                s5p_mfc_reset(dev);
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
                return -EIO;
        }
        if (IS_MFCV6_PLUS(dev))
@@ -285,7 +285,7 @@ int s5p_mfc_init_hw(struct s5p_mfc_dev *dev)
 
        mfc_debug(2, "MFC F/W version : %02xyy, %02xmm, %02xdd\n",
                (ver >> 16) & 0xFF, (ver >> 8) & 0xFF, ver & 0xFF);
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
        mfc_debug_leave();
        return 0;
 }
@@ -294,12 +294,12 @@ int s5p_mfc_init_hw(struct s5p_mfc_dev *dev)
 /* Deinitialize hardware */
 void s5p_mfc_deinit_hw(struct s5p_mfc_dev *dev)
 {
-       s5p_mfc_clock_on();
+       s5p_mfc_clock_on(dev);
 
        s5p_mfc_reset(dev);
        s5p_mfc_hw_call(dev->mfc_ops, release_dev_context_buffer, dev);
 
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
 }
 
 int s5p_mfc_sleep(struct s5p_mfc_dev *dev)
@@ -307,7 +307,7 @@ int s5p_mfc_sleep(struct s5p_mfc_dev *dev)
        int ret;
 
        mfc_debug_enter();
-       s5p_mfc_clock_on();
+       s5p_mfc_clock_on(dev);
        s5p_mfc_clean_dev_int_flags(dev);
        ret = s5p_mfc_hw_call(dev->mfc_cmds, sleep_cmd, dev);
        if (ret) {
@@ -318,7 +318,7 @@ int s5p_mfc_sleep(struct s5p_mfc_dev *dev)
                mfc_err("Failed to sleep\n");
                return -EIO;
        }
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
        dev->int_cond = 0;
        if (dev->int_err != 0 || dev->int_type !=
                                                S5P_MFC_R2H_CMD_SLEEP_RET) {
@@ -390,12 +390,12 @@ int s5p_mfc_wakeup(struct s5p_mfc_dev *dev)
        mfc_debug_enter();
        /* 0. MFC reset */
        mfc_debug(2, "MFC reset..\n");
-       s5p_mfc_clock_on();
+       s5p_mfc_clock_on(dev);
        dev->risc_on = 0;
        ret = s5p_mfc_reset(dev);
        if (ret) {
                mfc_err("Failed to reset MFC - timeout\n");
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
                return ret;
        }
        mfc_debug(2, "Done MFC reset..\n");
@@ -410,7 +410,7 @@ int s5p_mfc_wakeup(struct s5p_mfc_dev *dev)
        else
                ret = s5p_mfc_wait_wakeup(dev);
 
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
        if (ret)
                return ret;
 
index 345734a13d26bf847172d72722716b0e61dc5f3f..91e102d4ec4e2ad9f432c662561e565de6cdc39e 100644 (file)
@@ -496,7 +496,7 @@ static int reqbufs_output(struct s5p_mfc_dev *dev, struct s5p_mfc_ctx *ctx,
 {
        int ret = 0;
 
-       s5p_mfc_clock_on();
+       s5p_mfc_clock_on(dev);
 
        if (reqbufs->count == 0) {
                mfc_debug(2, "Freeing buffers\n");
@@ -533,7 +533,7 @@ static int reqbufs_output(struct s5p_mfc_dev *dev, struct s5p_mfc_ctx *ctx,
                ret = -EINVAL;
        }
 out:
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
        if (ret)
                mfc_err("Failed allocating buffers for OUTPUT queue\n");
        return ret;
@@ -544,7 +544,7 @@ static int reqbufs_capture(struct s5p_mfc_dev *dev, struct s5p_mfc_ctx *ctx,
 {
        int ret = 0;
 
-       s5p_mfc_clock_on();
+       s5p_mfc_clock_on(dev);
 
        if (reqbufs->count == 0) {
                mfc_debug(2, "Freeing buffers\n");
@@ -587,7 +587,7 @@ static int reqbufs_capture(struct s5p_mfc_dev *dev, struct s5p_mfc_ctx *ctx,
                ret = -EINVAL;
        }
 out:
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(dev);
        if (ret)
                mfc_err("Failed allocating buffers for CAPTURE queue\n");
        return ret;
index 7dee61c8c0b616b77306c9ab69f97d1d6ab54779..365f552e604bd20d3f739cdf4dc015c677fa50cf 100644 (file)
@@ -1348,7 +1348,7 @@ static void s5p_mfc_try_run_v5(struct s5p_mfc_dev *dev)
         * Last frame has already been sent to MFC.
         * Now obtaining frames from MFC buffer
         */
-       s5p_mfc_clock_on();
+       s5p_mfc_clock_on(dev);
        s5p_mfc_clean_ctx_int_flags(ctx);
 
        if (ctx->type == MFCINST_DECODER) {
@@ -1424,7 +1424,7 @@ static void s5p_mfc_try_run_v5(struct s5p_mfc_dev *dev)
                 * scheduled, reduce the clock count as no one will
                 * ever do this, because no interrupt related to this try_run
                 * will ever come from hardware. */
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
        }
 }
 
index 923d4b40dd6762dc58a156e0a01bd183d79332f7..73f7af674c01bdedaef7c5037cd1896cce9fd04c 100644 (file)
@@ -2165,7 +2165,7 @@ static void s5p_mfc_try_run_v6(struct s5p_mfc_dev *dev)
        /* Last frame has already been sent to MFC
         * Now obtaining frames from MFC buffer */
 
-       s5p_mfc_clock_on();
+       s5p_mfc_clock_on(dev);
        s5p_mfc_clean_ctx_int_flags(ctx);
 
        if (ctx->type == MFCINST_DECODER) {
@@ -2245,7 +2245,7 @@ static void s5p_mfc_try_run_v6(struct s5p_mfc_dev *dev)
                 * scheduled, reduce the clock count as no one will
                 * ever do this, because no interrupt related to this try_run
                 * will ever come from hardware. */
-               s5p_mfc_clock_off();
+               s5p_mfc_clock_off(dev);
        }
 }
 
@@ -2261,9 +2261,9 @@ s5p_mfc_read_info_v6(struct s5p_mfc_ctx *ctx, unsigned long ofs)
 {
        int ret;
 
-       s5p_mfc_clock_on();
+       s5p_mfc_clock_on(ctx->dev);
        ret = readl((void __iomem *)ofs);
-       s5p_mfc_clock_off();
+       s5p_mfc_clock_off(ctx->dev);
 
        return ret;
 }
index ecb3065c33c922d585c3c4779fe8bcbff1fe6191..ae42414083831b287d1ed6b15fa9537fa9876d1a 100644 (file)
 #include "s5p_mfc_debug.h"
 #include "s5p_mfc_pm.h"
 
-static struct s5p_mfc_pm *pm;
-
 int s5p_mfc_init_pm(struct s5p_mfc_dev *dev)
 {
+       struct s5p_mfc_pm *pm = &dev->pm;
        int i;
 
-       pm = &dev->pm;
        pm->num_clocks = dev->variant->num_clocks;
        pm->clk_names = dev->variant->clk_names;
        pm->device = &dev->plat_dev->dev;
@@ -50,58 +48,58 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev)
 
 void s5p_mfc_final_pm(struct s5p_mfc_dev *dev)
 {
-       pm_runtime_disable(pm->device);
+       pm_runtime_disable(dev->pm.device);
 }
 
-int s5p_mfc_clock_on(void)
+int s5p_mfc_clock_on(struct s5p_mfc_dev *dev)
 {
-       return clk_enable(pm->clock_gate);
+       return clk_enable(dev->pm.clock_gate);
 }
 
-void s5p_mfc_clock_off(void)
+void s5p_mfc_clock_off(struct s5p_mfc_dev *dev)
 {
-       clk_disable(pm->clock_gate);
+       clk_disable(dev->pm.clock_gate);
 }
 
-int s5p_mfc_power_on(void)
+int s5p_mfc_power_on(struct s5p_mfc_dev *dev)
 {
        int i, ret = 0;
 
-       ret = pm_runtime_resume_and_get(pm->device);
+       ret = pm_runtime_resume_and_get(dev->pm.device);
        if (ret < 0)
                return ret;
 
        /* clock control */
-       for (i = 0; i < pm->num_clocks; i++) {
-               ret = clk_prepare_enable(pm->clocks[i]);
+       for (i = 0; i < dev->pm.num_clocks; i++) {
+               ret = clk_prepare_enable(dev->pm.clocks[i]);
                if (ret < 0) {
                        mfc_err("clock prepare failed for clock: %s\n",
-                               pm->clk_names[i]);
+                               dev->pm.clk_names[i]);
                        goto err;
                }
        }
 
        /* prepare for software clock gating */
-       clk_disable(pm->clock_gate);
+       clk_disable(dev->pm.clock_gate);
 
        return 0;
 err:
        while (--i >= 0)
-               clk_disable_unprepare(pm->clocks[i]);
-       pm_runtime_put(pm->device);
+               clk_disable_unprepare(dev->pm.clocks[i]);
+       pm_runtime_put(dev->pm.device);
        return ret;
 }
 
-int s5p_mfc_power_off(void)
+int s5p_mfc_power_off(struct s5p_mfc_dev *dev)
 {
        int i;
 
        /* finish software clock gating */
-       clk_enable(pm->clock_gate);
+       clk_enable(dev->pm.clock_gate);
 
-       for (i = 0; i < pm->num_clocks; i++)
-               clk_disable_unprepare(pm->clocks[i]);
+       for (i = 0; i < dev->pm.num_clocks; i++)
+               clk_disable_unprepare(dev->pm.clocks[i]);
 
-       return pm_runtime_put_sync(pm->device);
+       return pm_runtime_put_sync(dev->pm.device);
 }
 
index 4159d2364e8729a61db56804f9fef2f690717afb..9c71036f038534d7c36ec9ecf659412b213ccf8b 100644 (file)
@@ -12,9 +12,9 @@
 int s5p_mfc_init_pm(struct s5p_mfc_dev *dev);
 void s5p_mfc_final_pm(struct s5p_mfc_dev *dev);
 
-int s5p_mfc_clock_on(void);
-void s5p_mfc_clock_off(void);
-int s5p_mfc_power_on(void);
-int s5p_mfc_power_off(void);
+int s5p_mfc_clock_on(struct s5p_mfc_dev *dev);
+void s5p_mfc_clock_off(struct s5p_mfc_dev *dev);
+int s5p_mfc_power_on(struct s5p_mfc_dev *dev);
+int s5p_mfc_power_off(struct s5p_mfc_dev *dev);
 
 #endif /* S5P_MFC_PM_H_ */