aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2017-11-02 11:21:03 -0400
committerArnd Bergmann <arnd@arndb.de>2017-11-02 11:21:03 -0400
commit3330becb479fd26cfeeea1e06f8999c3b10806cc (patch)
tree2e7fb10017094af8374e848fb7dde2fcc9a9a865
parent78af0be67b297c3c4207b034e24c94e14c66b20c (diff)
parent04c3767f10809797331cda78808d9163939081e1 (diff)
Merge tag 'arm-soc/for-4.15/drivers-part2' of http://github.com/Broadcom/stblinux into next/drivers
Pull "Broadcom drivers changes for 4.15 (part 2)" from Florian Fainelli: This pull request contains Broadcom ARM/ARM64/MIPS SoCs changes for 4.15 (second part), please pull the following: - Markus updates the Broadcom STB DPFE driver to avoid loading the firmware when unnecessary to accomodate for specific platform restrictions - Florian adds support for the Broadcom Hurricane 2 SoC iProc PLL clock needed to get the proper CPU clock frequency * tag 'arm-soc/for-4.15/drivers-part2' of http://github.com/Broadcom/stblinux: clk: bcm: Add Broadcom Hurricane 2 clock support memory: brcmstb: dpfe: skip downloading firmware when possible memory: brcmstb: dpfe: introduce is_dcpu_enabled()
-rw-r--r--drivers/clk/bcm/Kconfig9
-rw-r--r--drivers/clk/bcm/Makefile1
-rw-r--r--drivers/clk/bcm/clk-hr2.c27
-rw-r--r--drivers/memory/brcmstb_dpfe.c37
4 files changed, 66 insertions, 8 deletions
diff --git a/drivers/clk/bcm/Kconfig b/drivers/clk/bcm/Kconfig
index 1d9187df167b..4c4bd85f707c 100644
--- a/drivers/clk/bcm/Kconfig
+++ b/drivers/clk/bcm/Kconfig
@@ -30,6 +30,15 @@ config CLK_BCM_CYGNUS
30 help 30 help
31 Enable common clock framework support for the Broadcom Cygnus SoC 31 Enable common clock framework support for the Broadcom Cygnus SoC
32 32
33config CLK_BCM_HR2
34 bool "Broadcom Hurricane 2 clock support"
35 depends on ARCH_BCM_HR2 || COMPILE_TEST
36 select COMMON_CLK_IPROC
37 default ARCH_BCM_HR2
38 help
39 Enable common clock framework support for the Broadcom Hurricane 2
40 SoC
41
33config CLK_BCM_NSP 42config CLK_BCM_NSP
34 bool "Broadcom Northstar/Northstar Plus clock support" 43 bool "Broadcom Northstar/Northstar Plus clock support"
35 depends on ARCH_BCM_5301X || ARCH_BCM_NSP || COMPILE_TEST 44 depends on ARCH_BCM_5301X || ARCH_BCM_NSP || COMPILE_TEST
diff --git a/drivers/clk/bcm/Makefile b/drivers/clk/bcm/Makefile
index a0c14fa4aa1e..755144195541 100644
--- a/drivers/clk/bcm/Makefile
+++ b/drivers/clk/bcm/Makefile
@@ -8,6 +8,7 @@ obj-$(CONFIG_ARCH_BCM2835) += clk-bcm2835.o
8obj-$(CONFIG_ARCH_BCM2835) += clk-bcm2835-aux.o 8obj-$(CONFIG_ARCH_BCM2835) += clk-bcm2835-aux.o
9obj-$(CONFIG_ARCH_BCM_53573) += clk-bcm53573-ilp.o 9obj-$(CONFIG_ARCH_BCM_53573) += clk-bcm53573-ilp.o
10obj-$(CONFIG_CLK_BCM_CYGNUS) += clk-cygnus.o 10obj-$(CONFIG_CLK_BCM_CYGNUS) += clk-cygnus.o
11obj-$(CONFIG_CLK_BCM_HR2) += clk-hr2.o
11obj-$(CONFIG_CLK_BCM_NSP) += clk-nsp.o 12obj-$(CONFIG_CLK_BCM_NSP) += clk-nsp.o
12obj-$(CONFIG_CLK_BCM_NS2) += clk-ns2.o 13obj-$(CONFIG_CLK_BCM_NS2) += clk-ns2.o
13obj-$(CONFIG_CLK_BCM_SR) += clk-sr.o 14obj-$(CONFIG_CLK_BCM_SR) += clk-sr.o
diff --git a/drivers/clk/bcm/clk-hr2.c b/drivers/clk/bcm/clk-hr2.c
new file mode 100644
index 000000000000..f7c5b7379475
--- /dev/null
+++ b/drivers/clk/bcm/clk-hr2.c
@@ -0,0 +1,27 @@
1/*
2 * Copyright (C) 2017 Broadcom
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation version 2.
7 *
8 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
9 * kind, whether express or implied; without even the implied warranty
10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <linux/kernel.h>
15#include <linux/err.h>
16#include <linux/clk-provider.h>
17#include <linux/io.h>
18#include <linux/of.h>
19#include <linux/of_address.h>
20
21#include "clk-iproc.h"
22
23static void __init hr2_armpll_init(struct device_node *node)
24{
25 iproc_armpll_setup(node);
26}
27CLK_OF_DECLARE(hr2_armpll, "brcm,hr2-armpll", hr2_armpll_init);
diff --git a/drivers/memory/brcmstb_dpfe.c b/drivers/memory/brcmstb_dpfe.c
index 21242c401af5..0a7bdbed3a6f 100644
--- a/drivers/memory/brcmstb_dpfe.c
+++ b/drivers/memory/brcmstb_dpfe.c
@@ -202,17 +202,26 @@ static const u32 dpfe_commands[DPFE_CMD_MAX][MSG_FIELD_MAX] = {
202 }, 202 },
203}; 203};
204 204
205static bool is_dcpu_enabled(void __iomem *regs)
206{
207 u32 val;
208
209 val = readl_relaxed(regs + REG_DCPU_RESET);
210
211 return !(val & DCPU_RESET_MASK);
212}
213
205static void __disable_dcpu(void __iomem *regs) 214static void __disable_dcpu(void __iomem *regs)
206{ 215{
207 u32 val; 216 u32 val;
208 217
209 /* Check if DCPU is running */ 218 if (!is_dcpu_enabled(regs))
219 return;
220
221 /* Put DCPU in reset if it's running. */
210 val = readl_relaxed(regs + REG_DCPU_RESET); 222 val = readl_relaxed(regs + REG_DCPU_RESET);
211 if (!(val & DCPU_RESET_MASK)) { 223 val |= (1 << DCPU_RESET_SHIFT);
212 /* Put DCPU in reset */ 224 writel_relaxed(val, regs + REG_DCPU_RESET);
213 val |= (1 << DCPU_RESET_SHIFT);
214 writel_relaxed(val, regs + REG_DCPU_RESET);
215 }
216} 225}
217 226
218static void __enable_dcpu(void __iomem *regs) 227static void __enable_dcpu(void __iomem *regs)
@@ -422,13 +431,25 @@ static int brcmstb_dpfe_download_firmware(struct platform_device *pdev,
422 const void *fw_blob; 431 const void *fw_blob;
423 int ret; 432 int ret;
424 433
434 priv = platform_get_drvdata(pdev);
435
436 /*
437 * Skip downloading the firmware if the DCPU is already running and
438 * responding to commands.
439 */
440 if (is_dcpu_enabled(priv->regs)) {
441 u32 response[MSG_FIELD_MAX];
442
443 ret = __send_command(priv, DPFE_CMD_GET_INFO, response);
444 if (!ret)
445 return 0;
446 }
447
425 ret = request_firmware(&fw, FIRMWARE_NAME, dev); 448 ret = request_firmware(&fw, FIRMWARE_NAME, dev);
426 /* request_firmware() prints its own error messages. */ 449 /* request_firmware() prints its own error messages. */
427 if (ret) 450 if (ret)
428 return ret; 451 return ret;
429 452
430 priv = platform_get_drvdata(pdev);
431
432 ret = __verify_firmware(init, fw); 453 ret = __verify_firmware(init, fw);
433 if (ret) 454 if (ret)
434 return -EFAULT; 455 return -EFAULT;