diff options
-rw-r--r-- | drivers/net/ethernet/freescale/fec_fixup.c | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/drivers/net/ethernet/freescale/fec_fixup.c b/drivers/net/ethernet/freescale/fec_fixup.c index 097de6fb6d16..b78e0912961b 100644 --- a/drivers/net/ethernet/freescale/fec_fixup.c +++ b/drivers/net/ethernet/freescale/fec_fixup.c @@ -27,9 +27,41 @@ #define IMX8QM_FUSE_MAC0_WORD1 453 #define IMX8QM_FUSE_MAC1_WORD0 454 #define IMX8QM_FUSE_MAC1_WORD1 455 +#define IMX8QXP_FUSE_MAC0_WORD0 708 +#define IMX8QXP_FUSE_MAC0_WORD1 709 +#define IMX8QXP_FUSE_MAC1_WORD0 710 +#define IMX8QXP_FUSE_MAC1_WORD1 711 #define IMX8M_OCOTP_MAC_ADDR0_OFF 0x640 #define IMX8M_OCOTP_MAC_ADDR1_OFF 0x650 +enum imx_soc_type { + IMX8QM_FUSE = 0, + IMX8QXP_FUSE, +}; + +struct imx_fuse_mac_addr { + u32 fuse_mac0_word0; + u32 fuse_mac0_word1; + u32 fuse_mac1_word0; + u32 fuse_mac1_word1; +}; + +static struct imx_fuse_mac_addr imx8_fuse_mapping[] = { + { + .fuse_mac0_word0 = IMX8QM_FUSE_MAC0_WORD0, + .fuse_mac0_word1 = IMX8QM_FUSE_MAC0_WORD1, + .fuse_mac1_word0 = IMX8QM_FUSE_MAC1_WORD0, + .fuse_mac1_word1 = IMX8QM_FUSE_MAC1_WORD1, + }, { + .fuse_mac0_word0 = IMX8QXP_FUSE_MAC0_WORD0, + .fuse_mac0_word1 = IMX8QXP_FUSE_MAC0_WORD1, + .fuse_mac1_word0 = IMX8QXP_FUSE_MAC1_WORD0, + .fuse_mac1_word1 = IMX8QXP_FUSE_MAC1_WORD1, + }, { + /* sentinel */ + } +}; + static int ar8031_phy_fixup(struct phy_device *dev) { u16 val; @@ -117,7 +149,8 @@ put_ocotp_node: } #ifdef CONFIG_ARCH_MXC_ARM64 -static void imx8qm_get_mac_from_fuse(int dev_id, unsigned char *mac) +static void imx8qm_get_mac_from_fuse(int dev_id, unsigned char *mac, + struct imx_fuse_mac_addr *fuse_mapping) { uint32_t mu_id; sc_ipc_t ipc_handle; @@ -138,11 +171,11 @@ static void imx8qm_get_mac_from_fuse(int dev_id, unsigned char *mac) } if (dev_id == 0) { - word1 = IMX8QM_FUSE_MAC0_WORD0; - word2 = IMX8QM_FUSE_MAC0_WORD1; + word1 = fuse_mapping->fuse_mac0_word0; + word2 = fuse_mapping->fuse_mac0_word1; } else { - word1 = IMX8QM_FUSE_MAC1_WORD0; - word2 = IMX8QM_FUSE_MAC1_WORD1; + word1 = fuse_mapping->fuse_mac1_word0; + word2 = fuse_mapping->fuse_mac1_word1; } sc_err = sc_misc_otp_fuse_read(ipc_handle, word1, &val1); @@ -165,7 +198,8 @@ static void imx8qm_get_mac_from_fuse(int dev_id, unsigned char *mac) mac[5] = val2 >> 8; } #else -static void imx8qm_get_mac_from_fuse(int dev_id, unsigned char *mac) {} +static void imx8qm_get_mac_from_fuse(int dev_id, unsigned char *mac, + struct imx_fuse_mac_addr *fuse_mapping) {} #endif void fec_enet_get_mac_from_fuse(struct device_node *np, unsigned char *mac) @@ -179,9 +213,12 @@ void fec_enet_get_mac_from_fuse(struct device_node *np, unsigned char *mac) if (idx < 0) idx = 0; - if (of_machine_is_compatible("fsl,imx8qm") || - of_machine_is_compatible("fsl,imx8qxp")) - imx8qm_get_mac_from_fuse(idx, mac); + if (of_machine_is_compatible("fsl,imx8qm")) + imx8qm_get_mac_from_fuse(idx, mac, + &imx8_fuse_mapping[IMX8QM_FUSE]); + else if (of_machine_is_compatible("fsl,imx8qxp")) + imx8qm_get_mac_from_fuse(idx, mac, + &imx8_fuse_mapping[IMX8QXP_FUSE]); else if (of_machine_is_compatible("fsl,imx8mq")) imx8mq_get_mac_from_fuse(idx, mac); } |