From: Gabor Juhos <juhosg@openwrt.org>
Date: Thu, 2 Aug 2012 09:54:21 +0000 (+0000)
Subject: generic: rtl836x: add hw_reset field to struct rtl8366_smi
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e2782eae8ee17143d0506078fcf5c0a44b2302fe;p=lede.git

generic: rtl836x: add hw_reset field to struct rtl8366_smi

It will be used to start/stop the switch if that is
supported by the given board.

SVN-Revision: 32943
---

diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c
index 1288db1982..9903269390 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c
@@ -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;
 
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h
index ea5e6dbd6c..700f83c1a5 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h
@@ -32,6 +32,7 @@ struct rtl8366_smi {
 	struct device		*parent;
 	unsigned int		gpio_sda;
 	unsigned int		gpio_sck;
+	void			(*hw_reset)(bool active);
 	unsigned int		clk_delay;	/* ns */
 	u8			cmd_read;
 	u8			cmd_write;
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
index 3901602f93..775949792d 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c
@@ -1194,6 +1194,8 @@ static int __devinit rtl8366rb_probe(struct platform_device *pdev)
 
 	smi->gpio_sda = pdata->gpio_sda;
 	smi->gpio_sck = pdata->gpio_sck;
+	smi->hw_reset = pdata->hw_reset;
+
 	smi->clk_delay = 10;
 	smi->cmd_read = 0xa9;
 	smi->cmd_write = 0xa8;
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366s.c b/target/linux/generic/files/drivers/net/phy/rtl8366s.c
index 21f743926a..77427d6c9e 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8366s.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8366s.c
@@ -1074,6 +1074,8 @@ static int __devinit rtl8366s_probe(struct platform_device *pdev)
 
 	smi->gpio_sda = pdata->gpio_sda;
 	smi->gpio_sck = pdata->gpio_sck;
+	smi->hw_reset = pdata->hw_reset;
+
 	smi->clk_delay = 10;
 	smi->cmd_read = 0xa9;
 	smi->cmd_write = 0xa8;
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8367.c b/target/linux/generic/files/drivers/net/phy/rtl8367.c
index 4f2ba6327b..ee2a047013 100644
--- a/target/linux/generic/files/drivers/net/phy/rtl8367.c
+++ b/target/linux/generic/files/drivers/net/phy/rtl8367.c
@@ -1692,6 +1692,8 @@ static int __devinit rtl8367_probe(struct platform_device *pdev)
 
 	smi->gpio_sda = pdata->gpio_sda;
 	smi->gpio_sck = pdata->gpio_sck;
+	smi->hw_reset = pdata->hw_reset;
+
 	smi->clk_delay = 1500;
 	smi->cmd_read = 0xb9;
 	smi->cmd_write = 0xb8;
diff --git a/target/linux/generic/files/include/linux/rtl8366.h b/target/linux/generic/files/include/linux/rtl8366.h
index 22ce614d40..78daed2205 100644
--- a/target/linux/generic/files/include/linux/rtl8366.h
+++ b/target/linux/generic/files/include/linux/rtl8366.h
@@ -29,6 +29,8 @@ struct rtl8366_initval {
 struct rtl8366_platform_data {
 	unsigned	gpio_sda;
 	unsigned	gpio_sck;
+	void		(*hw_reset)(bool active);
+
 	unsigned	num_initvals;
 	struct rtl8366_initval *initvals;
 };
diff --git a/target/linux/generic/files/include/linux/rtl8367.h b/target/linux/generic/files/include/linux/rtl8367.h
index aab553e229..470c5f3812 100644
--- a/target/linux/generic/files/include/linux/rtl8367.h
+++ b/target/linux/generic/files/include/linux/rtl8367.h
@@ -50,6 +50,7 @@ struct rtl8367_extif_config {
 struct rtl8367_platform_data {
 	unsigned gpio_sda;
 	unsigned gpio_sck;
+	void (*hw_reset)(bool active);
 
 	struct rtl8367_extif_config *extif0_cfg;
 	struct rtl8367_extif_config *extif1_cfg;