aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm63xx/patches-4.9/001-4.15-07-MIPS-BCM63XX-split-out-swpkt_sar-usb-clocks.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm63xx/patches-4.9/001-4.15-07-MIPS-BCM63XX-split-out-swpkt_sar-usb-clocks.patch')
-rw-r--r--target/linux/brcm63xx/patches-4.9/001-4.15-07-MIPS-BCM63XX-split-out-swpkt_sar-usb-clocks.patch105
1 files changed, 105 insertions, 0 deletions
diff --git a/target/linux/brcm63xx/patches-4.9/001-4.15-07-MIPS-BCM63XX-split-out-swpkt_sar-usb-clocks.patch b/target/linux/brcm63xx/patches-4.9/001-4.15-07-MIPS-BCM63XX-split-out-swpkt_sar-usb-clocks.patch
new file mode 100644
index 0000000000..f9698c2501
--- /dev/null
+++ b/target/linux/brcm63xx/patches-4.9/001-4.15-07-MIPS-BCM63XX-split-out-swpkt_sar-usb-clocks.patch
@@ -0,0 +1,105 @@
+From b98027285bd1fa95da0645a4234a5fc1f1a83f92 Mon Sep 17 00:00:00 2001
+From: Jonas Gorski <jonas.gorski@gmail.com>
+Date: Sun, 26 Feb 2017 11:59:52 +0100
+Subject: [PATCH V2 8/8] MIPS: BCM63XX: split out swpkt_sar/usb clocks
+
+Make the secondary switch clocks their own clocks. This allows proper
+enable reference counting between SAR/XTM and the main switch clocks,
+and controlling them individually from drivers.
+
+Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
+---
+ arch/mips/bcm63xx/clk.c | 61 +++++++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 51 insertions(+), 10 deletions(-)
+
+--- a/arch/mips/bcm63xx/clk.c
++++ b/arch/mips/bcm63xx/clk.c
+@@ -121,21 +121,56 @@ static struct clk clk_ephy = {
+ };
+
+ /*
++ * Ethernet switch SAR clock
++ */
++static void swpkt_sar_set(struct clk *clk, int enable)
++{
++ if (BCMCPU_IS_6368())
++ bcm_hwclock_set(CKCTL_6368_SWPKT_SAR_EN, enable);
++ else
++ return;
++}
++
++static struct clk clk_swpkt_sar = {
++ .set = swpkt_sar_set,
++};
++
++/*
++ * Ethernet switch USB clock
++ */
++static void swpkt_usb_set(struct clk *clk, int enable)
++{
++ if (BCMCPU_IS_6368())
++ bcm_hwclock_set(CKCTL_6368_SWPKT_USB_EN, enable);
++ else
++ return;
++}
++
++static struct clk clk_swpkt_usb = {
++ .set = swpkt_usb_set,
++};
++
++/*
+ * Ethernet switch clock
+ */
+ static void enetsw_set(struct clk *clk, int enable)
+ {
+- if (BCMCPU_IS_6328())
++ if (BCMCPU_IS_6328()) {
+ bcm_hwclock_set(CKCTL_6328_ROBOSW_EN, enable);
+- else if (BCMCPU_IS_6362())
++ } else if (BCMCPU_IS_6362()) {
+ bcm_hwclock_set(CKCTL_6362_ROBOSW_EN, enable);
+- else if (BCMCPU_IS_6368())
+- bcm_hwclock_set(CKCTL_6368_ROBOSW_EN |
+- CKCTL_6368_SWPKT_USB_EN |
+- CKCTL_6368_SWPKT_SAR_EN,
+- enable);
+- else
++ } else if (BCMCPU_IS_6368()) {
++ if (enable) {
++ clk_enable_unlocked(&clk_swpkt_sar);
++ clk_enable_unlocked(&clk_swpkt_usb);
++ } else {
++ clk_disable_unlocked(&clk_swpkt_usb);
++ clk_disable_unlocked(&clk_swpkt_sar);
++ }
++ bcm_hwclock_set(CKCTL_6368_ROBOSW_EN, enable);
++ } else {
+ return;
++ }
+
+ if (enable) {
+ /* reset switch core afer clock change */
+@@ -260,8 +295,12 @@ static void xtm_set(struct clk *clk, int
+ if (!BCMCPU_IS_6368())
+ return;
+
+- bcm_hwclock_set(CKCTL_6368_SAR_EN |
+- CKCTL_6368_SWPKT_SAR_EN, enable);
++ if (enable)
++ clk_enable_unlocked(&clk_swpkt_sar);
++ else
++ clk_disable_unlocked(&clk_swpkt_sar);
++
++ bcm_hwclock_set(CKCTL_6368_SAR_EN, enable);
+
+ if (enable) {
+ /* reset sar core afer clock change */
+@@ -447,6 +486,8 @@ static struct clk_lookup bcm6358_clks[]
+ CLKDEV_INIT(NULL, "usbd", &clk_usbd),
+ CLKDEV_INIT(NULL, "spi", &clk_spi),
+ CLKDEV_INIT(NULL, "pcm", &clk_pcm),
++ CLKDEV_INIT(NULL, "swpkt_sar", &clk_swpkt_sar),
++ CLKDEV_INIT(NULL, "swpkt_usb", &clk_swpkt_usb),
+ CLKDEV_INIT("bcm63xx_enet.0", "enet", &clk_enet0),
+ CLKDEV_INIT("bcm63xx_enet.1", "enet", &clk_enet1),
+ };