Sfoglia il codice sorgente

mvswitch,adm6996: use phy fixups instead of a nonstandard patch for hardware detection

SVN-Revision: 14977
Felix Fietkau 17 anni fa
parent
commit
f972eb41b5

+ 21 - 20
target/linux/generic-2.6/files/drivers/net/phy/adm6996.c

@@ -105,6 +105,24 @@ static int adm6996_config_aneg(struct phy_device *phydev)
 	return 0;
 }
 
+static int adm6996_fixup(struct phy_device *dev)
+{
+	struct mii_bus *bus = dev->bus;
+	u16 reg;
+
+	/* look for the switch on the bus */
+	reg = bus->read(bus, PHYADDR(ADM_SIG0)) & ADM_SIG0_MASK;
+	if (reg != ADM_SIG0_VAL)
+		return 0;
+
+	reg = bus->read(bus, PHYADDR(ADM_SIG1)) & ADM_SIG1_MASK;
+	if (reg != ADM_SIG1_VAL)
+		return 0;
+
+	dev->phy_id = (ADM_SIG0_VAL << 16) | ADM_SIG1_VAL;
+	return 0;
+}
+
 static int adm6996_probe(struct phy_device *pdev)
 {
 	struct adm6996_priv *priv;
@@ -124,30 +142,12 @@ static void adm6996_remove(struct phy_device *pdev)
 	kfree(pdev->priv);
 }
 
-static bool adm6996_detect(struct mii_bus *bus, int addr)
-{
-	u16 reg;
-
-	/* we only attach to phy id 0 */
-	if (addr != 0)
-		return false;
-
-	/* look for the switch on the bus */
-	reg = bus->read(bus, PHYADDR(ADM_SIG0)) & ADM_SIG0_MASK;
-	if (reg != ADM_SIG0_VAL)
-		return false;
-
-	reg = bus->read(bus, PHYADDR(ADM_SIG1)) & ADM_SIG1_MASK;
-	if (reg != ADM_SIG1_VAL)
-		return false;
-
-	return true;
-}
 
 static struct phy_driver adm6996_driver = {
 	.name		= "Infineon ADM6996",
+	.phy_id		= (ADM_SIG0_VAL << 16) | ADM_SIG1_VAL,
+	.phy_id_mask	= 0xffffffff,
 	.features	= PHY_BASIC_FEATURES,
-	.detect		= adm6996_detect,
 	.probe		= adm6996_probe,
 	.remove		= adm6996_remove,
 	.config_init	= &adm6996_config_init,
@@ -158,6 +158,7 @@ static struct phy_driver adm6996_driver = {
 
 static int __init adm6996_init(void)
 {
+	phy_register_fixup_for_id(PHY_ANY_ID, adm6996_fixup);
 	return phy_driver_register(&adm6996_driver);
 }
 

+ 19 - 32
target/linux/generic-2.6/files/drivers/net/phy/mvswitch.c

@@ -38,6 +38,8 @@ MODULE_DESCRIPTION("Marvell 88E6060 Switch driver");
 MODULE_AUTHOR("Felix Fietkau");
 MODULE_LICENSE("GPL");
 
+#define MVSWITCH_MAGIC 0x88E6060
+
 struct mvswitch_priv {
 	/* the driver's tx function */
 	int (*hardstart)(struct sk_buff *skb, struct net_device *dev);
@@ -401,37 +403,6 @@ mvswitch_remove(struct phy_device *pdev)
 	kfree(priv);
 }
 
-static bool
-mvswitch_detect(struct mii_bus *bus, int addr)
-{
-	u16 reg;
-	int i;
-
-	/* we attach to phy id 31 to make sure that the late probe works */
-	if (addr != 31)
-		return false;
-
-	/* look for the switch on the bus */
-	reg = bus->read(bus, MV_PORTREG(IDENT, 0)) & MV_IDENT_MASK;
-	if (reg != MV_IDENT_VALUE)
-		return false;
-
-	/* 
-	 * Now that we've established that the switch actually exists, let's 
-	 * get rid of the competition :)
-	 */
-	for (i = 0; i < 31; i++) {
-		if (!bus->phy_map[i])
-			continue;
-
-		device_unregister(&bus->phy_map[i]->dev);
-		kfree(bus->phy_map[i]);
-		bus->phy_map[i] = NULL;
-	}
-
-	return true;
-}
-
 static int
 mvswitch_probe(struct phy_device *pdev)
 {
@@ -446,11 +417,26 @@ mvswitch_probe(struct phy_device *pdev)
 	return 0;
 }
 
+static int
+mvswitch_fixup(struct phy_device *dev)
+{
+	u16 reg;
+
+	/* look for the switch on the bus */
+	reg = dev->bus->read(dev->bus, MV_PORTREG(IDENT, 0)) & MV_IDENT_MASK;
+	if (reg != MV_IDENT_VALUE)
+		return 0;
+
+	dev->phy_id = MVSWITCH_MAGIC;
+	return 0;
+}
+
 
 static struct phy_driver mvswitch_driver = {
 	.name		= "Marvell 88E6060",
+	.phy_id		= MVSWITCH_MAGIC,
+	.phy_id_mask	= 0xffffffff,
 	.features	= PHY_BASIC_FEATURES,
-	.detect		= &mvswitch_detect,
 	.probe		= &mvswitch_probe,
 	.remove		= &mvswitch_remove,
 	.config_init	= &mvswitch_config_init,
@@ -462,6 +448,7 @@ static struct phy_driver mvswitch_driver = {
 static int __init
 mvswitch_init(void)
 {
+	phy_register_fixup_for_id(PHY_ANY_ID, mvswitch_fixup);
 	return phy_driver_register(&mvswitch_driver);
 }