linux-arm-msm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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.

  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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).