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:
commit
2ee6ad1ddf
|
@ -44,6 +44,12 @@ Optional properties:
|
|||
Admission Control Block supports reporting the number of packets in-flight in a
|
||||
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:
|
||||
|
||||
Optional properties:
|
||||
|
|
|
@ -350,6 +350,18 @@ static int bcm_sf2_sw_rst(struct bcm_sf2_priv *priv)
|
|||
{
|
||||
unsigned int timeout = 1000;
|
||||
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 |= 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->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
|
||||
* provide an indication of what kind of device we are for
|
||||
* b53_common to work with
|
||||
|
@ -1224,6 +1241,8 @@ static int bcm_sf2_sw_remove(struct platform_device *pdev)
|
|||
/* Disable all ports and interrupts */
|
||||
bcm_sf2_sw_suspend(priv->dev->ds);
|
||||
bcm_sf2_mdio_unregister(priv);
|
||||
if (priv->type == BCM7278_DEVICE_ID && !IS_ERR(priv->rcdev))
|
||||
reset_control_assert(priv->rcdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/reset.h>
|
||||
|
||||
#include <net/dsa.h>
|
||||
|
||||
|
@ -64,6 +65,8 @@ struct bcm_sf2_priv {
|
|||
void __iomem *fcb;
|
||||
void __iomem *acb;
|
||||
|
||||
struct reset_control *rcdev;
|
||||
|
||||
/* Register offsets indirection tables */
|
||||
u32 type;
|
||||
const u16 *reg_offsets;
|
||||
|
|
Loading…
Reference in New Issue