Merge branch 'net-dsa-bcm_sf2-Add-support-for-optional-reset-controller-line'

Florian Fainelli says:

====================
net: dsa: bcm_sf2: Add support for optional reset controller line

This patch series definest the optional reset controller line for the
BCM7445/BCM7278 integrated Ethernet switches and updates the driver to
drive that reset line in lieu of the internal watchdog based reset since
it does not work on BCM7278.

Changes in v2:
- make the reset_control_assert() conditional to BCM7278 in the remove
  function as well
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2019-11-05 18:06:38 -08:00
commit 2ee6ad1ddf
3 changed files with 28 additions and 0 deletions

View File

@ -44,6 +44,12 @@ Optional properties:
Admission Control Block supports reporting the number of packets in-flight in a Admission Control Block supports reporting the number of packets in-flight in a
switch queue switch queue
- resets: a single phandle and reset identifier pair. See
Documentation/devicetree/binding/reset/reset.txt for details.
- reset-names: If the "reset" property is specified, this property should have
the value "switch" to denote the switch reset line.
Port subnodes: Port subnodes:
Optional properties: Optional properties:

View File

@ -350,6 +350,18 @@ static int bcm_sf2_sw_rst(struct bcm_sf2_priv *priv)
{ {
unsigned int timeout = 1000; unsigned int timeout = 1000;
u32 reg; u32 reg;
int ret;
/* The watchdog reset does not work on 7278, we need to hit the
* "external" reset line through the reset controller.
*/
if (priv->type == BCM7278_DEVICE_ID && !IS_ERR(priv->rcdev)) {
ret = reset_control_assert(priv->rcdev);
if (ret)
return ret;
return reset_control_deassert(priv->rcdev);
}
reg = core_readl(priv, CORE_WATCHDOG_CTRL); reg = core_readl(priv, CORE_WATCHDOG_CTRL);
reg |= SOFTWARE_RESET | EN_CHIP_RST | EN_SW_RESET; reg |= SOFTWARE_RESET | EN_CHIP_RST | EN_SW_RESET;
@ -1092,6 +1104,11 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
priv->core_reg_align = data->core_reg_align; priv->core_reg_align = data->core_reg_align;
priv->num_cfp_rules = data->num_cfp_rules; priv->num_cfp_rules = data->num_cfp_rules;
priv->rcdev = devm_reset_control_get_optional_exclusive(&pdev->dev,
"switch");
if (PTR_ERR(priv->rcdev) == -EPROBE_DEFER)
return PTR_ERR(priv->rcdev);
/* Auto-detection using standard registers will not work, so /* Auto-detection using standard registers will not work, so
* provide an indication of what kind of device we are for * provide an indication of what kind of device we are for
* b53_common to work with * b53_common to work with
@ -1224,6 +1241,8 @@ static int bcm_sf2_sw_remove(struct platform_device *pdev)
/* Disable all ports and interrupts */ /* Disable all ports and interrupts */
bcm_sf2_sw_suspend(priv->dev->ds); bcm_sf2_sw_suspend(priv->dev->ds);
bcm_sf2_mdio_unregister(priv); bcm_sf2_mdio_unregister(priv);
if (priv->type == BCM7278_DEVICE_ID && !IS_ERR(priv->rcdev))
reset_control_assert(priv->rcdev);
return 0; return 0;
} }

View File

@ -18,6 +18,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include <linux/reset.h>
#include <net/dsa.h> #include <net/dsa.h>
@ -64,6 +65,8 @@ struct bcm_sf2_priv {
void __iomem *fcb; void __iomem *fcb;
void __iomem *acb; void __iomem *acb;
struct reset_control *rcdev;
/* Register offsets indirection tables */ /* Register offsets indirection tables */
u32 type; u32 type;
const u16 *reg_offsets; const u16 *reg_offsets;