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 */ 33int 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 */ 68enum 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