diff options
author | Georgi Djakov <georgi.djakov@linaro.org> | 2017-11-29 16:13:12 +0200 |
---|---|---|
committer | Georgi Djakov <georgi.djakov@linaro.org> | 2018-07-30 16:00:20 +0300 |
commit | eac4fe23623a0fc535455c73636715e1c4027638 (patch) | |
tree | 71aadc5fe9ff5a03360f4e3e2bedebf588b600f8 | |
parent | acb1872577b346bd15ab3a3f8dff780d6cca4b70 (diff) |
media: venus: Use the interconnect API
Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
-rw-r--r-- | drivers/media/platform/qcom/venus/core.c | 22 | ||||
-rw-r--r-- | drivers/media/platform/qcom/venus/core.h | 4 | ||||
-rw-r--r-- | drivers/media/platform/qcom/venus/vdec.c | 2 |
3 files changed, 28 insertions, 0 deletions
diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c index 41eef376eb2d..3e5e60a8ac62 100644 --- a/drivers/media/platform/qcom/venus/core.c +++ b/drivers/media/platform/qcom/venus/core.c @@ -14,6 +14,7 @@ */ #include <linux/clk.h> #include <linux/init.h> +#include <linux/interconnect.h> #include <linux/ioctl.h> #include <linux/list.h> #include <linux/module.h> @@ -171,6 +172,18 @@ static int venus_probe(struct platform_device *pdev) if (IS_ERR(core->base)) return PTR_ERR(core->base); + core->path = of_icc_get(dev, "video"); + if (IS_ERR(core->path)) + return PTR_ERR(core->path); + + core->path_mdp0 = of_icc_get(dev, "mdp0"); + if (IS_ERR(core->path_mdp0)) + return PTR_ERR(core->path_mdp0); + + core->path_gpu = of_icc_get(dev, "gpu"); + if (IS_ERR(core->path_gpu)) + return PTR_ERR(core->path_gpu); + core->irq = platform_get_irq(pdev, 0); if (core->irq < 0) return core->irq; @@ -275,6 +288,10 @@ static __maybe_unused int venus_runtime_suspend(struct device *dev) struct venus_core *core = dev_get_drvdata(dev); int ret; + icc_set(core->path, 0, 0); + icc_set(core->path_mdp0, 0, 1000); + icc_set(core->path_mdp1, 0, 1000); + ret = hfi_core_suspend(core); venus_clks_disable(core); @@ -287,6 +304,11 @@ static __maybe_unused int venus_runtime_resume(struct device *dev) struct venus_core *core = dev_get_drvdata(dev); int ret; + icc_set(core->path, 677600, 1331000); + icc_set(core->path_mdp0, 0, 6400000); + icc_set(core->path_mdp1, 0, 6400000); + icc_set(core->path_gpu, 1066000, 4264000); + ret = venus_clks_enable(core); if (ret) return ret; diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h index 0360d295f4c8..d97f1fb1fd75 100644 --- a/drivers/media/platform/qcom/venus/core.h +++ b/drivers/media/platform/qcom/venus/core.h @@ -120,6 +120,10 @@ struct venus_core { void *priv; const struct hfi_ops *ops; struct delayed_work work; + struct icc_path *path; + struct icc_path *path_mdp0; + struct icc_path *path_mdp1; + struct icc_path *path_gpu; }; struct vdec_controls { diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c index 49bbd1861d3a..4867edba8b6a 100644 --- a/drivers/media/platform/qcom/venus/vdec.c +++ b/drivers/media/platform/qcom/venus/vdec.c @@ -767,6 +767,8 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count) if (ret) goto deinit_sess; + /* TODO: determine parameters and set interconnect bandwidth */ + ret = venus_helper_vb2_start_streaming(inst); if (ret) goto deinit_sess; |