From: Avaneesh Kumar Dwivedi <akdwived@codeaurora.org>
To: bjorn.andersson@linaro.org
Cc: sboyd@codeaurora.org, stanimir.varbanov@linaro.org,
agross@codeaurora.org, linux-arm-msm@vger.kernel.org,
Avaneesh Kumar Dwivedi <akdwived@codeaurora.org>
Subject: [RESEND PATCH v2] remoteproc: qcom: Add venus rproc support on msm8996 platform.
Date: Tue, 29 Nov 2016 16:20:47 +0530 [thread overview]
Message-ID: <1480416647-3518-2-git-send-email-akdwived@codeaurora.org> (raw)
In-Reply-To: <1480416647-3518-1-git-send-email-akdwived@codeaurora.org>
This patch is based on
https://patchwork.kernel.org/patch/9415627/
https://patchwork.kernel.org/patch/9415651/
This patch add clock initialization, enable and disable support.
Required resource name string and rating are differentiated based
on compatible string. Also added documentation for venus pil on
msm8996.
Signed-off-by: Avaneesh Kumar Dwivedi <akdwived@codeaurora.org>
---
.../devicetree/bindings/remoteproc/qcom,venus.txt | 26 ++++-
drivers/remoteproc/qcom_venus_pil.c | 116 ++++++++++++++++++++-
2 files changed, 140 insertions(+), 2 deletions(-)
diff --git a/Documentation/devicetree/bindings/remoteproc/qcom,venus.txt b/Documentation/devicetree/bindings/remoteproc/qcom,venus.txt
index 2d73ba1..417026b 100644
--- a/Documentation/devicetree/bindings/remoteproc/qcom,venus.txt
+++ b/Documentation/devicetree/bindings/remoteproc/qcom,venus.txt
@@ -6,13 +6,30 @@ on the Qualcomm Venus remote processor core.
- compatible:
Usage: required
Value type: <string>
- Definition: must contain "qcom,venus-pil"
+ Definition: must contain "qcom,venus-pil" or
+ "qcom,venus-msm8996-pil"
- memory-region:
Usage: required
Value type: <phandle>
Definition: a phandle to a node describing reserved memory
+- clocks:
+ Usage: required
+ Value type: <prop-encoded-array>
+ Definition: reference to the core, iface and bus and maxi clocks to be held on
+ behalf of the booting of the venus core
+
+- clock-names:
+ Usage: required
+ Value type: <stringlist>
+ Definition: should be "core_clk", "iface_clk", "bus_clk", "maxi_clk"
+
+- power-domains:
+ Usage: required
+ Value type: <prop-encoded-array>
+ Definition: reference to the venus gdsc to be turned on before booting venus core
+
* An example
reserved-memory {
#address-cells = <2>;
@@ -29,5 +46,12 @@ on the Qualcomm Venus remote processor core.
rproc_venus@0 {
compatible = "qcom,venus-pil";
+ clocks = <&mmcc VIDEO_CORE_CLK>,
+ <&mmcc VIDEO_AHB_CLK>,
+ <&mmcc VIDEO_AXI_CLK>,
+ <&mmcc VIDEO_MAXI_CLK>;
+
+ clock-names = "core_clk", "iface_clk", "bus_clk", "maxi_clk";
+ power-domains = <&mmcc VENUS_GDSC>;
memory-region = <&venus_mem>;
};
diff --git a/drivers/remoteproc/qcom_venus_pil.c b/drivers/remoteproc/qcom_venus_pil.c
index 6d4e55b..f91f873 100644
--- a/drivers/remoteproc/qcom_venus_pil.c
+++ b/drivers/remoteproc/qcom_venus_pil.c
@@ -19,8 +19,10 @@
#include <linux/module.h>
#include <linux/of_reserved_mem.h>
#include <linux/platform_device.h>
+#include <linux/clk.h>
#include <linux/qcom_scm.h>
#include <linux/remoteproc.h>
+#include <linux/of_device.h>
#include "qcom_mdt_loader.h"
#include "remoteproc_internal.h"
@@ -30,6 +32,11 @@
#define VENUS_PAS_ID 9
#define VENUS_FW_MEM_SIZE SZ_8M
+struct venus_rproc_res {
+ char **venus_clks;
+ int venus_clk_rate[4];
+};
+
struct qcom_venus {
struct device *dev;
struct rproc *rproc;
@@ -37,6 +44,8 @@ struct qcom_venus {
phys_addr_t mem_phys;
void *mem_va;
size_t mem_size;
+ struct clk *venus_clks[4];
+ int clk_count;
};
static int venus_load(struct rproc *rproc, const struct firmware *fw)
@@ -78,11 +87,49 @@ static int venus_load(struct rproc *rproc, const struct firmware *fw)
.load = venus_load,
};
+static int qcom_venus_clk_enable(struct device *dev, struct clk **clks,
+ int clk_count)
+{
+ int rc = 0;
+ int i;
+
+ for (i = 0; i < clk_count; i++) {
+ rc = clk_prepare_enable(clks[i]);
+ if (rc) {
+ dev_err(dev, "Clock enable failed\n");
+ goto err;
+ }
+ }
+
+ return 0;
+err:
+ for (i--; i >= 0; i--)
+ clk_disable_unprepare(clks[i]);
+
+ return rc;
+}
+
+static void qcom_venus_clk_disable(struct qcom_venus *venus)
+{
+ int i;
+ struct clk **clks = venus->venus_clks;
+
+ for (i = 0; i < venus->clk_count; i++)
+ clk_disable_unprepare(clks[i]);
+}
+
static int venus_start(struct rproc *rproc)
{
struct qcom_venus *venus = rproc->priv;
int ret;
+ ret = qcom_venus_clk_enable(venus->dev, venus->venus_clks,
+ venus->clk_count);
+ if (ret) {
+ dev_err(venus->dev, "failed to enable venus_clk\n");
+ return ret;
+ }
+
ret = qcom_scm_pas_auth_and_reset(VENUS_PAS_ID);
if (ret)
dev_err(venus->dev,
@@ -101,6 +148,8 @@ static int venus_stop(struct rproc *rproc)
if (ret)
dev_err(venus->dev, "failed to shutdown: %d\n", ret);
+ qcom_venus_clk_disable(venus);
+
return ret;
}
@@ -123,13 +172,58 @@ static void *venus_da_to_va(struct rproc *rproc, u64 da, int len)
.da_to_va = venus_da_to_va,
};
+static int qcom_venus_init_clocks(struct device *dev, struct clk **clks,
+ char **clk_str, const int *rate)
+{
+ int clk_count = 0, i;
+
+ if (!clk_str)
+ return 0;
+
+ while (clk_str[clk_count] != NULL)
+ clk_count++;
+
+ if (!clk_count)
+ return clk_count;
+
+ if (!clks)
+ return -ENOMEM;
+
+ for (i = 0; i < clk_count; i++) {
+ const char *clock_name;
+
+ clock_name = clk_str[i];
+ clks[i] = devm_clk_get(dev, clock_name);
+ if (IS_ERR(clks[i])) {
+
+ int rc = PTR_ERR(clks[i]);
+
+ if (rc != -EPROBE_DEFER)
+ dev_err(dev, "Failed to get %s clock\n",
+ clock_name);
+ return rc;
+ }
+ clk_set_rate(clks[i], clk_round_rate(clks[i], rate[i]));
+
+ }
+
+ return clk_count;
+}
+
+
+
static int venus_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct qcom_venus *venus;
struct rproc *rproc;
+ const struct venus_rproc_res *desc;
int ret;
+ desc = of_device_get_match_data(&pdev->dev);
+ if (!desc)
+ return -EINVAL;
+
if (!qcom_scm_is_available())
return -EPROBE_DEFER;
@@ -158,6 +252,14 @@ static int venus_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, venus);
+ ret = qcom_venus_init_clocks(&pdev->dev, venus->venus_clks,
+ desc->venus_clks, desc->venus_clk_rate);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "Failed to setup venus clocks.\n");
+ return ret;
+ }
+ venus->clk_count = ret;
+
venus->mem_va = dma_alloc_coherent(dev, venus->mem_size,
&venus->mem_phys, GFP_KERNEL);
if (!venus->mem_va) {
@@ -194,8 +296,20 @@ static int venus_remove(struct platform_device *pdev)
return 0;
}
+static const struct venus_rproc_res venus_msm8996_res = {
+ .venus_clks = (char*[]){"core_clk", "iface_clk", "bus_clk",
+ "maxi_clk", NULL},
+ .venus_clk_rate = {19200000, 19200000, 19200000, 80000000},
+};
+
+static const struct venus_rproc_res venus_8916_res = {
+ .venus_clks = NULL,
+ .venus_clk_rate = {0},
+};
+
static const struct of_device_id venus_of_match[] = {
- { .compatible = "qcom,venus-pil" },
+ { .compatible = "qcom,venus-msm8996-pil", .data = &venus_msm8996_res },
+ { .compatible = "qcom,venus-pil", .data = &venus_8916_res},
{ },
};
--
Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project.
next prev parent reply other threads:[~2016-11-29 10:51 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-29 10:50 [RESEND PATCH v2] remoteproc: qcom: Venus firmware loader support for msm8996 Avaneesh Kumar Dwivedi
2016-11-29 10:50 ` Avaneesh Kumar Dwivedi [this message]
2016-11-29 19:27 ` [RESEND PATCH v2] remoteproc: qcom: Add venus rproc support on msm8996 platform Stephen Boyd
2016-11-30 5:24 ` Dwivedi, Avaneesh Kumar (avani)
2016-11-30 9:22 ` Stanimir Varbanov
2016-12-05 9:46 ` Dwivedi, Avaneesh Kumar (avani)
2016-12-07 10:49 ` Stanimir Varbanov
2016-12-13 6:51 ` Bjorn Andersson
2016-12-17 0:56 ` Stephen Boyd
2016-12-17 7:11 ` Bjorn Andersson
2016-12-21 6:40 ` Dwivedi, Avaneesh Kumar (avani)
2017-01-25 12:37 ` Stanimir Varbanov
2016-11-29 19:24 ` [RESEND PATCH v2] remoteproc: qcom: Venus firmware loader support for msm8996 Stephen Boyd
2016-11-30 5:15 ` Dwivedi, Avaneesh Kumar (avani)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1480416647-3518-2-git-send-email-akdwived@codeaurora.org \
--to=akdwived@codeaurora.org \
--cc=agross@codeaurora.org \
--cc=bjorn.andersson@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=sboyd@codeaurora.org \
--cc=stanimir.varbanov@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.