diff options
author | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-08-02 09:54:21 +0000 |
---|---|---|
committer | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-08-02 09:54:21 +0000 |
commit | 08700f9817cfae410cea6f58a35bb914288aa0f7 (patch) | |
tree | c95e3fd53d6c4bb0617eeee6eee0b9e84d72a8c1 | |
parent | 7f000ed40c2ec76337df186113fa7d221b1dd8b9 (diff) |
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.
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@32943 3c298f89-4303-0410-b956-a3cf2f4a3e73
7 files changed, 35 insertions, 2 deletions
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 1288db198..990326939 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 ea5e6dbd6..700f83c1a 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 3901602f9..775949792 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 21f743926..77427d6c9 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 4f2ba6327..ee2a04701 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 22ce614d4..78daed220 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 aab553e22..470c5f381 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; |