MIPS: BCM63XX: split out swpkt_sar/usb clocks
authorJonas Gorski <jonas.gorski@gmail.com>
Wed, 20 Sep 2017 11:14:08 +0000 (13:14 +0200)
committerJames Hogan <jhogan@kernel.org>
Tue, 7 Nov 2017 18:33:20 +0000 (18:33 +0000)
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>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: Kevin Cernekee <cernekee@gmail.com>
Cc: Russell King <linux@armlinux.org.uk>
Cc: linux-mips@linux-mips.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-serial@vger.kernel.org
Cc: devicetree@vger.kernel.org
Cc: bcm-kernel-feedback-list@broadcom.com
Patchwork: https://patchwork.linux-mips.org/patch/17332/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: James Hogan <jhogan@kernel.org>
arch/mips/bcm63xx/clk.c

index 2018425fe97e9117fe07c3561938e66f27b759a3..164115944a7fd6a76c9f9aad84c04f970156446a 100644 (file)
@@ -121,22 +121,57 @@ static struct clk clk_ephy = {
        .set    = ephy_set,
 };
 
+/*
+ * 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 */
@@ -261,8 +296,12 @@ static void xtm_set(struct clk *clk, int enable)
        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 */
@@ -451,6 +490,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),
 };