summaryrefslogtreecommitdiffstats
path: root/patches/linux-4.13-rc4/0035-m-drivers-remoteproc-imx_rproc.c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/linux-4.13-rc4/0035-m-drivers-remoteproc-imx_rproc.c.patch')
-rw-r--r--patches/linux-4.13-rc4/0035-m-drivers-remoteproc-imx_rproc.c.patch109
1 files changed, 109 insertions, 0 deletions
diff --git a/patches/linux-4.13-rc4/0035-m-drivers-remoteproc-imx_rproc.c.patch b/patches/linux-4.13-rc4/0035-m-drivers-remoteproc-imx_rproc.c.patch
new file mode 100644
index 0000000..a498aff
--- /dev/null
+++ b/patches/linux-4.13-rc4/0035-m-drivers-remoteproc-imx_rproc.c.patch
@@ -0,0 +1,109 @@
+From 941b1685144529956d0695d8c5fdc84a4aed175b Mon Sep 17 00:00:00 2001
+From: Oleksij Rempel <linux@rempel-privat.de>
+Date: Wed, 27 Sep 2017 14:56:32 +0200
+Subject: [PATCH] m drivers/remoteproc/imx_rproc.c
+
+Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
+---
+ drivers/remoteproc/imx_rproc.c | 67 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 67 insertions(+)
+
+diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
+index 3bd638c7a07e..8259518e4d3f 100644
+--- a/drivers/remoteproc/imx_rproc.c
++++ b/drivers/remoteproc/imx_rproc.c
+@@ -47,6 +47,7 @@
+ | IMX6SX_SW_M4C_RST)
+
+ #define IMX7D_RPROC_MEM_MAX 8
++#define IMX7D_RPROC_RCLKS_MAX 8
+
+ /**
+ * struct imx_rproc_mem - slim internal memory structure
+@@ -88,6 +89,7 @@ struct imx_rproc {
+ const struct imx_rproc_dcfg *dcfg;
+ struct imx_rproc_mem mem[IMX7D_RPROC_MEM_MAX];
+ struct clk *clk;
++ struct clk *rclk[IMX7D_RPROC_RCLKS_MAX];
+ };
+
+ static const struct imx_rproc_att imx_rproc_att_imx7d[] = {
+@@ -252,6 +254,65 @@ static const struct rproc_ops imx_rproc_ops = {
+ .da_to_va = imx_rproc_da_to_va,
+ };
+
++static int imx_rproc_set_rclks(struct imx_rproc *priv)
++{
++ struct device *dev = priv->dev;
++ struct device_node *node = dev->of_node;
++ struct of_phandle_args clkspec;
++ int index, rc, ret, num_parents;
++ struct clk *clk, *pclk;
++
++ num_parents = of_count_phandle_with_args(node, "remote-clocks",
++ "#clock-cells");
++ if (num_parents == -EINVAL) {
++ dev_err(dev, "clk: invalid value of remote-clocks property at %s\n",
++ node->full_name);
++ return -EINVAL;
++ }
++
++ if (IMX7D_RPROC_RCLKS_MAX < num_parents) {
++ dev_err(dev, "unsupported count of remote clocks: %i, max: %i\n",
++ num_parents, IMX7D_RPROC_RCLKS_MAX);
++ return -EINVAL;
++ }
++
++ for (index = 0; index < num_parents; index++) {
++ rc = of_parse_phandle_with_args(node, "remote-clocks",
++ "#clock-cells", index, &clkspec);
++ if (rc < 0)
++ goto err;
++
++ if (clkspec.np == node) {
++ rc = 0;
++ goto err;
++ }
++
++ clk = of_clk_get_from_provider(&clkspec);
++ if (IS_ERR(clk)) {
++ if (PTR_ERR(clk) != -EPROBE_DEFER)
++ dev_warn(dev, "clk: couldn't get assigned clock %d for %s\n",
++ index, node->full_name);
++ rc = PTR_ERR(clk);
++ goto err;
++ }
++
++ /*
++ * clk for M4 block including memory. Should be
++ * enabled before .start for FW transfer.
++ */
++ ret = clk_prepare_enable(clk);
++ if (ret) {
++ dev_err(dev, "Failed to enable clock\n");
++ return ret;
++ }
++
++ }
++ return 0;
++err:
++ return rc;
++}
++
++
+ static int imx_rproc_addr_init(struct imx_rproc *priv,
+ struct platform_device *pdev)
+ {
+@@ -378,6 +439,12 @@ static int imx_rproc_probe(struct platform_device *pdev)
+ return ret;
+ }
+
++ ret = imx_rproc_set_rclks(priv);
++ if (ret) {
++ dev_err(dev, "filed on imx_rproc_set_rclks\n");
++ goto err_put_rproc;
++ }
++
+ ret = rproc_add(rproc);
+ if (ret) {
+ dev_err(dev, "rproc_add failed\n");