diff options
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.patch | 109 |
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"); |