Lines Matching +full:sparx +full:- +full:5

1 // SPDX-License-Identifier: GPL-2.0
3 * Vitesse VSC7385 SparX-G5 5+1-port Integrated Gigabit Ethernet Switch
4 * Vitesse VSC7388 SparX-G8 8-port Integrated Gigabit Ethernet Switch
5 * Vitesse VSC7395 SparX-G5e 5+1-port Integrated Gigabit Ethernet Switch
6 * Vitesse VSC7398 SparX-G8e 8-port Integrated Gigabit Ethernet Switch
8 * These switches have a built-in 8051 CPU and can download and execute a
10 * handling the switch in a memory-mapped manner by connecting to that external
34 #include "vitesse-vsc73xx.h"
36 #define VSC73XX_BLOCK_MAC 0x1 /* Subblocks 0-4, 6 (CPU port) */
40 #define VSC73XX_BLOCK_CAPTURE 0x4 /* Subblocks 0-4, 6, 7 */
95 #define VSC73XX_MAC_CFG_MAC_RX_RST BIT(5)
129 #define VSC73XX_ADVPORTM_EXT_PORT BIT(5)
210 #define VSC73XX_HASH0_VID_FROM_MASK GENMASK(5, 0)
217 #define VSC73XX_HASH3_MAC3_FROM_MASK GENMASK(5, 0)
228 #define VSC73XX_HASH3_MAC3_TO_MASK GENMASK(10, 5)
249 #define VSC73XX_MACACCESS_CMD_CLEAR_TABLE 5
284 #define VSC73XX_MII_MPRES_PRESCALEVAL GENMASK(5, 0)
289 /* Arbiter block 5 registers */
356 #define IS_7385(a) ((a)->chipid == VSC73XX_CHIPID_ID_7385)
357 #define IS_7388(a) ((a)->chipid == VSC73XX_CHIPID_ID_7388)
358 #define IS_7395(a) ((a)->chipid == VSC73XX_CHIPID_ID_7395)
359 #define IS_7398(a) ((a)->chipid == VSC73XX_CHIPID_ID_7398)
363 #define VSC73XX_MDIO_POLL_SLEEP_US 5
379 * Some counters are custom, non-standard. The standard counters are
380 * named in accordance with RFC2819, RFC2021 and IEEE Std 802.3-2002 Annex
385 { 1, "RxBroadcast+MulticastPkts" }, /* non-standard counter */
386 { 2, "RxTotalErrorPackets" }, /* non-standard counter */
389 { 5, "RxEtherStatsPkts64Octets" },
395 { 11, "RxJumboFrames" }, /* non-standard counter */
397 { 13, "RxFIFODrops" }, /* non-standard counter */
398 { 14, "RxBackwardDrops" }, /* non-standard counter */
399 { 15, "RxClassifierDrops" }, /* non-standard counter */
406 /* 22-24 are undefined */
408 { 26, "RxQoSClass0" }, /* non-standard counter */
409 { 27, "RxQoSClass1" }, /* non-standard counter */
410 { 28, "RxQoSClass2" }, /* non-standard counter */
411 { 29, "RxQoSClass3" }, /* non-standard counter */
416 { 1, "TxBroadcast+MulticastPkts" }, /* non-standard counter */
417 { 2, "TxTotalErrorPackets" }, /* non-standard counter */
420 { 5, "TxEtherStatsPkts64Octets" },
426 { 11, "TxJumboFrames" }, /* non-standard counter */
428 { 13, "TxFIFODrops" }, /* non-standard counter */
429 { 14, "TxDrops" }, /* non-standard counter */
436 /* 21-24 are undefined */
438 { 26, "TxQoSClass0" }, /* non-standard counter */
439 { 27, "TxQoSClass1" }, /* non-standard counter */
440 { 28, "TxQoSClass2" }, /* non-standard counter */
441 { 29, "TxQoSClass3" }, /* non-standard counter */
497 return vsc->ops->read(vsc, block, subblock, reg, val); in vsc73xx_read()
503 return vsc->ops->write(vsc, block, subblock, reg, val); in vsc73xx_write()
512 /* Same read-modify-write algorithm as e.g. regmap */ in vsc73xx_update_bits()
533 dev_err(vsc->dev, "unable to read mailbox (%d)\n", ret); in vsc73xx_detect()
538 dev_info(vsc->dev, "chip seems dead.\n"); in vsc73xx_detect()
539 return -EAGAIN; in vsc73xx_detect()
545 dev_err(vsc->dev, "unable to read chip id (%d)\n", ret); in vsc73xx_detect()
558 dev_err(vsc->dev, "unsupported chip, id=%04x\n", id); in vsc73xx_detect()
559 return -ENODEV; in vsc73xx_detect()
562 vsc->chipid = id; in vsc73xx_detect()
565 dev_info(vsc->dev, "VSC%04X (rev: %d) switch found\n", id, rev); in vsc73xx_detect()
570 dev_err(vsc->dev, "unable to read iCPU control\n"); in vsc73xx_detect()
583 dev_err(vsc->dev, in vsc73xx_detect()
585 dev_err(vsc->dev, "no idea how to deal with this\n"); in vsc73xx_detect()
586 return -ENODEV; in vsc73xx_detect()
589 dev_err(vsc->dev, in vsc73xx_detect()
591 return -EAGAIN; in vsc73xx_detect()
594 dev_err(vsc->dev, in vsc73xx_detect()
596 dev_err(vsc->dev, "no idea how to deal with this\n"); in vsc73xx_detect()
597 return -ENODEV; in vsc73xx_detect()
600 dev_info(vsc->dev, "iCPU disabled, no external memory\n"); in vsc73xx_detect()
623 struct vsc73xx *vsc = ds->priv; in vsc73xx_phy_read()
650 dev_err(vsc->dev, "reading reg %02x from phy%d failed\n", in vsc73xx_phy_read()
652 return -EIO; in vsc73xx_phy_read()
656 dev_dbg(vsc->dev, "read reg %02x from phy%d = %04x\n", in vsc73xx_phy_read()
665 struct vsc73xx *vsc = ds->priv; in vsc73xx_phy_write()
681 dev_dbg(vsc->dev, "write %04x to reg %02x in phy%d\n", in vsc73xx_phy_write()
792 struct device_node *port_dn = dp->dn; in vsc73xx_configure_rgmii_port_delay()
793 struct vsc73xx *vsc = ds->priv; in vsc73xx_configure_rgmii_port_delay()
796 if (!of_property_read_u32(port_dn, "tx-internal-delay-ps", &delay)) { in vsc73xx_configure_rgmii_port_delay()
810 dev_err(vsc->dev, in vsc73xx_configure_rgmii_port_delay()
812 return -EINVAL; in vsc73xx_configure_rgmii_port_delay()
815 dev_dbg(vsc->dev, in vsc73xx_configure_rgmii_port_delay()
819 if (!of_property_read_u32(port_dn, "rx-internal-delay-ps", &delay)) { in vsc73xx_configure_rgmii_port_delay()
833 dev_err(vsc->dev, in vsc73xx_configure_rgmii_port_delay()
835 return -EINVAL; in vsc73xx_configure_rgmii_port_delay()
838 dev_dbg(vsc->dev, in vsc73xx_configure_rgmii_port_delay()
849 struct vsc73xx *vsc = ds->priv; in vsc73xx_setup()
852 dev_info(vsc->dev, "set up the switch\n"); in vsc73xx_setup()
854 ds->max_num_bridges = DSA_TAG_8021Q_MAX_NUM_BRIDGES; in vsc73xx_setup()
855 ds->fdb_isolation = true; in vsc73xx_setup()
864 * VSC7385 SparX-G5 datasheet section 6.6.1 in vsc73xx_setup()
865 * VSC7395 SparX-G5e datasheet section 6.6.1 in vsc73xx_setup()
903 if (i == 5) in vsc73xx_setup()
942 INIT_LIST_HEAD(&vsc->vlans); in vsc73xx_setup()
969 * augmented after auto-negotiation on the PHY-facing in vsc73xx_init_port()
1010 val = (vsc->addr[5] << 16) | (vsc->addr[4] << 8) | (vsc->addr[3]); in vsc73xx_init_port()
1015 val = (vsc->addr[2] << 16) | (vsc->addr[1] << 8) | (vsc->addr[0]); in vsc73xx_init_port()
1056 dev_err(vsc->dev, in vsc73xx_reset_port()
1059 dev_err(vsc->dev, "error reading arbiter\n"); in vsc73xx_reset_port()
1070 struct vsc73xx *vsc = dp->ds->priv; in vsc73xx_mac_config()
1071 int port = dp->index; in vsc73xx_mac_config()
1073 /* Special handling of the CPU-facing port */ in vsc73xx_mac_config()
1094 struct vsc73xx *vsc = dp->ds->priv; in vsc73xx_mac_link_down()
1095 int port = dp->index; in vsc73xx_mac_link_down()
1113 struct vsc73xx *vsc = dp->ds->priv; in vsc73xx_mac_link_up()
1114 int port = dp->index; in vsc73xx_mac_link_up()
1189 list_for_each_entry(vlan, &vsc->vlans, list) in vsc73xx_bridge_vlan_find()
1190 if (vlan->vid == vid) in vsc73xx_bridge_vlan_find()
1200 vsc73xx_vlan->portmask &= ~BIT(port); in vsc73xx_bridge_vlan_remove_port()
1202 if (vsc73xx_vlan->portmask) in vsc73xx_bridge_vlan_remove_port()
1205 list_del(&vsc73xx_vlan->list); in vsc73xx_bridge_vlan_remove_port()
1216 list_for_each_entry(vlan, &vsc->vlans, list) { in vsc73xx_bridge_vlan_summary()
1217 if (!(vlan->portmask & BIT(port)) || vlan->vid == ignored_vid) in vsc73xx_bridge_vlan_summary()
1220 if (vlan->untagged & BIT(port)) in vsc73xx_bridge_vlan_summary()
1226 summary->num_untagged = num_untagged; in vsc73xx_bridge_vlan_summary()
1227 summary->num_tagged = num_tagged; in vsc73xx_bridge_vlan_summary()
1234 list_for_each_entry(vlan, &vsc->vlans, list) in vsc73xx_find_first_vlan_untagged()
1235 if ((vlan->portmask & BIT(port)) && in vsc73xx_find_first_vlan_untagged()
1236 (vlan->untagged & BIT(port))) in vsc73xx_find_first_vlan_untagged()
1237 return vlan->vid; in vsc73xx_find_first_vlan_untagged()
1268 * vsc73xx_vlan_commit_conf - Update VLAN configuration of a port
1274 * preservation, or filtering with all VLANs egress-untagged. Otherwise,
1275 * the port ignores VLAN tags from packets and applies the port-based
1279 * - the bridge VLAN filtering state of the port
1280 * - the number or attributes of VLANs from the bridge VLAN table,
1281 * while the port is currently VLAN-aware
1288 struct dsa_port *dp = dsa_to_port(vsc->ds, port); in vsc73xx_vlan_commit_conf()
1322 * vsc73xx_vlan_commit_untagged - Update native VLAN of a port
1327 * as egress-tagged on a trunk port) when port is in VLAN filtering mode and
1336 struct dsa_port *dp = dsa_to_port(vsc->ds, port); in vsc73xx_vlan_commit_untagged()
1383 * vsc73xx_vlan_commit_pvid - Update port-based default VLAN of a port
1388 * configuration, when the bridge is currently VLAN-aware, or the PVID
1389 * from tag_8021q, when the port is standalone or under a VLAN-unaware
1394 * - the bridge VLAN filtering state of the port
1395 * - the number or attributes of VLANs from the bridge VLAN table,
1396 * while the port is currently VLAN-aware
1402 struct vsc73xx_portinfo *portinfo = &vsc->portinfo[port]; in vsc73xx_vlan_commit_pvid()
1403 bool valid = portinfo->pvid_tag_8021q_configured; in vsc73xx_vlan_commit_pvid()
1404 struct dsa_port *dp = dsa_to_port(vsc->ds, port); in vsc73xx_vlan_commit_pvid()
1405 u16 vid = portinfo->pvid_tag_8021q; in vsc73xx_vlan_commit_pvid()
1408 vid = portinfo->pvid_vlan_filtering; in vsc73xx_vlan_commit_pvid()
1409 valid = portinfo->pvid_vlan_filtering_configured; in vsc73xx_vlan_commit_pvid()
1433 struct vsc73xx *vsc = ds->priv; in vsc73xx_port_enable()
1435 dev_info(vsc->dev, "enable port %d\n", port); in vsc73xx_port_enable()
1443 struct vsc73xx *vsc = ds->priv; in vsc73xx_port_disable()
1471 if (cnt->counter == counter) in vsc73xx_find_counter()
1482 struct vsc73xx *vsc = ds->priv; in vsc73xx_get_strings()
1498 indices[1] = ((val >> 5) & 0x1f); /* RX counter 1 */ in vsc73xx_get_strings()
1502 indices[5] = ((val >> 26) & 0x1f); /* TX counter 2 */ in vsc73xx_get_strings()
1508 * figure out what counters we use in this set-up and return the in vsc73xx_get_strings()
1515 ethtool_puts(&buf, cnt ? cnt->name : ""); in vsc73xx_get_strings()
1523 ethtool_puts(&buf, cnt ? cnt->name : ""); in vsc73xx_get_strings()
1540 struct vsc73xx *vsc = ds->priv; in vsc73xx_get_ethtool_stats()
1559 dev_err(vsc->dev, "error reading counter %d\n", i); in vsc73xx_get_ethtool_stats()
1568 struct vsc73xx *vsc = ds->priv; in vsc73xx_change_mtu()
1581 return 9600 - ETH_HLEN - ETH_FCS_LEN; in vsc73xx_get_max_mtu()
1587 unsigned long *interfaces = config->supported_interfaces; in vsc73xx_phylink_get_caps()
1589 if (port == 5) in vsc73xx_phylink_get_caps()
1606 config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | MAC_1000; in vsc73xx_phylink_get_caps()
1613 struct vsc73xx *vsc = ds->priv; in vsc73xx_port_vlan_filtering()
1632 bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; in vsc73xx_port_vlan_add()
1633 bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID; in vsc73xx_port_vlan_add()
1638 struct vsc73xx *vsc = ds->priv; in vsc73xx_port_vlan_add()
1644 if (vid_is_dsa_8021q(vlan->vid)) { in vsc73xx_port_vlan_add()
1646 "Range 3072-4095 reserved for dsa_8021q operation"); in vsc73xx_port_vlan_add()
1647 return -EBUSY; in vsc73xx_port_vlan_add()
1650 /* The processed vlan->vid is excluded from the search because the VLAN in vsc73xx_port_vlan_add()
1651 * can be re-added with a different set of flags, so it's easiest to in vsc73xx_port_vlan_add()
1654 vsc73xx_bridge_vlan_summary(vsc, port, &summary, vlan->vid); in vsc73xx_port_vlan_add()
1661 return -EBUSY; in vsc73xx_port_vlan_add()
1664 vsc73xx_vlan = vsc73xx_bridge_vlan_find(vsc, vlan->vid); in vsc73xx_port_vlan_add()
1669 return -ENOMEM; in vsc73xx_port_vlan_add()
1671 vsc73xx_vlan->vid = vlan->vid; in vsc73xx_port_vlan_add()
1673 list_add_tail(&vsc73xx_vlan->list, &vsc->vlans); in vsc73xx_port_vlan_add()
1676 vsc73xx_vlan->portmask |= BIT(port); in vsc73xx_port_vlan_add()
1685 vsc73xx_vlan->untagged |= BIT(port); in vsc73xx_port_vlan_add()
1687 vsc73xx_vlan->untagged &= ~BIT(port); in vsc73xx_port_vlan_add()
1689 portinfo = &vsc->portinfo[port]; in vsc73xx_port_vlan_add()
1692 portinfo->pvid_vlan_filtering_configured = true; in vsc73xx_port_vlan_add()
1693 portinfo->pvid_vlan_filtering = vlan->vid; in vsc73xx_port_vlan_add()
1694 } else if (portinfo->pvid_vlan_filtering_configured && in vsc73xx_port_vlan_add()
1695 portinfo->pvid_vlan_filtering == vlan->vid) { in vsc73xx_port_vlan_add()
1696 portinfo->pvid_vlan_filtering_configured = false; in vsc73xx_port_vlan_add()
1707 ret = vsc73xx_update_vlan_table(vsc, port, vlan->vid, true); in vsc73xx_port_vlan_add()
1720 struct vsc73xx *vsc = ds->priv; in vsc73xx_port_vlan_del()
1724 ret = vsc73xx_update_vlan_table(vsc, port, vlan->vid, false); in vsc73xx_port_vlan_del()
1728 portinfo = &vsc->portinfo[port]; in vsc73xx_port_vlan_del()
1730 if (portinfo->pvid_vlan_filtering_configured && in vsc73xx_port_vlan_del()
1731 portinfo->pvid_vlan_filtering == vlan->vid) in vsc73xx_port_vlan_del()
1732 portinfo->pvid_vlan_filtering_configured = false; in vsc73xx_port_vlan_del()
1734 vsc73xx_vlan = vsc73xx_bridge_vlan_find(vsc, vlan->vid); in vsc73xx_port_vlan_del()
1752 struct vsc73xx *vsc = ds->priv; in vsc73xx_tag_8021q_vlan_add()
1756 portinfo = &vsc->portinfo[port]; in vsc73xx_tag_8021q_vlan_add()
1759 portinfo->pvid_tag_8021q_configured = true; in vsc73xx_tag_8021q_vlan_add()
1760 portinfo->pvid_tag_8021q = vid; in vsc73xx_tag_8021q_vlan_add()
1776 struct vsc73xx *vsc = ds->priv; in vsc73xx_tag_8021q_vlan_del()
1778 portinfo = &vsc->portinfo[port]; in vsc73xx_tag_8021q_vlan_del()
1780 if (portinfo->pvid_tag_8021q_configured && in vsc73xx_tag_8021q_vlan_del()
1781 portinfo->pvid_tag_8021q == vid) { in vsc73xx_tag_8021q_vlan_del()
1786 portinfo->pvid_tag_8021q_configured = false; in vsc73xx_tag_8021q_vlan_del()
1804 return -EINVAL; in vsc73xx_port_pre_bridge_flags()
1815 struct vsc73xx *vsc = ds->priv; in vsc73xx_port_bridge_flags()
1827 struct vsc73xx *vsc = ds->priv; in vsc73xx_refresh_fwd_map()
1842 VSC73XX_SRCMASKS + other_dp->index, in vsc73xx_refresh_fwd_map()
1858 int other_port = other_dp->index; in vsc73xx_refresh_fwd_map()
1861 other_dp->stp_state != BR_STATE_FORWARDING) in vsc73xx_refresh_fwd_map()
1885 struct vsc73xx *vsc = ds->priv; in vsc73xx_port_stp_state_set()
1889 val = dp->learning ? BIT(port) : 0; in vsc73xx_port_stp_state_set()
1908 /* VID 5-0, MAC 47-44 */ in vsc73xx_calc_hash()
1913 /* MAC 43-33 */ in vsc73xx_calc_hash()
1918 /* MAC 32-22 */ in vsc73xx_calc_hash()
1925 /* MAC 21-11 */ in vsc73xx_calc_hash()
1930 /* MAC 10-0 */ in vsc73xx_calc_hash()
1933 addr[5]; in vsc73xx_calc_hash()
1963 return -EINVAL; in vsc73xx_port_read_mac_table_row()
1965 return -EINVAL; in vsc73xx_port_read_mac_table_row()
2019 fdb[i].mac[5] = FIELD_GET(VSC73XX_MACLDATA_MAC5, val); in vsc73xx_port_read_mac_table_row()
2043 FIELD_PREP(VSC73XX_MACLDATA_MAC5, addr[5]); in vsc73xx_fdb_operation()
2073 mutex_lock(&vsc->fdb_lock); in vsc73xx_fdb_del_entry()
2087 ret = -ENODATA; in vsc73xx_fdb_del_entry()
2095 mutex_unlock(&vsc->fdb_lock); in vsc73xx_fdb_del_entry()
2107 mutex_lock(&vsc->fdb_lock); in vsc73xx_fdb_add_entry()
2120 ret = -EOVERFLOW; in vsc73xx_fdb_add_entry()
2133 mutex_unlock(&vsc->fdb_lock); in vsc73xx_fdb_add_entry()
2140 struct vsc73xx *vsc = ds->priv; in vsc73xx_fdb_add()
2151 return -EOPNOTSUPP; in vsc73xx_fdb_add()
2161 struct vsc73xx *vsc = ds->priv; in vsc73xx_fdb_del()
2172 return -EOPNOTSUPP; in vsc73xx_fdb_del()
2183 struct vsc73xx *vsc = ds->priv; in vsc73xx_port_fdb_dump()
2187 mutex_lock(&vsc->fdb_lock); in vsc73xx_port_fdb_dump()
2208 mutex_unlock(&vsc->fdb_lock); in vsc73xx_port_fdb_dump()
2311 vsc->gc.label = devm_kasprintf(vsc->dev, GFP_KERNEL, "VSC%04x", in vsc73xx_gpio_probe()
2312 vsc->chipid); in vsc73xx_gpio_probe()
2313 if (!vsc->gc.label) in vsc73xx_gpio_probe()
2314 return -ENOMEM; in vsc73xx_gpio_probe()
2315 vsc->gc.ngpio = 4; in vsc73xx_gpio_probe()
2316 vsc->gc.owner = THIS_MODULE; in vsc73xx_gpio_probe()
2317 vsc->gc.parent = vsc->dev; in vsc73xx_gpio_probe()
2318 vsc->gc.base = -1; in vsc73xx_gpio_probe()
2319 vsc->gc.get = vsc73xx_gpio_get; in vsc73xx_gpio_probe()
2320 vsc->gc.set = vsc73xx_gpio_set; in vsc73xx_gpio_probe()
2321 vsc->gc.direction_input = vsc73xx_gpio_direction_input; in vsc73xx_gpio_probe()
2322 vsc->gc.direction_output = vsc73xx_gpio_direction_output; in vsc73xx_gpio_probe()
2323 vsc->gc.get_direction = vsc73xx_gpio_get_direction; in vsc73xx_gpio_probe()
2324 vsc->gc.can_sleep = true; in vsc73xx_gpio_probe()
2325 ret = devm_gpiochip_add_data(vsc->dev, &vsc->gc, vsc); in vsc73xx_gpio_probe()
2327 dev_err(vsc->dev, "unable to register GPIO chip\n"); in vsc73xx_gpio_probe()
2335 struct device *dev = vsc->dev; in vsc73xx_probe()
2339 vsc->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in vsc73xx_probe()
2340 if (IS_ERR(vsc->reset)) { in vsc73xx_probe()
2342 return PTR_ERR(vsc->reset); in vsc73xx_probe()
2344 if (vsc->reset) in vsc73xx_probe()
2349 if (ret == -EAGAIN) { in vsc73xx_probe()
2350 dev_err(vsc->dev, in vsc73xx_probe()
2352 gpiod_set_value_cansleep(vsc->reset, 1); in vsc73xx_probe()
2357 gpiod_set_value_cansleep(vsc->reset, 0); in vsc73xx_probe()
2364 return -ENODEV; in vsc73xx_probe()
2367 mutex_init(&vsc->fdb_lock); in vsc73xx_probe()
2369 eth_random_addr(vsc->addr); in vsc73xx_probe()
2370 dev_info(vsc->dev, in vsc73xx_probe()
2372 vsc->addr[0], vsc->addr[1], vsc->addr[2], in vsc73xx_probe()
2373 vsc->addr[3], vsc->addr[4], vsc->addr[5]); in vsc73xx_probe()
2375 vsc->ds = devm_kzalloc(dev, sizeof(*vsc->ds), GFP_KERNEL); in vsc73xx_probe()
2376 if (!vsc->ds) in vsc73xx_probe()
2377 return -ENOMEM; in vsc73xx_probe()
2379 vsc->ds->dev = dev; in vsc73xx_probe()
2380 vsc->ds->num_ports = VSC73XX_MAX_NUM_PORTS; in vsc73xx_probe()
2381 vsc->ds->priv = vsc; in vsc73xx_probe()
2383 vsc->ds->ops = &vsc73xx_ds_ops; in vsc73xx_probe()
2384 vsc->ds->phylink_mac_ops = &vsc73xx_phylink_mac_ops; in vsc73xx_probe()
2385 ret = dsa_register_switch(vsc->ds); in vsc73xx_probe()
2393 dsa_unregister_switch(vsc->ds); in vsc73xx_probe()
2403 dsa_unregister_switch(vsc->ds); in vsc73xx_remove()
2404 gpiod_set_value(vsc->reset, 1); in vsc73xx_remove()
2410 dsa_switch_shutdown(vsc->ds); in vsc73xx_shutdown()