generic: rtl8366: introduce rtl8366_smi_ops
[openwrt/svn-archive/archive.git] / target / linux / generic-2.6 / files / drivers / net / phy / rtl8366rb.c
index fd8b7e49d1336c5b98e8f41ad080b95eb157ba8a..eca2586a24b3f22f52235ae54e8a1c8cf8806155 100644 (file)
@@ -26,7 +26,7 @@
 #endif
 
 #define RTL8366S_DRIVER_DESC   "Realtek RTL8366RB ethernet switch driver"
-#define RTL8366S_DRIVER_VER    "0.2.0"
+#define RTL8366S_DRIVER_VER    "0.2.2"
 
 #define RTL8366S_PHY_NO_MAX                 4
 #define RTL8366S_PHY_PAGE_MAX               7
@@ -1573,14 +1573,25 @@ static int rtl8366rb_mii_bus_match(struct mii_bus *bus)
 
 static int rtl8366rb_setup(struct rtl8366rb *rtl)
 {
-       struct rtl8366_smi *smi = &rtl->smi;
+       int ret;
+
+       ret = rtl8366rb_reset_chip(rtl);
+       if (ret)
+               return ret;
+
+       rtl8366rb_debugfs_init(rtl);
+       return 0;
+}
+
+static int rtl8366rb_detect(struct rtl8366_smi *smi)
+{
        u32 chip_id = 0;
        u32 chip_ver = 0;
        int ret;
 
        ret = rtl8366_smi_read_reg(smi, RTL8366S_CHIP_ID_REG, &chip_id);
        if (ret) {
-               dev_err(rtl->parent, "unable to read chip id\n");
+               dev_err(smi->parent, "unable to read chip id\n");
                return ret;
        }
 
@@ -1588,28 +1599,27 @@ static int rtl8366rb_setup(struct rtl8366rb *rtl)
        case RTL8366S_CHIP_ID_8366:
                break;
        default:
-               dev_err(rtl->parent, "unknown chip id (%04x)\n", chip_id);
+               dev_err(smi->parent, "unknown chip id (%04x)\n", chip_id);
                return -ENODEV;
        }
 
        ret = rtl8366_smi_read_reg(smi, RTL8366S_CHIP_VERSION_CTRL_REG,
                                   &chip_ver);
        if (ret) {
-               dev_err(rtl->parent, "unable to read chip version\n");
+               dev_err(smi->parent, "unable to read chip version\n");
                return ret;
        }
 
-       dev_info(rtl->parent, "RTL%04x ver. %u chip found\n",
+       dev_info(smi->parent, "RTL%04x ver. %u chip found\n",
                 chip_id, chip_ver & RTL8366S_CHIP_VERSION_MASK);
 
-       ret = rtl8366rb_reset_chip(rtl);
-       if (ret)
-               return ret;
-
-       rtl8366rb_debugfs_init(rtl);
        return 0;
 }
 
+static struct rtl8366_smi_ops rtl8366rb_smi_ops = {
+       .detect         = rtl8366rb_detect,
+};
+
 static int __init rtl8366rb_probe(struct platform_device *pdev)
 {
        static int rtl8366_smi_version_printed;
@@ -1642,6 +1652,7 @@ static int __init rtl8366rb_probe(struct platform_device *pdev)
        smi->parent = &pdev->dev;
        smi->gpio_sda = pdata->gpio_sda;
        smi->gpio_sck = pdata->gpio_sck;
+       smi->ops = &rtl8366rb_smi_ops;
 
        err = rtl8366_smi_init(smi);
        if (err)