| // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) | |
| /* | |
| * NXP NETC switch driver | |
| * Copyright 2025-2026 NXP | |
| */ | |
| #include "netc_switch.h" | |
| struct netc_switch_platform { | |
| u16 revision; | |
| const struct netc_switch_info *info; | |
| }; | |
| static void imx94_switch_phylink_get_caps(int port, | |
| struct phylink_config *config) | |
| { | |
| config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | MAC_1000FD; | |
| switch (port) { | |
| case 0 ... 1: | |
| __set_bit(PHY_INTERFACE_MODE_SGMII, | |
| config->supported_interfaces); | |
| __set_bit(PHY_INTERFACE_MODE_2500BASEX, | |
| config->supported_interfaces); | |
| config->mac_capabilities |= MAC_2500FD; | |
| fallthrough; | |
| case 2: | |
| config->mac_capabilities |= MAC_10 | MAC_100; | |
| __set_bit(PHY_INTERFACE_MODE_MII, | |
| config->supported_interfaces); | |
| __set_bit(PHY_INTERFACE_MODE_RMII, | |
| config->supported_interfaces); | |
| /* Port 0 and 1 do not support REVMII */ | |
| if (port == 2) | |
| __set_bit(PHY_INTERFACE_MODE_REVMII, | |
| config->supported_interfaces); | |
| phy_interface_set_rgmii(config->supported_interfaces); | |
| break; | |
| case 3: /* CPU port */ | |
| __set_bit(PHY_INTERFACE_MODE_INTERNAL, | |
| config->supported_interfaces); | |
| config->mac_capabilities |= MAC_10FD | MAC_100FD | | |
| MAC_2500FD; | |
| break; | |
| default: | |
| break; | |
| } | |
| } | |
| static const struct netc_switch_info imx94_info = { | |
| .num_ports = 4, | |
| .phylink_get_caps = imx94_switch_phylink_get_caps, | |
| }; | |
| static const struct netc_switch_platform netc_platforms[] = { | |
| { .revision = NETC_SWITCH_REV_4_3, .info = &imx94_info, }, | |
| { } | |
| }; | |
| static const struct netc_switch_info * | |
| netc_switch_get_info(struct netc_switch *priv) | |
| { | |
| int i; | |
| /* Matching based on IP revision */ | |
| for (i = 0; i < ARRAY_SIZE(netc_platforms); i++) { | |
| if (priv->revision == netc_platforms[i].revision) | |
| return netc_platforms[i].info; | |
| } | |
| return NULL; | |
| } | |
| int netc_switch_platform_probe(struct netc_switch *priv) | |
| { | |
| const struct netc_switch_info *info = netc_switch_get_info(priv); | |
| if (!info) { | |
| dev_err(priv->dev, "Cannot find switch platform info\n"); | |
| return -EINVAL; | |
| } | |
| priv->info = info; | |
| return 0; | |
| } |