brcm63xx: add clkdev lookup support
[openwrt/staging/wigyori.git] / target / linux / brcm63xx / patches-4.4 / 001-4.15-07-MIPS-BCM63XX-split-out-swpkt_sar-usb-clocks.patch
diff --git a/target/linux/brcm63xx/patches-4.4/001-4.15-07-MIPS-BCM63XX-split-out-swpkt_sar-usb-clocks.patch b/target/linux/brcm63xx/patches-4.4/001-4.15-07-MIPS-BCM63XX-split-out-swpkt_sar-usb-clocks.patch
new file mode 100644 (file)
index 0000000..b536601
--- /dev/null
@@ -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 */
+@@ -444,6 +483,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),
+ };