]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/phy/davicom.c
stallion: Use krefs
[linux-2.6-omap-h63xx.git] / drivers / net / phy / davicom.c
index 519baa38be8dcf767eac87b6f19843ef4ae21e52..d926168bc7809c62e46d32d5d9fe98e493ad6e7e 100644 (file)
@@ -37,6 +37,7 @@
 
 #define MII_DM9161_SCR         0x10
 #define MII_DM9161_SCR_INIT    0x0610
+#define MII_DM9161_SCR_RMII    0x0100
 
 /* DM9161 Interrupt Register */
 #define MII_DM9161_INTR        0x15
@@ -103,7 +104,7 @@ static int dm9161_config_aneg(struct phy_device *phydev)
 
 static int dm9161_config_init(struct phy_device *phydev)
 {
-       int err;
+       int err, temp;
 
        /* Isolate the PHY */
        err = phy_write(phydev, MII_BMCR, BMCR_ISOLATE);
@@ -111,9 +112,19 @@ static int dm9161_config_init(struct phy_device *phydev)
        if (err < 0)
                return err;
 
-       /* Do not bypass the scrambler/descrambler */
-       err = phy_write(phydev, MII_DM9161_SCR, MII_DM9161_SCR_INIT);
+       switch (phydev->interface) {
+       case PHY_INTERFACE_MODE_MII:
+               temp = MII_DM9161_SCR_INIT;
+               break;
+       case PHY_INTERFACE_MODE_RMII:
+               temp =  MII_DM9161_SCR_INIT | MII_DM9161_SCR_RMII;
+               break;
+       default:
+               return -EINVAL;
+       }
 
+       /* Do not bypass the scrambler/descrambler */
+       err = phy_write(phydev, MII_DM9161_SCR, temp);
        if (err < 0)
                return err;
 
@@ -139,7 +150,7 @@ static int dm9161_ack_interrupt(struct phy_device *phydev)
        return (err < 0) ? err : 0;
 }
 
-static struct phy_driver dm9161_driver = {
+static struct phy_driver dm9161e_driver = {
        .phy_id         = 0x0181b880,
        .name           = "Davicom DM9161E",
        .phy_id_mask    = 0x0ffffff0,
@@ -147,7 +158,18 @@ static struct phy_driver dm9161_driver = {
        .config_init    = dm9161_config_init,
        .config_aneg    = dm9161_config_aneg,
        .read_status    = genphy_read_status,
-       .driver         = { .owner = THIS_MODULE,},
+       .driver         = { .owner = THIS_MODULE,},
+};
+
+static struct phy_driver dm9161a_driver = {
+       .phy_id         = 0x0181b8a0,
+       .name           = "Davicom DM9161A",
+       .phy_id_mask    = 0x0ffffff0,
+       .features       = PHY_BASIC_FEATURES,
+       .config_init    = dm9161_config_init,
+       .config_aneg    = dm9161_config_aneg,
+       .read_status    = genphy_read_status,
+       .driver         = { .owner = THIS_MODULE,},
 };
 
 static struct phy_driver dm9131_driver = {
@@ -160,31 +182,38 @@ static struct phy_driver dm9131_driver = {
        .read_status    = genphy_read_status,
        .ack_interrupt  = dm9161_ack_interrupt,
        .config_intr    = dm9161_config_intr,
-       .driver         = { .owner = THIS_MODULE,},
+       .driver         = { .owner = THIS_MODULE,},
 };
 
 static int __init davicom_init(void)
 {
        int ret;
 
-       ret = phy_driver_register(&dm9161_driver);
+       ret = phy_driver_register(&dm9161e_driver);
        if (ret)
                goto err1;
 
-       ret = phy_driver_register(&dm9131_driver);
+       ret = phy_driver_register(&dm9161a_driver);
        if (ret)
                goto err2;
+
+       ret = phy_driver_register(&dm9131_driver);
+       if (ret)
+               goto err3;
        return 0;
 
- err2: 
-       phy_driver_unregister(&dm9161_driver);
+ err3:
+       phy_driver_unregister(&dm9161a_driver);
+ err2:
+       phy_driver_unregister(&dm9161e_driver);
  err1:
        return ret;
 }
 
 static void __exit davicom_exit(void)
 {
-       phy_driver_unregister(&dm9161_driver);
+       phy_driver_unregister(&dm9161e_driver);
+       phy_driver_unregister(&dm9161a_driver);
        phy_driver_unregister(&dm9131_driver);
 }