netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/3] net: dsa: bcm_sf2: Clock support
@ 2020-09-01 22:59 Florian Fainelli
  2020-09-01 22:59 ` [PATCH net-next 1/3] dt-bindings: net: Document Broadcom SF2 switch clocks Florian Fainelli
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Florian Fainelli @ 2020-09-01 22:59 UTC (permalink / raw)
  To: netdev
  Cc: Florian Fainelli, David S. Miller, Jakub Kicinski, Rob Herring,
	Andrew Lunn, Vivien Didelot,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	open list

Hi David,

This patch series adds support for controlling the SF2 switch core and
divider clock (where applicable).

Florian Fainelli (3):
  dt-bindings: net: Document Broadcom SF2 switch clocks
  net: dsa: bcm_sf2: request and handle clocks
  net: dsa: bcm_sf2: recalculate switch clock rate based on ports

 .../bindings/net/brcm,bcm7445-switch-v4.0.txt |  7 ++
 drivers/net/dsa/bcm_sf2.c                     | 84 ++++++++++++++++++-
 drivers/net/dsa/bcm_sf2.h                     |  4 +
 3 files changed, 93 insertions(+), 2 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH net-next 1/3] dt-bindings: net: Document Broadcom SF2 switch clocks
  2020-09-01 22:59 [PATCH net-next 0/3] net: dsa: bcm_sf2: Clock support Florian Fainelli
@ 2020-09-01 22:59 ` Florian Fainelli
  2020-09-02 12:43   ` Andrew Lunn
  2020-09-01 22:59 ` [PATCH net-next 2/3] net: dsa: bcm_sf2: request and handle clocks Florian Fainelli
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Florian Fainelli @ 2020-09-01 22:59 UTC (permalink / raw)
  To: netdev
  Cc: Florian Fainelli, David S. Miller, Jakub Kicinski, Rob Herring,
	Andrew Lunn, Vivien Didelot,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	open list

Describe the two possible clocks feeding into the Broadcom SF2
integrated Ethernet switch. BCM7445 systems have two clocks, one for the
main switch core clock, and another for controlling the switch clock
divider whereas BCM7278 systems only have the first kind.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 .../devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt   | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt b/Documentation/devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt
index 88b57b0ca1f4..97ca62b0e14d 100644
--- a/Documentation/devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt
+++ b/Documentation/devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt
@@ -50,6 +50,13 @@ Optional properties:
 - reset-names: If the "reset" property is specified, this property should have
   the value "switch" to denote the switch reset line.
 
+- clocks: when provided, the first phandle is to the switch's main clock and
+  is valid for both BCM7445 and BCM7278. The second phandle is only applicable
+  to BCM7445 and is to support dividing the switch core clock.
+
+- clock-names: when provided, the first phandle must be "sw_switch", and the
+  second must be named "sw_switch_mdiv".
+
 Port subnodes:
 
 Optional properties:
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH net-next 2/3] net: dsa: bcm_sf2: request and handle clocks
  2020-09-01 22:59 [PATCH net-next 0/3] net: dsa: bcm_sf2: Clock support Florian Fainelli
  2020-09-01 22:59 ` [PATCH net-next 1/3] dt-bindings: net: Document Broadcom SF2 switch clocks Florian Fainelli
@ 2020-09-01 22:59 ` Florian Fainelli
  2020-09-02 12:43   ` Andrew Lunn
  2020-09-01 22:59 ` [PATCH net-next 3/3] net: dsa: bcm_sf2: recalculate switch clock rate based on ports Florian Fainelli
  2020-09-03 22:08 ` [PATCH net-next 0/3] net: dsa: bcm_sf2: Clock support David Miller
  3 siblings, 1 reply; 8+ messages in thread
From: Florian Fainelli @ 2020-09-01 22:59 UTC (permalink / raw)
  To: netdev
  Cc: Florian Fainelli, David S. Miller, Jakub Kicinski, Rob Herring,
	Andrew Lunn, Vivien Didelot,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	open list

Fetch the corresponding clock resource and enable/disable it during
suspend/resume if and only if we have no ports defined for Wake-on-LAN.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/dsa/bcm_sf2.c | 20 ++++++++++++++++++--
 drivers/net/dsa/bcm_sf2.h |  2 ++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
index bafddb35f3a9..b8fa0a46c5c9 100644
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
@@ -14,6 +14,7 @@
 #include <linux/phy_fixed.h>
 #include <linux/phylink.h>
 #include <linux/mii.h>
+#include <linux/clk.h>
 #include <linux/of.h>
 #include <linux/of_irq.h>
 #include <linux/of_address.h>
@@ -750,6 +751,9 @@ static int bcm_sf2_sw_suspend(struct dsa_switch *ds)
 			bcm_sf2_port_disable(ds, port);
 	}
 
+	if (!priv->wol_ports_mask)
+		clk_disable_unprepare(priv->clk);
+
 	return 0;
 }
 
@@ -758,6 +762,9 @@ static int bcm_sf2_sw_resume(struct dsa_switch *ds)
 	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
 	int ret;
 
+	if (!priv->wol_ports_mask)
+		clk_prepare_enable(priv->clk);
+
 	ret = bcm_sf2_sw_rst(priv);
 	if (ret) {
 		pr_err("%s: failed to software reset switch\n", __func__);
@@ -1189,10 +1196,16 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
 		base++;
 	}
 
+	priv->clk = devm_clk_get_optional(&pdev->dev, "sw_switch");
+	if (IS_ERR(priv->clk))
+		return PTR_ERR(priv->clk);
+
+	clk_prepare_enable(priv->clk);
+
 	ret = bcm_sf2_sw_rst(priv);
 	if (ret) {
 		pr_err("unable to software reset switch: %d\n", ret);
-		return ret;
+		goto out_clk;
 	}
 
 	bcm_sf2_gphy_enable_set(priv->dev->ds, true);
@@ -1200,7 +1213,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
 	ret = bcm_sf2_mdio_register(ds);
 	if (ret) {
 		pr_err("failed to register MDIO bus\n");
-		return ret;
+		goto out_clk;
 	}
 
 	bcm_sf2_gphy_enable_set(priv->dev->ds, false);
@@ -1267,6 +1280,8 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
 
 out_mdio:
 	bcm_sf2_mdio_unregister(priv);
+out_clk:
+	clk_disable_unprepare(priv->clk);
 	return ret;
 }
 
@@ -1280,6 +1295,7 @@ static int bcm_sf2_sw_remove(struct platform_device *pdev)
 	dsa_unregister_switch(priv->dev->ds);
 	bcm_sf2_cfp_exit(priv->dev->ds);
 	bcm_sf2_mdio_unregister(priv);
+	clk_disable_unprepare(priv->clk);
 	if (priv->type == BCM7278_DEVICE_ID && !IS_ERR(priv->rcdev))
 		reset_control_assert(priv->rcdev);
 
diff --git a/drivers/net/dsa/bcm_sf2.h b/drivers/net/dsa/bcm_sf2.h
index de386dd96d66..6dd69922e3f6 100644
--- a/drivers/net/dsa/bcm_sf2.h
+++ b/drivers/net/dsa/bcm_sf2.h
@@ -93,6 +93,8 @@ struct bcm_sf2_priv {
 	/* Mask of ports enabled for Wake-on-LAN */
 	u32				wol_ports_mask;
 
+	struct clk			*clk;
+
 	/* MoCA port location */
 	int				moca_port;
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH net-next 3/3] net: dsa: bcm_sf2: recalculate switch clock rate based on ports
  2020-09-01 22:59 [PATCH net-next 0/3] net: dsa: bcm_sf2: Clock support Florian Fainelli
  2020-09-01 22:59 ` [PATCH net-next 1/3] dt-bindings: net: Document Broadcom SF2 switch clocks Florian Fainelli
  2020-09-01 22:59 ` [PATCH net-next 2/3] net: dsa: bcm_sf2: request and handle clocks Florian Fainelli
@ 2020-09-01 22:59 ` Florian Fainelli
  2020-09-02 12:44   ` Andrew Lunn
  2020-09-03 22:08 ` [PATCH net-next 0/3] net: dsa: bcm_sf2: Clock support David Miller
  3 siblings, 1 reply; 8+ messages in thread
From: Florian Fainelli @ 2020-09-01 22:59 UTC (permalink / raw)
  To: netdev
  Cc: Florian Fainelli, David S. Miller, Jakub Kicinski, Rob Herring,
	Andrew Lunn, Vivien Didelot,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	open list

Whenever a port gets enabled/disabled, recalcultate the required switch
clock rate to make sure it always gets set to the expected rate
targeting our switch use case. This is only done for the BCM7445 switch
as there is no clocking profile available for BCM7278.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/dsa/bcm_sf2.c | 68 +++++++++++++++++++++++++++++++++++++--
 drivers/net/dsa/bcm_sf2.h |  2 ++
 2 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
index b8fa0a46c5c9..1c7fbb6f0447 100644
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
@@ -32,6 +32,49 @@
 #include "b53/b53_priv.h"
 #include "b53/b53_regs.h"
 
+/* Return the number of active ports, not counting the IMP (CPU) port */
+static unsigned int bcm_sf2_num_active_ports(struct dsa_switch *ds)
+{
+	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
+	unsigned int port, count = 0;
+
+	for (port = 0; port < ARRAY_SIZE(priv->port_sts); port++) {
+		if (dsa_is_cpu_port(ds, port))
+			continue;
+		if (priv->port_sts[port].enabled)
+			count++;
+	}
+
+	return count;
+}
+
+static void bcm_sf2_recalc_clock(struct dsa_switch *ds)
+{
+	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
+	unsigned long new_rate;
+	unsigned int ports_active;
+	/* Frequenty in Mhz */
+	const unsigned long rate_table[] = {
+		59220000,
+		60820000,
+		62500000,
+		62500000,
+	};
+
+	ports_active = bcm_sf2_num_active_ports(ds);
+	if (ports_active == 0 || !priv->clk_mdiv)
+		return;
+
+	/* If we overflow our table, just use the recommended operational
+	 * frequency
+	 */
+	if (ports_active > ARRAY_SIZE(rate_table))
+		new_rate = 90000000;
+	else
+		new_rate = rate_table[ports_active - 1];
+	clk_set_rate(priv->clk_mdiv, new_rate);
+}
+
 static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port)
 {
 	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
@@ -83,6 +126,8 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port)
 		reg &= ~(RX_DIS | TX_DIS);
 		core_writel(priv, reg, CORE_G_PCTL_PORT(port));
 	}
+
+	priv->port_sts[port].enabled = true;
 }
 
 static void bcm_sf2_gphy_enable_set(struct dsa_switch *ds, bool enable)
@@ -168,6 +213,10 @@ static int bcm_sf2_port_setup(struct dsa_switch *ds, int port,
 	if (!dsa_is_user_port(ds, port))
 		return 0;
 
+	priv->port_sts[port].enabled = true;
+
+	bcm_sf2_recalc_clock(ds);
+
 	/* Clear the memory power down */
 	reg = core_readl(priv, CORE_MEM_PSM_VDD_CTRL);
 	reg &= ~P_TXQ_PSM_VDD(port);
@@ -261,6 +310,10 @@ static void bcm_sf2_port_disable(struct dsa_switch *ds, int port)
 	reg = core_readl(priv, CORE_MEM_PSM_VDD_CTRL);
 	reg |= P_TXQ_PSM_VDD(port);
 	core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL);
+
+	priv->port_sts[port].enabled = false;
+
+	bcm_sf2_recalc_clock(ds);
 }
 
 
@@ -1202,10 +1255,18 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
 
 	clk_prepare_enable(priv->clk);
 
+	priv->clk_mdiv = devm_clk_get_optional(&pdev->dev, "sw_switch_mdiv");
+	if (IS_ERR(priv->clk_mdiv)) {
+		ret = PTR_ERR(priv->clk_mdiv);
+		goto out_clk;
+	}
+
+	clk_prepare_enable(priv->clk_mdiv);
+
 	ret = bcm_sf2_sw_rst(priv);
 	if (ret) {
 		pr_err("unable to software reset switch: %d\n", ret);
-		goto out_clk;
+		goto out_clk_mdiv;
 	}
 
 	bcm_sf2_gphy_enable_set(priv->dev->ds, true);
@@ -1213,7 +1274,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
 	ret = bcm_sf2_mdio_register(ds);
 	if (ret) {
 		pr_err("failed to register MDIO bus\n");
-		goto out_clk;
+		goto out_clk_mdiv;
 	}
 
 	bcm_sf2_gphy_enable_set(priv->dev->ds, false);
@@ -1280,6 +1341,8 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
 
 out_mdio:
 	bcm_sf2_mdio_unregister(priv);
+out_clk_mdiv:
+	clk_disable_unprepare(priv->clk_mdiv);
 out_clk:
 	clk_disable_unprepare(priv->clk);
 	return ret;
@@ -1295,6 +1358,7 @@ static int bcm_sf2_sw_remove(struct platform_device *pdev)
 	dsa_unregister_switch(priv->dev->ds);
 	bcm_sf2_cfp_exit(priv->dev->ds);
 	bcm_sf2_mdio_unregister(priv);
+	clk_disable_unprepare(priv->clk_mdiv);
 	clk_disable_unprepare(priv->clk);
 	if (priv->type == BCM7278_DEVICE_ID && !IS_ERR(priv->rcdev))
 		reset_control_assert(priv->rcdev);
diff --git a/drivers/net/dsa/bcm_sf2.h b/drivers/net/dsa/bcm_sf2.h
index 6dd69922e3f6..1ed901a68536 100644
--- a/drivers/net/dsa/bcm_sf2.h
+++ b/drivers/net/dsa/bcm_sf2.h
@@ -45,6 +45,7 @@ struct bcm_sf2_hw_params {
 
 struct bcm_sf2_port_status {
 	unsigned int link;
+	bool enabled;
 };
 
 struct bcm_sf2_cfp_priv {
@@ -94,6 +95,7 @@ struct bcm_sf2_priv {
 	u32				wol_ports_mask;
 
 	struct clk			*clk;
+	struct clk			*clk_mdiv;
 
 	/* MoCA port location */
 	int				moca_port;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH net-next 1/3] dt-bindings: net: Document Broadcom SF2 switch clocks
  2020-09-01 22:59 ` [PATCH net-next 1/3] dt-bindings: net: Document Broadcom SF2 switch clocks Florian Fainelli
@ 2020-09-02 12:43   ` Andrew Lunn
  0 siblings, 0 replies; 8+ messages in thread
From: Andrew Lunn @ 2020-09-02 12:43 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: netdev, David S. Miller, Jakub Kicinski, Rob Herring,
	Vivien Didelot,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	open list

On Tue, Sep 01, 2020 at 03:59:11PM -0700, Florian Fainelli wrote:
> Describe the two possible clocks feeding into the Broadcom SF2
> integrated Ethernet switch. BCM7445 systems have two clocks, one for the
> main switch core clock, and another for controlling the switch clock
> divider whereas BCM7278 systems only have the first kind.
> 
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
>  .../devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt   | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt b/Documentation/devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt
> index 88b57b0ca1f4..97ca62b0e14d 100644
> --- a/Documentation/devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt
> +++ b/Documentation/devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt
> @@ -50,6 +50,13 @@ Optional properties:
>  - reset-names: If the "reset" property is specified, this property should have
>    the value "switch" to denote the switch reset line.
>  
> +- clocks: when provided, the first phandle is to the switch's main clock and
> +  is valid for both BCM7445 and BCM7278. The second phandle is only applicable
> +  to BCM7445 and is to support dividing the switch core clock.
> +
> +- clock-names: when provided, the first phandle must be "sw_switch", and the
> +  second must be named "sw_switch_mdiv".

Hi Florian

Since you look clocks up by name, i don't think the order matters.

Otherwise:

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net-next 2/3] net: dsa: bcm_sf2: request and handle clocks
  2020-09-01 22:59 ` [PATCH net-next 2/3] net: dsa: bcm_sf2: request and handle clocks Florian Fainelli
@ 2020-09-02 12:43   ` Andrew Lunn
  0 siblings, 0 replies; 8+ messages in thread
From: Andrew Lunn @ 2020-09-02 12:43 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: netdev, David S. Miller, Jakub Kicinski, Rob Herring,
	Vivien Didelot,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	open list

On Tue, Sep 01, 2020 at 03:59:12PM -0700, Florian Fainelli wrote:
> Fetch the corresponding clock resource and enable/disable it during
> suspend/resume if and only if we have no ports defined for Wake-on-LAN.
> 
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net-next 3/3] net: dsa: bcm_sf2: recalculate switch clock rate based on ports
  2020-09-01 22:59 ` [PATCH net-next 3/3] net: dsa: bcm_sf2: recalculate switch clock rate based on ports Florian Fainelli
@ 2020-09-02 12:44   ` Andrew Lunn
  0 siblings, 0 replies; 8+ messages in thread
From: Andrew Lunn @ 2020-09-02 12:44 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: netdev, David S. Miller, Jakub Kicinski, Rob Herring,
	Vivien Didelot,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	open list

On Tue, Sep 01, 2020 at 03:59:13PM -0700, Florian Fainelli wrote:
> Whenever a port gets enabled/disabled, recalcultate the required switch
> clock rate to make sure it always gets set to the expected rate
> targeting our switch use case. This is only done for the BCM7445 switch
> as there is no clocking profile available for BCM7278.
> 
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net-next 0/3] net: dsa: bcm_sf2: Clock support
  2020-09-01 22:59 [PATCH net-next 0/3] net: dsa: bcm_sf2: Clock support Florian Fainelli
                   ` (2 preceding siblings ...)
  2020-09-01 22:59 ` [PATCH net-next 3/3] net: dsa: bcm_sf2: recalculate switch clock rate based on ports Florian Fainelli
@ 2020-09-03 22:08 ` David Miller
  3 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2020-09-03 22:08 UTC (permalink / raw)
  To: f.fainelli
  Cc: netdev, kuba, robh+dt, andrew, vivien.didelot, devicetree, linux-kernel

From: Florian Fainelli <f.fainelli@gmail.com>
Date: Tue,  1 Sep 2020 15:59:10 -0700

> This patch series adds support for controlling the SF2 switch core and
> divider clock (where applicable).

Series applied, thank you.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-09-03 22:08 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-01 22:59 [PATCH net-next 0/3] net: dsa: bcm_sf2: Clock support Florian Fainelli
2020-09-01 22:59 ` [PATCH net-next 1/3] dt-bindings: net: Document Broadcom SF2 switch clocks Florian Fainelli
2020-09-02 12:43   ` Andrew Lunn
2020-09-01 22:59 ` [PATCH net-next 2/3] net: dsa: bcm_sf2: request and handle clocks Florian Fainelli
2020-09-02 12:43   ` Andrew Lunn
2020-09-01 22:59 ` [PATCH net-next 3/3] net: dsa: bcm_sf2: recalculate switch clock rate based on ports Florian Fainelli
2020-09-02 12:44   ` Andrew Lunn
2020-09-03 22:08 ` [PATCH net-next 0/3] net: dsa: bcm_sf2: Clock support David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).