generic: rtl836x: add hw_reset field to struct rtl8366_smi
[openwrt/staging/chunkeey.git] / target / linux / generic / files / drivers / net / phy / rtl8366_smi.c
index 1288db1982efc0eb271f5362507e37f0a9d03ac0..9903269390e452a5279db68b8ab3ee029eb630bd 100644 (file)
@@ -308,6 +308,19 @@ int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, u32 data)
 }
 EXPORT_SYMBOL_GPL(rtl8366_smi_rmwr);
 
+static int rtl8366_reset(struct rtl8366_smi *smi)
+{
+       if (smi->hw_reset) {
+               smi->hw_reset(true);
+               msleep(25);
+               smi->hw_reset(false);
+               msleep(25);
+               return 0;
+       }
+
+       return smi->ops->reset_chip(smi);
+}
+
 static int rtl8366_mc_is_used(struct rtl8366_smi *smi, int mc_index, int *used)
 {
        int err;
@@ -938,7 +951,7 @@ int rtl8366_sw_reset_switch(struct switch_dev *dev)
        struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
        int err;
 
-       err = smi->ops->reset_chip(smi);
+       err = rtl8366_reset(smi);
        if (err)
                return err;
 
@@ -1227,6 +1240,13 @@ static int __rtl8366_smi_init(struct rtl8366_smi *smi, const char *name)
        }
 
        spin_lock_init(&smi->lock);
+
+       /* start the switch */
+       if (smi->hw_reset) {
+               smi->hw_reset(false);
+               msleep(25);
+       }
+
        return 0;
 
  err_free_sda:
@@ -1237,6 +1257,9 @@ static int __rtl8366_smi_init(struct rtl8366_smi *smi, const char *name)
 
 static void __rtl8366_smi_cleanup(struct rtl8366_smi *smi)
 {
+       if (smi->hw_reset)
+               smi->hw_reset(true);
+
        gpio_free(smi->gpio_sck);
        gpio_free(smi->gpio_sda);
 }
@@ -1300,7 +1323,7 @@ int rtl8366_smi_init(struct rtl8366_smi *smi)
                goto err_free_sck;
        }
 
-       err = smi->ops->reset_chip(smi);
+       err = rtl8366_reset(smi);
        if (err)
                goto err_free_sck;