83xx: UEC: Added support for bitBang MII driver access to PHYs
[oweals/u-boot.git] / drivers / qe / uec_phy.c
index fa48feaf04252c0c50167898b99ddf84efcfaf37..3baffe42fbcb37632cb80bb08c39cf44a965eb5e 100644 (file)
@@ -93,6 +93,27 @@ static const struct fixed_phy_port fixed_phy_port[] = {
        CONFIG_SYS_FIXED_PHY_PORTS /* defined in board configuration file */
 };
 
+/*--------------------------------------------------------------------+
+ * BitBang MII support for ethernet ports
+ *
+ * Based from MPC8560ADS implementation
+ *--------------------------------------------------------------------*/
+/*
+ * Example board header file to define bitbang ethernet ports:
+ *
+ * #define CONFIG_SYS_BITBANG_PHY_PORT(name) name,
+ * #define CONFIG_SYS_BITBANG_PHY_PORTS CONFIG_SYS_BITBANG_PHY_PORT("FSL UEC0")
+*/
+#ifndef CONFIG_SYS_BITBANG_PHY_PORTS
+#define CONFIG_SYS_BITBANG_PHY_PORTS   /* default is an empty array */
+#endif
+
+#if defined(CONFIG_BITBANGMII)
+static const char *bitbang_phy_port[] = {
+       CONFIG_SYS_BITBANG_PHY_PORTS /* defined in board configuration file */
+};
+#endif /* CONFIG_BITBANGMII */
+
 static void config_genmii_advert (struct uec_mii_info *mii_info);
 static void genmii_setup_forced (struct uec_mii_info *mii_info);
 static void genmii_restart_aneg (struct uec_mii_info *mii_info);
@@ -113,6 +134,19 @@ void uec_write_phy_reg (struct eth_device *dev, int mii_id, int regnum, int valu
        enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum;
        u32 tmp_reg;
 
+
+#if defined(CONFIG_BITBANGMII)
+       u32 i = 0;
+
+       for (i = 0; i < ARRAY_SIZE(bitbang_phy_port); i++) {
+               if (strncmp(dev->name, bitbang_phy_port[i],
+                       sizeof(dev->name)) == 0) {
+                       (void)bb_miiphy_write(NULL, mii_id, regnum, value);
+                       return;
+               }
+       }
+#endif /* CONFIG_BITBANGMII */
+
        ug_regs = ugeth->uec_mii_regs;
 
        /* Stop the MII management read cycle */
@@ -140,6 +174,19 @@ int uec_read_phy_reg (struct eth_device *dev, int mii_id, int regnum)
        u32 tmp_reg;
        u16 value;
 
+
+#if defined(CONFIG_BITBANGMII)
+       u32 i = 0;
+
+       for (i = 0; i < ARRAY_SIZE(bitbang_phy_port); i++) {
+               if (strncmp(dev->name, bitbang_phy_port[i],
+                       sizeof(dev->name)) == 0) {
+                       (void)bb_miiphy_read(NULL, mii_id, regnum, &value);
+                       return (value);
+               }
+       }
+#endif /* CONFIG_BITBANGMII */
+
        ug_regs = ugeth->uec_mii_regs;
 
        /* Setting up the MII Mangement Address Register */