diff mbox

[v4,02/10] remoteproc: qcom: Initialize MSS reset control handle

Message ID 1479315696-15490-3-git-send-email-akdwived@codeaurora.org (mailing list archive)
State Not Applicable, archived
Delegated to: Andy Gross
Headers show

Commit Message

Dwivedi, Avaneesh Kumar (avani) Nov. 16, 2016, 5:01 p.m. UTC
Reset assert of mss need to be done before mss clocks are
enabled and hexagon starts ticking. On some platform handle
to program restart register is via reset control framework
while on some it is by direct ioremap.

Signed-off-by: Avaneesh Kumar Dwivedi <akdwived@codeaurora.org>
---
 drivers/remoteproc/qcom_q6v5_pil.c | 40 ++++++++++++++++++++++++++++++--------
 1 file changed, 32 insertions(+), 8 deletions(-)
diff mbox

Patch

diff --git a/drivers/remoteproc/qcom_q6v5_pil.c b/drivers/remoteproc/qcom_q6v5_pil.c
index 7660012..f43c96b 100644
--- a/drivers/remoteproc/qcom_q6v5_pil.c
+++ b/drivers/remoteproc/qcom_q6v5_pil.c
@@ -37,7 +37,6 @@ 
 
 #include <linux/qcom_scm.h>
 
-#define MBA_FIRMWARE_NAME              "mba.b00"
 #define MPSS_FIRMWARE_NAME		"modem.mdt"
 
 #define MPSS_CRASH_REASON_SMEM		421
@@ -117,7 +116,7 @@  struct q6v5 {
 
 	void __iomem *reg_base;
 	void __iomem *rmb_base;
-
+	void __iomem *restart_reg;
 	struct regmap *halt_map;
 	u32 halt_q6;
 	u32 halt_modem;
@@ -743,9 +742,12 @@  static int q6v5_init_clocks(struct q6v5 *qproc)
 	return 0;
 }
 
-static int q6v5_init_reset(struct q6v5 *qproc)
+static int q6v5_init_reset(void *q, void *p)
 {
-	qproc->mss_restart = devm_reset_control_get(qproc->dev, NULL);
+	struct q6v5 *qproc = q;
+	struct platform_device *pdev = p;
+
+	qproc->mss_restart = devm_reset_control_get(&pdev->dev, NULL);
 	if (IS_ERR(qproc->mss_restart)) {
 		dev_err(qproc->dev, "failed to acquire mss restart\n");
 		return PTR_ERR(qproc->mss_restart);
@@ -754,6 +756,23 @@  static int q6v5_init_reset(struct q6v5 *qproc)
 	return 0;
 }
 
+static int q6v56_init_reset(void *q, void *p)
+{
+	struct resource *res;
+	struct q6v5 *qproc = q;
+	struct platform_device *pdev = p;
+
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "restart_reg");
+	qproc->restart_reg = devm_ioremap(qproc->dev, res->start,
+							resource_size(res));
+	if (IS_ERR(qproc->restart_reg)) {
+		dev_err(qproc->dev, "failed to get restart_reg\n");
+		return PTR_ERR(qproc->restart_reg);
+	}
+
+	return 0;
+}
+
 static int q6v5_request_irq(struct q6v5 *qproc,
 			     struct platform_device *pdev,
 			     const char *name,
@@ -825,10 +844,15 @@  static int q6v5_probe(struct platform_device *pdev)
 {
 	struct q6v5 *qproc;
 	struct rproc *rproc;
+	const struct q6_rproc_res *desc;
 	int ret;
 
+	desc = of_device_get_match_data(&pdev->dev);
+	if (!desc)
+		return -EINVAL;
+
 	rproc = rproc_alloc(&pdev->dev, pdev->name, &q6v5_ops,
-			    MBA_FIRMWARE_NAME, sizeof(*qproc));
+			    desc->q6_mba_image, sizeof(*qproc));
 	if (!rproc) {
 		dev_err(&pdev->dev, "failed to allocate rproc\n");
 		return -ENOMEM;
@@ -860,7 +884,7 @@  static int q6v5_probe(struct platform_device *pdev)
 	if (ret)
 		goto free_rproc;
 
-	ret = q6v5_init_reset(qproc);
+	ret = desc->q6_reset_init(qproc, pdev);
 	if (ret)
 		goto free_rproc;
 
@@ -916,7 +940,7 @@  static int q6v5_remove(struct platform_device *pdev)
 		"gpll0_mss_clk", "snoc_axi_clk", "mnoc_axi_clk", NULL};
 
 static const struct q6_rproc_res q6v56_res = {
-	.q6_reset_init = NULL,
+	.q6_reset_init = q6v56_init_reset,
 	.q6_mba_image = "mba.mbn",
 	.proxy_reg_string = proxy_q6v56_regulator_namestr,
 	.active_reg_string = NULL,
@@ -927,7 +951,7 @@  static int q6v5_remove(struct platform_device *pdev)
 };
 
 static const struct q6_rproc_res q6v5_res = {
-	.q6_reset_init = NULL,
+	.q6_reset_init = q6v5_init_reset,
 	.q6_mba_image = "mba.mbn",
 	.proxy_reg_string = proxy_q6v56_regulator_namestr,
 	.proxy_voltage_load = (int **)proxy_q6v56_voltage_load,