diff options
author | Arnd Bergmann <arnd@arndb.de> | 2017-11-02 11:21:03 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2017-11-02 11:21:03 -0400 |
commit | 3330becb479fd26cfeeea1e06f8999c3b10806cc (patch) | |
tree | 2e7fb10017094af8374e848fb7dde2fcc9a9a865 | |
parent | 78af0be67b297c3c4207b034e24c94e14c66b20c (diff) | |
parent | 04c3767f10809797331cda78808d9163939081e1 (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/Kconfig | 9 | ||||
-rw-r--r-- | drivers/clk/bcm/Makefile | 1 | ||||
-rw-r--r-- | drivers/clk/bcm/clk-hr2.c | 27 | ||||
-rw-r--r-- | drivers/memory/brcmstb_dpfe.c | 37 |
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 | ||
33 | config 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 | |||
33 | config CLK_BCM_NSP | 42 | config 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 | |||
8 | obj-$(CONFIG_ARCH_BCM2835) += clk-bcm2835-aux.o | 8 | obj-$(CONFIG_ARCH_BCM2835) += clk-bcm2835-aux.o |
9 | obj-$(CONFIG_ARCH_BCM_53573) += clk-bcm53573-ilp.o | 9 | obj-$(CONFIG_ARCH_BCM_53573) += clk-bcm53573-ilp.o |
10 | obj-$(CONFIG_CLK_BCM_CYGNUS) += clk-cygnus.o | 10 | obj-$(CONFIG_CLK_BCM_CYGNUS) += clk-cygnus.o |
11 | obj-$(CONFIG_CLK_BCM_HR2) += clk-hr2.o | ||
11 | obj-$(CONFIG_CLK_BCM_NSP) += clk-nsp.o | 12 | obj-$(CONFIG_CLK_BCM_NSP) += clk-nsp.o |
12 | obj-$(CONFIG_CLK_BCM_NS2) += clk-ns2.o | 13 | obj-$(CONFIG_CLK_BCM_NS2) += clk-ns2.o |
13 | obj-$(CONFIG_CLK_BCM_SR) += clk-sr.o | 14 | obj-$(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 | |||
23 | static void __init hr2_armpll_init(struct device_node *node) | ||
24 | { | ||
25 | iproc_armpll_setup(node); | ||
26 | } | ||
27 | CLK_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 | ||
205 | static 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 | |||
205 | static void __disable_dcpu(void __iomem *regs) | 214 | static 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 | ||
218 | static void __enable_dcpu(void __iomem *regs) | 227 | static 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; |