1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright 2011-2015 Freescale Semiconductor, Inc. 4 */ 5 6 #include <common.h> 7 #include <linux/libfdt.h> 8 #include <linux/libfdt_env.h> 9 #include <fdt_support.h> 10 11 #include <fm_eth.h> 12 #ifdef CONFIG_FSL_LAYERSCAPE 13 #include <asm/arch/fsl_serdes.h> 14 #else 15 #include <asm/fsl_serdes.h> 16 #endif 17 18 /* 19 * Given the following ... 20 * 21 * 1) A pointer to an Fman Ethernet node (as identified by the 'compat' 22 * compatible string and 'addr' physical address) 23 * 24 * 2) The name of an alias that points to the ethernet-phy node (usually inside 25 * a virtual MDIO node) 26 * 27 * ... update that Ethernet node's phy-handle property to point to the 28 * ethernet-phy node. This is how we link an Ethernet node to its PHY, so each 29 * PHY in a virtual MDIO node must have an alias. 30 * 31 * Returns 0 on success, or a negative FDT error code on error. 32 */ 33 int fdt_set_phy_handle(void *fdt, char *compat, phys_addr_t addr, 34 const char *alias) 35 { 36 int offset; 37 unsigned int ph; 38 const char *path; 39 40 /* Get a path to the node that 'alias' points to */ 41 path = fdt_get_alias(fdt, alias); 42 if (!path) 43 return -FDT_ERR_BADPATH; 44 45 /* Get the offset of that node */ 46 offset = fdt_path_offset(fdt, path); 47 if (offset < 0) 48 return offset; 49 50 ph = fdt_create_phandle(fdt, offset); 51 if (!ph) 52 return -FDT_ERR_BADPHANDLE; 53 54 ph = cpu_to_fdt32(ph); 55 56 offset = fdt_node_offset_by_compat_reg(fdt, compat, addr); 57 if (offset < 0) 58 return offset; 59 60 return fdt_setprop(fdt, offset, "phy-handle", &ph, sizeof(ph)); 61 } 62 63 /* 64 * Return the SerDes device enum for a given Fman port 65 * 66 * This function just maps the fm_port namespace to the srds_prtcl namespace. 67 */ 68 enum srds_prtcl serdes_device_from_fm_port(enum fm_port port) 69 { 70 static const enum srds_prtcl srds_table[] = { 71 [FM1_DTSEC1] = SGMII_FM1_DTSEC1, 72 [FM1_DTSEC2] = SGMII_FM1_DTSEC2, 73 [FM1_DTSEC3] = SGMII_FM1_DTSEC3, 74 [FM1_DTSEC4] = SGMII_FM1_DTSEC4, 75 [FM1_DTSEC5] = SGMII_FM1_DTSEC5, 76 [FM1_10GEC1] = XAUI_FM1, 77 [FM2_DTSEC1] = SGMII_FM2_DTSEC1, 78 [FM2_DTSEC2] = SGMII_FM2_DTSEC2, 79 [FM2_DTSEC3] = SGMII_FM2_DTSEC3, 80 [FM2_DTSEC4] = SGMII_FM2_DTSEC4, 81 [FM2_DTSEC5] = SGMII_FM2_DTSEC5, 82 [FM2_10GEC1] = XAUI_FM2, 83 }; 84 85 if ((port < FM1_DTSEC1) || (port > FM2_10GEC1)) 86 return NONE; 87 else 88 return srds_table[port]; 89 } 90