18c2ecf20Sopenharmony_ci/***********************license start***************
28c2ecf20Sopenharmony_ci * Author: Cavium Networks
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Contact: support@caviumnetworks.com
58c2ecf20Sopenharmony_ci * This file is part of the OCTEON SDK
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Copyright (c) 2003-2008 Cavium Networks
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci * This file is free software; you can redistribute it and/or modify
108c2ecf20Sopenharmony_ci * it under the terms of the GNU General Public License, Version 2, as
118c2ecf20Sopenharmony_ci * published by the Free Software Foundation.
128c2ecf20Sopenharmony_ci *
138c2ecf20Sopenharmony_ci * This file is distributed in the hope that it will be useful, but
148c2ecf20Sopenharmony_ci * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
158c2ecf20Sopenharmony_ci * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
168c2ecf20Sopenharmony_ci * NONINFRINGEMENT.  See the GNU General Public License for more
178c2ecf20Sopenharmony_ci * details.
188c2ecf20Sopenharmony_ci *
198c2ecf20Sopenharmony_ci * You should have received a copy of the GNU General Public License
208c2ecf20Sopenharmony_ci * along with this file; if not, write to the Free Software
218c2ecf20Sopenharmony_ci * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
228c2ecf20Sopenharmony_ci * or visit http://www.gnu.org/licenses/.
238c2ecf20Sopenharmony_ci *
248c2ecf20Sopenharmony_ci * This file may also be available under a different license from Cavium.
258c2ecf20Sopenharmony_ci * Contact Cavium Networks for more information
268c2ecf20Sopenharmony_ci ***********************license end**************************************/
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci/*
298c2ecf20Sopenharmony_ci *
308c2ecf20Sopenharmony_ci * Helper functions to abstract board specific data about
318c2ecf20Sopenharmony_ci * network ports from the rest of the cvmx-helper files.
328c2ecf20Sopenharmony_ci */
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci#include <linux/bug.h>
358c2ecf20Sopenharmony_ci#include <asm/octeon/octeon.h>
368c2ecf20Sopenharmony_ci#include <asm/octeon/cvmx-bootinfo.h>
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci#include <asm/octeon/cvmx-config.h>
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci#include <asm/octeon/cvmx-helper.h>
418c2ecf20Sopenharmony_ci#include <asm/octeon/cvmx-helper-util.h>
428c2ecf20Sopenharmony_ci#include <asm/octeon/cvmx-helper-board.h>
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#include <asm/octeon/cvmx-gmxx-defs.h>
458c2ecf20Sopenharmony_ci#include <asm/octeon/cvmx-asxx-defs.h>
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci/**
488c2ecf20Sopenharmony_ci * Return the MII PHY address associated with the given IPD
498c2ecf20Sopenharmony_ci * port. A result of -1 means there isn't a MII capable PHY
508c2ecf20Sopenharmony_ci * connected to this port. On chips supporting multiple MII
518c2ecf20Sopenharmony_ci * busses the bus number is encoded in bits <15:8>.
528c2ecf20Sopenharmony_ci *
538c2ecf20Sopenharmony_ci * This function must be modified for every new Octeon board.
548c2ecf20Sopenharmony_ci * Internally it uses switch statements based on the cvmx_sysinfo
558c2ecf20Sopenharmony_ci * data to determine board types and revisions. It replies on the
568c2ecf20Sopenharmony_ci * fact that every Octeon board receives a unique board type
578c2ecf20Sopenharmony_ci * enumeration from the bootloader.
588c2ecf20Sopenharmony_ci *
598c2ecf20Sopenharmony_ci * @ipd_port: Octeon IPD port to get the MII address for.
608c2ecf20Sopenharmony_ci *
618c2ecf20Sopenharmony_ci * Returns MII PHY address and bus number or -1.
628c2ecf20Sopenharmony_ci */
638c2ecf20Sopenharmony_ciint cvmx_helper_board_get_mii_address(int ipd_port)
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	switch (cvmx_sysinfo_get()->board_type) {
668c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_SIM:
678c2ecf20Sopenharmony_ci		/* Simulator doesn't have MII */
688c2ecf20Sopenharmony_ci		return -1;
698c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBT3000:
708c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBT5800:
718c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_THUNDER:
728c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_NICPRO2:
738c2ecf20Sopenharmony_ci		/* Interface 0 is SPI4, interface 1 is RGMII */
748c2ecf20Sopenharmony_ci		if ((ipd_port >= 16) && (ipd_port < 20))
758c2ecf20Sopenharmony_ci			return ipd_port - 16;
768c2ecf20Sopenharmony_ci		else
778c2ecf20Sopenharmony_ci			return -1;
788c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_KODAMA:
798c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBH3100:
808c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_HIKARI:
818c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_CN3010_EVB_HS5:
828c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_CN3005_EVB_HS5:
838c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_CN3020_EVB_HS5:
848c2ecf20Sopenharmony_ci		/*
858c2ecf20Sopenharmony_ci		 * Port 0 is WAN connected to a PHY, Port 1 is GMII
868c2ecf20Sopenharmony_ci		 * connected to a switch
878c2ecf20Sopenharmony_ci		 */
888c2ecf20Sopenharmony_ci		if (ipd_port == 0)
898c2ecf20Sopenharmony_ci			return 4;
908c2ecf20Sopenharmony_ci		else if (ipd_port == 1)
918c2ecf20Sopenharmony_ci			return 9;
928c2ecf20Sopenharmony_ci		else
938c2ecf20Sopenharmony_ci			return -1;
948c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_NAC38:
958c2ecf20Sopenharmony_ci		/* Board has 8 RGMII ports PHYs are 0-7 */
968c2ecf20Sopenharmony_ci		if ((ipd_port >= 0) && (ipd_port < 4))
978c2ecf20Sopenharmony_ci			return ipd_port;
988c2ecf20Sopenharmony_ci		else if ((ipd_port >= 16) && (ipd_port < 20))
998c2ecf20Sopenharmony_ci			return ipd_port - 16 + 4;
1008c2ecf20Sopenharmony_ci		else
1018c2ecf20Sopenharmony_ci			return -1;
1028c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBH3000:
1038c2ecf20Sopenharmony_ci		/* Board has dual SPI4 and no PHYs */
1048c2ecf20Sopenharmony_ci		return -1;
1058c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBH5200:
1068c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBH5201:
1078c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBT5200:
1088c2ecf20Sopenharmony_ci		/* Board has 2 management ports */
1098c2ecf20Sopenharmony_ci		if ((ipd_port >= CVMX_HELPER_BOARD_MGMT_IPD_PORT) &&
1108c2ecf20Sopenharmony_ci		    (ipd_port < (CVMX_HELPER_BOARD_MGMT_IPD_PORT + 2)))
1118c2ecf20Sopenharmony_ci			return ipd_port - CVMX_HELPER_BOARD_MGMT_IPD_PORT;
1128c2ecf20Sopenharmony_ci		/*
1138c2ecf20Sopenharmony_ci		 * Board has 4 SGMII ports. The PHYs start right after the MII
1148c2ecf20Sopenharmony_ci		 * ports MII0 = 0, MII1 = 1, SGMII = 2-5.
1158c2ecf20Sopenharmony_ci		 */
1168c2ecf20Sopenharmony_ci		if ((ipd_port >= 0) && (ipd_port < 4))
1178c2ecf20Sopenharmony_ci			return ipd_port + 2;
1188c2ecf20Sopenharmony_ci		else
1198c2ecf20Sopenharmony_ci			return -1;
1208c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBH5600:
1218c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBH5601:
1228c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBH5610:
1238c2ecf20Sopenharmony_ci		/* Board has 1 management port */
1248c2ecf20Sopenharmony_ci		if (ipd_port == CVMX_HELPER_BOARD_MGMT_IPD_PORT)
1258c2ecf20Sopenharmony_ci			return 0;
1268c2ecf20Sopenharmony_ci		/*
1278c2ecf20Sopenharmony_ci		 * Board has 8 SGMII ports. 4 connect out, two connect
1288c2ecf20Sopenharmony_ci		 * to a switch, and 2 loop to each other
1298c2ecf20Sopenharmony_ci		 */
1308c2ecf20Sopenharmony_ci		if ((ipd_port >= 0) && (ipd_port < 4))
1318c2ecf20Sopenharmony_ci			return ipd_port + 1;
1328c2ecf20Sopenharmony_ci		else
1338c2ecf20Sopenharmony_ci			return -1;
1348c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_CUST_NB5:
1358c2ecf20Sopenharmony_ci		if (ipd_port == 2)
1368c2ecf20Sopenharmony_ci			return 4;
1378c2ecf20Sopenharmony_ci		else
1388c2ecf20Sopenharmony_ci			return -1;
1398c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_NIC_XLE_4G:
1408c2ecf20Sopenharmony_ci		/* Board has 4 SGMII ports. connected QLM3(interface 1) */
1418c2ecf20Sopenharmony_ci		if ((ipd_port >= 16) && (ipd_port < 20))
1428c2ecf20Sopenharmony_ci			return ipd_port - 16 + 1;
1438c2ecf20Sopenharmony_ci		else
1448c2ecf20Sopenharmony_ci			return -1;
1458c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_NIC_XLE_10G:
1468c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_NIC10E:
1478c2ecf20Sopenharmony_ci		return -1;
1488c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_NIC4E:
1498c2ecf20Sopenharmony_ci		if (ipd_port >= 0 && ipd_port <= 3)
1508c2ecf20Sopenharmony_ci			return (ipd_port + 0x1f) & 0x1f;
1518c2ecf20Sopenharmony_ci		else
1528c2ecf20Sopenharmony_ci			return -1;
1538c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_NIC2E:
1548c2ecf20Sopenharmony_ci		if (ipd_port >= 0 && ipd_port <= 1)
1558c2ecf20Sopenharmony_ci			return ipd_port + 1;
1568c2ecf20Sopenharmony_ci		else
1578c2ecf20Sopenharmony_ci			return -1;
1588c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_BBGW_REF:
1598c2ecf20Sopenharmony_ci		/*
1608c2ecf20Sopenharmony_ci		 * No PHYs are connected to Octeon, everything is
1618c2ecf20Sopenharmony_ci		 * through switch.
1628c2ecf20Sopenharmony_ci		 */
1638c2ecf20Sopenharmony_ci		return -1;
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_CUST_WSX16:
1668c2ecf20Sopenharmony_ci		if (ipd_port >= 0 && ipd_port <= 3)
1678c2ecf20Sopenharmony_ci			return ipd_port;
1688c2ecf20Sopenharmony_ci		else if (ipd_port >= 16 && ipd_port <= 19)
1698c2ecf20Sopenharmony_ci			return ipd_port - 16 + 4;
1708c2ecf20Sopenharmony_ci		else
1718c2ecf20Sopenharmony_ci			return -1;
1728c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_UBNT_E100:
1738c2ecf20Sopenharmony_ci		if (ipd_port >= 0 && ipd_port <= 2)
1748c2ecf20Sopenharmony_ci			return 7 - ipd_port;
1758c2ecf20Sopenharmony_ci		else
1768c2ecf20Sopenharmony_ci			return -1;
1778c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_KONTRON_S1901:
1788c2ecf20Sopenharmony_ci		if (ipd_port == CVMX_HELPER_BOARD_MGMT_IPD_PORT)
1798c2ecf20Sopenharmony_ci			return 1;
1808c2ecf20Sopenharmony_ci		else
1818c2ecf20Sopenharmony_ci			return -1;
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ci	}
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci	/* Some unknown board. Somebody forgot to update this function... */
1868c2ecf20Sopenharmony_ci	cvmx_dprintf
1878c2ecf20Sopenharmony_ci	    ("cvmx_helper_board_get_mii_address: Unknown board type %d\n",
1888c2ecf20Sopenharmony_ci	     cvmx_sysinfo_get()->board_type);
1898c2ecf20Sopenharmony_ci	return -1;
1908c2ecf20Sopenharmony_ci}
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_ci/**
1938c2ecf20Sopenharmony_ci * This function is the board specific method of determining an
1948c2ecf20Sopenharmony_ci * ethernet ports link speed. Most Octeon boards have Marvell PHYs
1958c2ecf20Sopenharmony_ci * and are handled by the fall through case. This function must be
1968c2ecf20Sopenharmony_ci * updated for boards that don't have the normal Marvell PHYs.
1978c2ecf20Sopenharmony_ci *
1988c2ecf20Sopenharmony_ci * This function must be modified for every new Octeon board.
1998c2ecf20Sopenharmony_ci * Internally it uses switch statements based on the cvmx_sysinfo
2008c2ecf20Sopenharmony_ci * data to determine board types and revisions. It relies on the
2018c2ecf20Sopenharmony_ci * fact that every Octeon board receives a unique board type
2028c2ecf20Sopenharmony_ci * enumeration from the bootloader.
2038c2ecf20Sopenharmony_ci *
2048c2ecf20Sopenharmony_ci * @ipd_port: IPD input port associated with the port we want to get link
2058c2ecf20Sopenharmony_ci *		   status for.
2068c2ecf20Sopenharmony_ci *
2078c2ecf20Sopenharmony_ci * Returns The ports link status. If the link isn't fully resolved, this must
2088c2ecf20Sopenharmony_ci *	   return zero.
2098c2ecf20Sopenharmony_ci */
2108c2ecf20Sopenharmony_ciunion cvmx_helper_link_info __cvmx_helper_board_link_get(int ipd_port)
2118c2ecf20Sopenharmony_ci{
2128c2ecf20Sopenharmony_ci	union cvmx_helper_link_info result;
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_ci	WARN_ONCE(!octeon_is_simulation(),
2158c2ecf20Sopenharmony_ci	     "Using deprecated link status - please update your DT");
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_ci	/* Unless we fix it later, all links are defaulted to down */
2188c2ecf20Sopenharmony_ci	result.u64 = 0;
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ci	if (octeon_is_simulation()) {
2218c2ecf20Sopenharmony_ci		/* The simulator gives you a simulated 1Gbps full duplex link */
2228c2ecf20Sopenharmony_ci		result.s.link_up = 1;
2238c2ecf20Sopenharmony_ci		result.s.full_duplex = 1;
2248c2ecf20Sopenharmony_ci		result.s.speed = 1000;
2258c2ecf20Sopenharmony_ci		return result;
2268c2ecf20Sopenharmony_ci	}
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ci	if (OCTEON_IS_MODEL(OCTEON_CN3XXX)
2298c2ecf20Sopenharmony_ci		   || OCTEON_IS_MODEL(OCTEON_CN58XX)
2308c2ecf20Sopenharmony_ci		   || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
2318c2ecf20Sopenharmony_ci		/*
2328c2ecf20Sopenharmony_ci		 * We don't have a PHY address, so attempt to use
2338c2ecf20Sopenharmony_ci		 * in-band status. It is really important that boards
2348c2ecf20Sopenharmony_ci		 * not supporting in-band status never get
2358c2ecf20Sopenharmony_ci		 * here. Reading broken in-band status tends to do bad
2368c2ecf20Sopenharmony_ci		 * things
2378c2ecf20Sopenharmony_ci		 */
2388c2ecf20Sopenharmony_ci		union cvmx_gmxx_rxx_rx_inbnd inband_status;
2398c2ecf20Sopenharmony_ci		int interface = cvmx_helper_get_interface_num(ipd_port);
2408c2ecf20Sopenharmony_ci		int index = cvmx_helper_get_interface_index_num(ipd_port);
2418c2ecf20Sopenharmony_ci		inband_status.u64 =
2428c2ecf20Sopenharmony_ci		    cvmx_read_csr(CVMX_GMXX_RXX_RX_INBND(index, interface));
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci		result.s.link_up = inband_status.s.status;
2458c2ecf20Sopenharmony_ci		result.s.full_duplex = inband_status.s.duplex;
2468c2ecf20Sopenharmony_ci		switch (inband_status.s.speed) {
2478c2ecf20Sopenharmony_ci		case 0: /* 10 Mbps */
2488c2ecf20Sopenharmony_ci			result.s.speed = 10;
2498c2ecf20Sopenharmony_ci			break;
2508c2ecf20Sopenharmony_ci		case 1: /* 100 Mbps */
2518c2ecf20Sopenharmony_ci			result.s.speed = 100;
2528c2ecf20Sopenharmony_ci			break;
2538c2ecf20Sopenharmony_ci		case 2: /* 1 Gbps */
2548c2ecf20Sopenharmony_ci			result.s.speed = 1000;
2558c2ecf20Sopenharmony_ci			break;
2568c2ecf20Sopenharmony_ci		case 3: /* Illegal */
2578c2ecf20Sopenharmony_ci			result.u64 = 0;
2588c2ecf20Sopenharmony_ci			break;
2598c2ecf20Sopenharmony_ci		}
2608c2ecf20Sopenharmony_ci	} else {
2618c2ecf20Sopenharmony_ci		/*
2628c2ecf20Sopenharmony_ci		 * We don't have a PHY address and we don't have
2638c2ecf20Sopenharmony_ci		 * in-band status. There is no way to determine the
2648c2ecf20Sopenharmony_ci		 * link speed. Return down assuming this port isn't
2658c2ecf20Sopenharmony_ci		 * wired
2668c2ecf20Sopenharmony_ci		 */
2678c2ecf20Sopenharmony_ci		result.u64 = 0;
2688c2ecf20Sopenharmony_ci	}
2698c2ecf20Sopenharmony_ci
2708c2ecf20Sopenharmony_ci	/* If link is down, return all fields as zero. */
2718c2ecf20Sopenharmony_ci	if (!result.s.link_up)
2728c2ecf20Sopenharmony_ci		result.u64 = 0;
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_ci	return result;
2758c2ecf20Sopenharmony_ci}
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci/**
2788c2ecf20Sopenharmony_ci * This function is called by cvmx_helper_interface_probe() after it
2798c2ecf20Sopenharmony_ci * determines the number of ports Octeon can support on a specific
2808c2ecf20Sopenharmony_ci * interface. This function is the per board location to override
2818c2ecf20Sopenharmony_ci * this value. It is called with the number of ports Octeon might
2828c2ecf20Sopenharmony_ci * support and should return the number of actual ports on the
2838c2ecf20Sopenharmony_ci * board.
2848c2ecf20Sopenharmony_ci *
2858c2ecf20Sopenharmony_ci * This function must be modifed for every new Octeon board.
2868c2ecf20Sopenharmony_ci * Internally it uses switch statements based on the cvmx_sysinfo
2878c2ecf20Sopenharmony_ci * data to determine board types and revisions. It relys on the
2888c2ecf20Sopenharmony_ci * fact that every Octeon board receives a unique board type
2898c2ecf20Sopenharmony_ci * enumeration from the bootloader.
2908c2ecf20Sopenharmony_ci *
2918c2ecf20Sopenharmony_ci * @interface: Interface to probe
2928c2ecf20Sopenharmony_ci * @supported_ports:
2938c2ecf20Sopenharmony_ci *		    Number of ports Octeon supports.
2948c2ecf20Sopenharmony_ci *
2958c2ecf20Sopenharmony_ci * Returns Number of ports the actual board supports. Many times this will
2968c2ecf20Sopenharmony_ci *	   simple be "support_ports".
2978c2ecf20Sopenharmony_ci */
2988c2ecf20Sopenharmony_ciint __cvmx_helper_board_interface_probe(int interface, int supported_ports)
2998c2ecf20Sopenharmony_ci{
3008c2ecf20Sopenharmony_ci	switch (cvmx_sysinfo_get()->board_type) {
3018c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_CN3005_EVB_HS5:
3028c2ecf20Sopenharmony_ci		if (interface == 0)
3038c2ecf20Sopenharmony_ci			return 2;
3048c2ecf20Sopenharmony_ci		break;
3058c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_BBGW_REF:
3068c2ecf20Sopenharmony_ci		if (interface == 0)
3078c2ecf20Sopenharmony_ci			return 2;
3088c2ecf20Sopenharmony_ci		break;
3098c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_NIC_XLE_4G:
3108c2ecf20Sopenharmony_ci		if (interface == 0)
3118c2ecf20Sopenharmony_ci			return 0;
3128c2ecf20Sopenharmony_ci		break;
3138c2ecf20Sopenharmony_ci		/* The 2nd interface on the EBH5600 is connected to the Marvel switch,
3148c2ecf20Sopenharmony_ci		   which we don't support. Disable ports connected to it */
3158c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_EBH5600:
3168c2ecf20Sopenharmony_ci		if (interface == 1)
3178c2ecf20Sopenharmony_ci			return 0;
3188c2ecf20Sopenharmony_ci		break;
3198c2ecf20Sopenharmony_ci	}
3208c2ecf20Sopenharmony_ci	return supported_ports;
3218c2ecf20Sopenharmony_ci}
3228c2ecf20Sopenharmony_ci
3238c2ecf20Sopenharmony_ci/**
3248c2ecf20Sopenharmony_ci * Get the clock type used for the USB block based on board type.
3258c2ecf20Sopenharmony_ci * Used by the USB code for auto configuration of clock type.
3268c2ecf20Sopenharmony_ci *
3278c2ecf20Sopenharmony_ci * Return USB clock type enumeration
3288c2ecf20Sopenharmony_ci */
3298c2ecf20Sopenharmony_cienum cvmx_helper_board_usb_clock_types __cvmx_helper_board_usb_get_clock_type(void)
3308c2ecf20Sopenharmony_ci{
3318c2ecf20Sopenharmony_ci	switch (cvmx_sysinfo_get()->board_type) {
3328c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_BBGW_REF:
3338c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_LANAI2_A:
3348c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_LANAI2_U:
3358c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_LANAI2_G:
3368c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_NIC10E_66:
3378c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_UBNT_E100:
3388c2ecf20Sopenharmony_ci		return USB_CLOCK_TYPE_CRYSTAL_12;
3398c2ecf20Sopenharmony_ci	case CVMX_BOARD_TYPE_NIC10E:
3408c2ecf20Sopenharmony_ci		return USB_CLOCK_TYPE_REF_12;
3418c2ecf20Sopenharmony_ci	default:
3428c2ecf20Sopenharmony_ci		break;
3438c2ecf20Sopenharmony_ci	}
3448c2ecf20Sopenharmony_ci	/* Most boards except NIC10e use a 12MHz crystal */
3458c2ecf20Sopenharmony_ci	if (OCTEON_IS_OCTEON2())
3468c2ecf20Sopenharmony_ci		return USB_CLOCK_TYPE_CRYSTAL_12;
3478c2ecf20Sopenharmony_ci	return USB_CLOCK_TYPE_REF_48;
3488c2ecf20Sopenharmony_ci}
349