aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorgi Djakov <georgi.djakov@linaro.org>2017-11-29 16:13:12 +0200
committerGeorgi Djakov <georgi.djakov@linaro.org>2018-07-30 16:00:20 +0300
commiteac4fe23623a0fc535455c73636715e1c4027638 (patch)
tree71aadc5fe9ff5a03360f4e3e2bedebf588b600f8
parentacb1872577b346bd15ab3a3f8dff780d6cca4b70 (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.c22
-rw-r--r--drivers/media/platform/qcom/venus/core.h4
-rw-r--r--drivers/media/platform/qcom/venus/vdec.c2
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;