Lines Matching +full:force +full:- +full:internal +full:- +full:phy

1 // SPDX-License-Identifier: GPL-2.0-or-later
13 #include <linux/phy.h>
37 switch (priv->type) { in bcm_sf2_reg_rgmii_cntrl()
71 for (port = 0; port < ds->num_ports; port++) { in bcm_sf2_num_active_ports()
74 if (priv->port_sts[port].enabled) in bcm_sf2_num_active_ports()
95 if (ports_active == 0 || !priv->clk_mdiv) in bcm_sf2_recalc_clock()
104 new_rate = rate_table[ports_active - 1]; in bcm_sf2_recalc_clock()
105 clk_set_rate(priv->clk_mdiv, new_rate); in bcm_sf2_recalc_clock()
138 if (priv->type == BCM4908_DEVICE_ID || in bcm_sf2_imp_setup()
139 priv->type == BCM7445_DEVICE_ID) in bcm_sf2_imp_setup()
144 /* Force link status for IMP port */ in bcm_sf2_imp_setup()
147 if (priv->type == BCM4908_DEVICE_ID) in bcm_sf2_imp_setup()
164 priv->port_sts[port].enabled = true; in bcm_sf2_imp_setup()
188 /* Use PHY-driven LED signaling */ in bcm_sf2_gphy_enable_set()
241 struct phy_device *phy) in bcm_sf2_port_setup() argument
250 priv->port_sts[port].enabled = true; in bcm_sf2_port_setup()
260 if (priv->brcm_tag_mask & BIT(port)) in bcm_sf2_port_setup()
271 /* Re-enable the GPHY and re-apply workarounds */ in bcm_sf2_port_setup()
272 if (priv->int_phy_mask & 1 << port && priv->hw_params.num_gphy == 1) { in bcm_sf2_port_setup()
274 if (phy) { in bcm_sf2_port_setup()
275 /* if phy_stop() has been called before, phy in bcm_sf2_port_setup()
281 * the phy manually here, we need to reset the in bcm_sf2_port_setup()
284 phy->state = PHY_READY; in bcm_sf2_port_setup()
285 phy_init_hw(phy); in bcm_sf2_port_setup()
290 if (port == priv->moca_port) in bcm_sf2_port_setup()
293 /* Set per-queue pause threshold to 32 */ in bcm_sf2_port_setup()
306 return b53_enable_port(ds, port, phy); in bcm_sf2_port_setup()
315 if (priv->wol_ports_mask & (1 << port)) { in bcm_sf2_port_disable()
322 if (port == priv->moca_port) in bcm_sf2_port_disable()
325 if (priv->int_phy_mask & 1 << port && priv->hw_params.num_gphy == 1) in bcm_sf2_port_disable()
335 priv->port_sts[port].enabled = false; in bcm_sf2_port_disable()
374 struct bcm_sf2_priv *priv = bus->priv; in bcm_sf2_sw_mdio_read()
376 /* Intercept reads from Broadcom pseudo-PHY address, else, send in bcm_sf2_sw_mdio_read()
379 if (addr == BRCM_PSEUDO_PHY_ADDR && priv->indir_phy_mask & BIT(addr)) in bcm_sf2_sw_mdio_read()
382 return mdiobus_read_nested(priv->master_mii_bus, addr, regnum); in bcm_sf2_sw_mdio_read()
388 struct bcm_sf2_priv *priv = bus->priv; in bcm_sf2_sw_mdio_write()
390 /* Intercept writes to the Broadcom pseudo-PHY address, else, in bcm_sf2_sw_mdio_write()
393 if (addr == BRCM_PSEUDO_PHY_ADDR && priv->indir_phy_mask & BIT(addr)) in bcm_sf2_sw_mdio_write()
396 return mdiobus_write_nested(priv->master_mii_bus, addr, in bcm_sf2_sw_mdio_write()
405 priv->irq0_stat = intrl2_0_readl(priv, INTRL2_CPU_STATUS) & in bcm_sf2_switch_0_isr()
406 ~priv->irq0_mask; in bcm_sf2_switch_0_isr()
407 intrl2_0_writel(priv, priv->irq0_stat, INTRL2_CPU_CLEAR); in bcm_sf2_switch_0_isr()
417 priv->irq1_stat = intrl2_1_readl(priv, INTRL2_CPU_STATUS) & in bcm_sf2_switch_1_isr()
418 ~priv->irq1_mask; in bcm_sf2_switch_1_isr()
419 intrl2_1_writel(priv, priv->irq1_stat, INTRL2_CPU_CLEAR); in bcm_sf2_switch_1_isr()
421 if (priv->irq1_stat & P_LINK_UP_IRQ(P7_IRQ_OFF)) { in bcm_sf2_switch_1_isr()
422 priv->port_sts[7].link = true; in bcm_sf2_switch_1_isr()
425 if (priv->irq1_stat & P_LINK_DOWN_IRQ(P7_IRQ_OFF)) { in bcm_sf2_switch_1_isr()
426 priv->port_sts[7].link = false; in bcm_sf2_switch_1_isr()
442 if (priv->type == BCM7278_DEVICE_ID) { in bcm_sf2_sw_rst()
443 ret = reset_control_assert(priv->rcdev); in bcm_sf2_sw_rst()
447 return reset_control_deassert(priv->rcdev); in bcm_sf2_sw_rst()
460 } while (timeout-- > 0); in bcm_sf2_sw_rst()
463 return -ETIMEDOUT; in bcm_sf2_sw_rst()
470 struct device *dev = priv->dev->ds->dev; in bcm_sf2_crossbar_setup()
476 mask = BIT(priv->num_crossbar_int_ports) - 1; in bcm_sf2_crossbar_setup()
479 switch (priv->type) { in bcm_sf2_crossbar_setup()
481 shift = CROSSBAR_BCM4908_INT_P7 * priv->num_crossbar_int_ports; in bcm_sf2_crossbar_setup()
485 else if (priv->int_phy_mask & BIT(7)) in bcm_sf2_crossbar_setup()
487 else if (phy_interface_mode_is_rgmii(priv->port_sts[7].mode)) in bcm_sf2_crossbar_setup()
498 for (i = 0; i < priv->num_crossbar_int_ports; i++) { in bcm_sf2_crossbar_setup()
499 shift = i * priv->num_crossbar_int_ports; in bcm_sf2_crossbar_setup()
501 dev_dbg(dev, "crossbar int port #%d - ext port #%d\n", i, in bcm_sf2_crossbar_setup()
517 struct device *dev = priv->dev->ds->dev; in bcm_sf2_identify_ports()
524 priv->moca_port = -1; in bcm_sf2_identify_ports()
535 port_st = &priv->port_sts[port_num]; in bcm_sf2_identify_ports()
537 /* Internal PHYs get assigned a specific 'phy-mode' property in bcm_sf2_identify_ports()
538 * value: "internal" to help flag them before MDIO probing in bcm_sf2_identify_ports()
542 err = of_get_phy_mode(port, &port_st->mode); in bcm_sf2_identify_ports()
546 if (port_st->mode == PHY_INTERFACE_MODE_INTERNAL) in bcm_sf2_identify_ports()
547 priv->int_phy_mask |= 1 << port_num; in bcm_sf2_identify_ports()
549 if (port_st->mode == PHY_INTERFACE_MODE_MOCA) in bcm_sf2_identify_ports()
550 priv->moca_port = port_num; in bcm_sf2_identify_ports()
552 if (of_property_read_bool(port, "brcm,use-bcm-hdr")) in bcm_sf2_identify_ports()
553 priv->brcm_tag_mask |= 1 << port_num; in bcm_sf2_identify_ports()
559 if (port_num == 5 && priv->type == BCM7278_DEVICE_ID) { in bcm_sf2_identify_ports()
577 dn = of_find_compatible_node(NULL, NULL, "brcm,unimac-mdio"); in bcm_sf2_mdio_register()
578 priv->master_mii_bus = of_mdio_find_bus(dn); in bcm_sf2_mdio_register()
579 if (!priv->master_mii_bus) { in bcm_sf2_mdio_register()
581 return -EPROBE_DEFER; in bcm_sf2_mdio_register()
584 get_device(&priv->master_mii_bus->dev); in bcm_sf2_mdio_register()
585 priv->master_mii_dn = dn; in bcm_sf2_mdio_register()
587 priv->slave_mii_bus = devm_mdiobus_alloc(ds->dev); in bcm_sf2_mdio_register()
588 if (!priv->slave_mii_bus) { in bcm_sf2_mdio_register()
590 return -ENOMEM; in bcm_sf2_mdio_register()
593 priv->slave_mii_bus->priv = priv; in bcm_sf2_mdio_register()
594 priv->slave_mii_bus->name = "sf2 slave mii"; in bcm_sf2_mdio_register()
595 priv->slave_mii_bus->read = bcm_sf2_sw_mdio_read; in bcm_sf2_mdio_register()
596 priv->slave_mii_bus->write = bcm_sf2_sw_mdio_write; in bcm_sf2_mdio_register()
597 snprintf(priv->slave_mii_bus->id, MII_BUS_ID_SIZE, "sf2-%d", in bcm_sf2_mdio_register()
599 priv->slave_mii_bus->dev.of_node = dn; in bcm_sf2_mdio_register()
601 /* Include the pseudo-PHY address to divert reads towards our in bcm_sf2_mdio_register()
603 * disconnects the internal switch pseudo-PHY such that we can use the in bcm_sf2_mdio_register()
606 * Here we flag the pseudo PHY as needing special treatment and would in bcm_sf2_mdio_register()
607 * otherwise make all other PHY read/writes go to the master MDIO bus in bcm_sf2_mdio_register()
608 * controller that comes with this switch backed by the "mdio-unimac" in bcm_sf2_mdio_register()
612 priv->indir_phy_mask |= (1 << BRCM_PSEUDO_PHY_ADDR) | (1 << 0); in bcm_sf2_mdio_register()
614 priv->indir_phy_mask = 0; in bcm_sf2_mdio_register()
616 ds->phys_mii_mask = priv->indir_phy_mask; in bcm_sf2_mdio_register()
617 ds->slave_mii_bus = priv->slave_mii_bus; in bcm_sf2_mdio_register()
618 priv->slave_mii_bus->parent = ds->dev->parent; in bcm_sf2_mdio_register()
619 priv->slave_mii_bus->phy_mask = ~priv->indir_phy_mask; in bcm_sf2_mdio_register()
623 * unregister the existing PHY device that was already registered. in bcm_sf2_mdio_register()
630 if (!(priv->indir_phy_mask & BIT(reg))) in bcm_sf2_mdio_register()
646 err = mdiobus_register(priv->slave_mii_bus); in bcm_sf2_mdio_register()
655 mdiobus_unregister(priv->slave_mii_bus); in bcm_sf2_mdio_unregister()
656 of_node_put(priv->master_mii_dn); in bcm_sf2_mdio_unregister()
663 /* The BCM7xxx PHY driver expects to find the integrated PHY revision in bcm_sf2_sw_get_phy_flags()
667 if (priv->int_phy_mask & BIT(port)) in bcm_sf2_sw_get_phy_flags()
668 return priv->hw_params.gphy_rev; in bcm_sf2_sw_get_phy_flags()
680 if (!phy_interface_mode_is_rgmii(state->interface) && in bcm_sf2_sw_validate()
681 state->interface != PHY_INTERFACE_MODE_MII && in bcm_sf2_sw_validate()
682 state->interface != PHY_INTERFACE_MODE_REVMII && in bcm_sf2_sw_validate()
683 state->interface != PHY_INTERFACE_MODE_GMII && in bcm_sf2_sw_validate()
684 state->interface != PHY_INTERFACE_MODE_INTERNAL && in bcm_sf2_sw_validate()
685 state->interface != PHY_INTERFACE_MODE_MOCA) { in bcm_sf2_sw_validate()
688 dev_err(ds->dev, in bcm_sf2_sw_validate()
690 state->interface, port); in bcm_sf2_sw_validate()
703 if (state->interface != PHY_INTERFACE_MODE_MII && in bcm_sf2_sw_validate()
704 state->interface != PHY_INTERFACE_MODE_REVMII) { in bcm_sf2_sw_validate()
716 bitmap_and(state->advertising, state->advertising, mask, in bcm_sf2_sw_validate()
732 switch (state->interface) { in bcm_sf2_sw_mac_config()
746 /* Nothing required for all other PHYs: internal and MoCA */ in bcm_sf2_sw_mac_config()
797 if (priv->type == BCM4908_DEVICE_ID || in bcm_sf2_sw_mac_link_down()
798 priv->type == BCM7445_DEVICE_ID) in bcm_sf2_sw_mac_link_down()
819 struct ethtool_eee *p = &priv->dev->ports[port].eee; in bcm_sf2_sw_mac_link_up()
827 if (priv->type == BCM4908_DEVICE_ID || in bcm_sf2_sw_mac_link_up()
828 priv->type == BCM7445_DEVICE_ID) in bcm_sf2_sw_mac_link_up()
866 p->eee_enabled = b53_eee_init(ds, port, phydev); in bcm_sf2_sw_mac_link_up()
874 status->link = false; in bcm_sf2_sw_fixed_state()
877 * which means that we need to force the link at the port override in bcm_sf2_sw_fixed_state()
881 * For the other ports, we just force the link status, since this is in bcm_sf2_sw_fixed_state()
882 * a fixed PHY device. in bcm_sf2_sw_fixed_state()
884 if (port == priv->moca_port) { in bcm_sf2_sw_fixed_state()
885 status->link = priv->port_sts[port].link; in bcm_sf2_sw_fixed_state()
886 /* For MoCA interfaces, also force a link down notification in bcm_sf2_sw_fixed_state()
887 * since some version of the user-space daemon (mocad) use in bcm_sf2_sw_fixed_state()
888 * cmd->autoneg to force the link, which messes up the PHY in bcm_sf2_sw_fixed_state()
891 if (!status->link) in bcm_sf2_sw_fixed_state()
892 netif_carrier_off(dsa_to_port(ds, port)->slave); in bcm_sf2_sw_fixed_state()
893 status->duplex = DUPLEX_FULL; in bcm_sf2_sw_fixed_state()
895 status->link = true; in bcm_sf2_sw_fixed_state()
924 for (port = 0; port < ds->num_ports; port++) { in bcm_sf2_sw_suspend()
929 if (!priv->wol_ports_mask) in bcm_sf2_sw_suspend()
930 clk_disable_unprepare(priv->clk); in bcm_sf2_sw_suspend()
940 if (!priv->wol_ports_mask) in bcm_sf2_sw_resume()
941 clk_prepare_enable(priv->clk); in bcm_sf2_sw_resume()
955 if (priv->hw_params.num_gphy == 1) in bcm_sf2_sw_resume()
958 ds->ops->setup(ds); in bcm_sf2_sw_resume()
966 struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master; in bcm_sf2_sw_get_wol()
971 if (p->ethtool_ops->get_wol) in bcm_sf2_sw_get_wol()
972 p->ethtool_ops->get_wol(p, &pwol); in bcm_sf2_sw_get_wol()
975 wol->supported = pwol.supported; in bcm_sf2_sw_get_wol()
976 memset(&wol->sopass, 0, sizeof(wol->sopass)); in bcm_sf2_sw_get_wol()
979 memcpy(&wol->sopass, pwol.sopass, sizeof(wol->sopass)); in bcm_sf2_sw_get_wol()
981 if (priv->wol_ports_mask & (1 << port)) in bcm_sf2_sw_get_wol()
982 wol->wolopts = pwol.wolopts; in bcm_sf2_sw_get_wol()
984 wol->wolopts = 0; in bcm_sf2_sw_get_wol()
990 struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master; in bcm_sf2_sw_set_wol()
992 s8 cpu_port = dsa_to_port(ds, port)->cpu_dp->index; in bcm_sf2_sw_set_wol()
995 if (p->ethtool_ops->get_wol) in bcm_sf2_sw_set_wol()
996 p->ethtool_ops->get_wol(p, &pwol); in bcm_sf2_sw_set_wol()
997 if (wol->wolopts & ~pwol.supported) in bcm_sf2_sw_set_wol()
998 return -EINVAL; in bcm_sf2_sw_set_wol()
1000 if (wol->wolopts) in bcm_sf2_sw_set_wol()
1001 priv->wol_ports_mask |= (1 << port); in bcm_sf2_sw_set_wol()
1003 priv->wol_ports_mask &= ~(1 << port); in bcm_sf2_sw_set_wol()
1009 if (priv->wol_ports_mask && priv->wol_ports_mask != (1 << cpu_port)) in bcm_sf2_sw_set_wol()
1010 priv->wol_ports_mask |= (1 << cpu_port); in bcm_sf2_sw_set_wol()
1012 priv->wol_ports_mask &= ~(1 << cpu_port); in bcm_sf2_sw_set_wol()
1014 return p->ethtool_ops->set_wol(p, wol); in bcm_sf2_sw_set_wol()
1023 for (port = 0; port < priv->hw_params.num_ports; port++) { in bcm_sf2_sw_setup()
1046 * bus-glue understands.
1053 struct bcm_sf2_priv *priv = dev->priv; in bcm_sf2_core_read8()
1063 struct bcm_sf2_priv *priv = dev->priv; in bcm_sf2_core_read16()
1073 struct bcm_sf2_priv *priv = dev->priv; in bcm_sf2_core_read32()
1083 struct bcm_sf2_priv *priv = dev->priv; in bcm_sf2_core_read64()
1093 struct bcm_sf2_priv *priv = dev->priv; in bcm_sf2_core_write8()
1103 struct bcm_sf2_priv *priv = dev->priv; in bcm_sf2_core_write16()
1113 struct bcm_sf2_priv *priv = dev->priv; in bcm_sf2_core_write32()
1123 struct bcm_sf2_priv *priv = dev->priv; in bcm_sf2_core_write64()
1296 { .compatible = "brcm,bcm4908-switch",
1299 { .compatible = "brcm,bcm7445-switch-v4.0",
1302 { .compatible = "brcm,bcm7278-switch-v4.0",
1305 { .compatible = "brcm,bcm7278-switch-v4.8",
1315 struct device_node *dn = pdev->dev.of_node; in bcm_sf2_sw_probe()
1329 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in bcm_sf2_sw_probe()
1331 return -ENOMEM; in bcm_sf2_sw_probe()
1333 ops = devm_kzalloc(&pdev->dev, sizeof(*ops), GFP_KERNEL); in bcm_sf2_sw_probe()
1335 return -ENOMEM; in bcm_sf2_sw_probe()
1337 dev = b53_switch_alloc(&pdev->dev, &bcm_sf2_io_ops, priv); in bcm_sf2_sw_probe()
1339 return -ENOMEM; in bcm_sf2_sw_probe()
1341 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); in bcm_sf2_sw_probe()
1343 return -ENOMEM; in bcm_sf2_sw_probe()
1346 if (!of_id || !of_id->data) in bcm_sf2_sw_probe()
1347 return -EINVAL; in bcm_sf2_sw_probe()
1349 data = of_id->data; in bcm_sf2_sw_probe()
1352 priv->type = data->type; in bcm_sf2_sw_probe()
1353 priv->reg_offsets = data->reg_offsets; in bcm_sf2_sw_probe()
1354 priv->core_reg_align = data->core_reg_align; in bcm_sf2_sw_probe()
1355 priv->num_cfp_rules = data->num_cfp_rules; in bcm_sf2_sw_probe()
1356 priv->num_crossbar_int_ports = data->num_crossbar_int_ports; in bcm_sf2_sw_probe()
1358 priv->rcdev = devm_reset_control_get_optional_exclusive(&pdev->dev, in bcm_sf2_sw_probe()
1360 if (IS_ERR(priv->rcdev)) in bcm_sf2_sw_probe()
1361 return PTR_ERR(priv->rcdev); in bcm_sf2_sw_probe()
1363 /* Auto-detection using standard registers will not work, so in bcm_sf2_sw_probe()
1367 pdata->chip_id = priv->type; in bcm_sf2_sw_probe()
1368 dev->pdata = pdata; in bcm_sf2_sw_probe()
1370 priv->dev = dev; in bcm_sf2_sw_probe()
1371 ds = dev->ds; in bcm_sf2_sw_probe()
1372 ds->ops = &bcm_sf2_ops; in bcm_sf2_sw_probe()
1375 ds->num_tx_queues = SF2_NUM_EGRESS_QUEUES; in bcm_sf2_sw_probe()
1377 dev_set_drvdata(&pdev->dev, priv); in bcm_sf2_sw_probe()
1379 spin_lock_init(&priv->indir_lock); in bcm_sf2_sw_probe()
1380 mutex_init(&priv->cfp.lock); in bcm_sf2_sw_probe()
1381 INIT_LIST_HEAD(&priv->cfp.rules_list); in bcm_sf2_sw_probe()
1386 set_bit(0, priv->cfp.used); in bcm_sf2_sw_probe()
1387 set_bit(0, priv->cfp.unique); in bcm_sf2_sw_probe()
1397 priv->irq0 = irq_of_parse_and_map(dn, 0); in bcm_sf2_sw_probe()
1398 priv->irq1 = irq_of_parse_and_map(dn, 1); in bcm_sf2_sw_probe()
1400 base = &priv->core; in bcm_sf2_sw_probe()
1410 priv->clk = devm_clk_get_optional(&pdev->dev, "sw_switch"); in bcm_sf2_sw_probe()
1411 if (IS_ERR(priv->clk)) in bcm_sf2_sw_probe()
1412 return PTR_ERR(priv->clk); in bcm_sf2_sw_probe()
1414 clk_prepare_enable(priv->clk); in bcm_sf2_sw_probe()
1416 priv->clk_mdiv = devm_clk_get_optional(&pdev->dev, "sw_switch_mdiv"); in bcm_sf2_sw_probe()
1417 if (IS_ERR(priv->clk_mdiv)) { in bcm_sf2_sw_probe()
1418 ret = PTR_ERR(priv->clk_mdiv); in bcm_sf2_sw_probe()
1422 clk_prepare_enable(priv->clk_mdiv); in bcm_sf2_sw_probe()
1432 bcm_sf2_gphy_enable_set(priv->dev->ds, true); in bcm_sf2_sw_probe()
1440 bcm_sf2_gphy_enable_set(priv->dev->ds, false); in bcm_sf2_sw_probe()
1451 ret = devm_request_irq(&pdev->dev, priv->irq0, bcm_sf2_switch_0_isr, 0, in bcm_sf2_sw_probe()
1458 ret = devm_request_irq(&pdev->dev, priv->irq1, bcm_sf2_switch_1_isr, 0, in bcm_sf2_sw_probe()
1473 priv->hw_params.num_ports = core_readl(priv, CORE_IMP0_PRT_ID) + 1; in bcm_sf2_sw_probe()
1474 if (priv->hw_params.num_ports > DSA_MAX_PORTS) in bcm_sf2_sw_probe()
1475 priv->hw_params.num_ports = DSA_MAX_PORTS; in bcm_sf2_sw_probe()
1478 if (of_property_read_u32(dn, "brcm,num-gphy", in bcm_sf2_sw_probe()
1479 &priv->hw_params.num_gphy)) in bcm_sf2_sw_probe()
1480 priv->hw_params.num_gphy = 1; in bcm_sf2_sw_probe()
1483 priv->hw_params.top_rev = (rev >> SWITCH_TOP_REV_SHIFT) & in bcm_sf2_sw_probe()
1485 priv->hw_params.core_rev = (rev & SF2_REV_MASK); in bcm_sf2_sw_probe()
1488 priv->hw_params.gphy_rev = rev & PHY_REVISION_MASK; in bcm_sf2_sw_probe()
1494 dev_info(&pdev->dev, in bcm_sf2_sw_probe()
1496 priv->hw_params.top_rev >> 8, priv->hw_params.top_rev & 0xff, in bcm_sf2_sw_probe()
1497 priv->hw_params.core_rev >> 8, priv->hw_params.core_rev & 0xff, in bcm_sf2_sw_probe()
1498 priv->irq0, priv->irq1); in bcm_sf2_sw_probe()
1505 clk_disable_unprepare(priv->clk_mdiv); in bcm_sf2_sw_probe()
1507 clk_disable_unprepare(priv->clk); in bcm_sf2_sw_probe()
1518 priv->wol_ports_mask = 0; in bcm_sf2_sw_remove()
1521 dsa_unregister_switch(priv->dev->ds); in bcm_sf2_sw_remove()
1522 bcm_sf2_cfp_exit(priv->dev->ds); in bcm_sf2_sw_remove()
1524 clk_disable_unprepare(priv->clk_mdiv); in bcm_sf2_sw_remove()
1525 clk_disable_unprepare(priv->clk); in bcm_sf2_sw_remove()
1526 if (priv->type == BCM7278_DEVICE_ID) in bcm_sf2_sw_remove()
1527 reset_control_assert(priv->rcdev); in bcm_sf2_sw_remove()
1545 * Do not rely on kexec_in_progress, just power the PHY on. in bcm_sf2_sw_shutdown()
1547 if (priv->hw_params.num_gphy == 1) in bcm_sf2_sw_shutdown()
1548 bcm_sf2_gphy_enable_set(priv->dev->ds, true); in bcm_sf2_sw_shutdown()
1550 dsa_switch_shutdown(priv->dev->ds); in bcm_sf2_sw_shutdown()
1560 return dsa_switch_suspend(priv->dev->ds); in bcm_sf2_suspend()
1567 return dsa_switch_resume(priv->dev->ds); in bcm_sf2_resume()
1580 .name = "brcm-sf2",
1590 MODULE_ALIAS("platform:brcm-sf2");