diff options
author | Hauke Mehrtens <hauke@openwrt.org> | 2013-08-01 19:05:34 +0000 |
---|---|---|
committer | Hauke Mehrtens <hauke@openwrt.org> | 2013-08-01 19:05:34 +0000 |
commit | 7e3141d84674bfbae9b1c8e763afd7ba5f27a550 (patch) | |
tree | 4e36e23f1a3c7eb59eb1dc8d7eca20ad4dbbd177 /target/linux/generic/files/drivers/net/phy/b53/b53_common.c | |
parent | edb8a4fa2e08d42ba1a408f2e435a7c5218156bc (diff) | |
download | upstream-7e3141d84674bfbae9b1c8e763afd7ba5f27a550.tar.gz upstream-7e3141d84674bfbae9b1c8e763afd7ba5f27a550.tar.bz2 upstream-7e3141d84674bfbae9b1c8e763afd7ba5f27a550.zip |
kernel: b53: add support for GPIO reset
This is needed for some switches used on bcm47xx SoCs like the one on the Asus RT-N66U.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@37645 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic/files/drivers/net/phy/b53/b53_common.c')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/b53/b53_common.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_common.c b/target/linux/generic/files/drivers/net/phy/b53/b53_common.c index 86e3a787fb..97968dbf0b 100644 --- a/target/linux/generic/files/drivers/net/phy/b53/b53_common.c +++ b/target/linux/generic/files/drivers/net/phy/b53/b53_common.c @@ -20,6 +20,7 @@ #include <linux/delay.h> #include <linux/export.h> +#include <linux/gpio.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/switch.h> @@ -451,10 +452,30 @@ static int b53_apply(struct b53_device *dev) return 0; } +void b53_switch_reset_gpio(struct b53_device *dev) +{ + int gpio = dev->reset_gpio; + + if (gpio < 0) + return; + + gpio_set_value(gpio, 0); + gpio_direction_output(gpio, 1); + gpio_set_value(gpio, 0); + mdelay(50); + + gpio_set_value(gpio, 1); + mdelay(20); + + dev->current_page = 0xff; +} + static int b53_switch_reset(struct b53_device *dev) { u8 mgmt; + b53_switch_reset_gpio(dev); + b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, &mgmt); if (!(mgmt & SM_SW_FWD_EN)) { @@ -1114,6 +1135,7 @@ int b53_switch_init(struct b53_device *dev) { struct switch_dev *sw_dev = &dev->sw_dev; unsigned i; + int ret; for (i = 0; i < ARRAY_SIZE(b53_switch_chips); i++) { const struct b53_chip_data *chip = &b53_switch_chips[i]; @@ -1192,6 +1214,13 @@ int b53_switch_init(struct b53_device *dev) if (!dev->buf) return -ENOMEM; + dev->reset_gpio = b53_switch_get_reset_gpio(dev); + if (dev->reset_gpio >= 0) { + ret = devm_gpio_request(dev->dev, dev->reset_gpio, "robo_reset"); + if (ret) + return ret; + } + return b53_switch_reset(dev); } |