提交 a653f2f5 编写于 作者: C Christian Lamparter 提交者: David S. Miller

net: dsa: qca8k: introduce reset via gpio feature

The QCA8337(N) has a RESETn signal on Pin B42 that
triggers a chip reset if the line is pulled low.
The datasheet says that: "The active low duration
must be greater than 10 ms".

This can hopefully fix some of the issues related
to pin strapping in OpenWrt for the EA8500 which
suffers from detection issues after a SoC reset.

Please note that the qca8k_probe() function does
currently require to read the chip's revision
register for identification purposes.
Signed-off-by: NChristian Lamparter <chunkeey@gmail.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 e7dd8a89
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/if_bridge.h> #include <linux/if_bridge.h>
#include <linux/mdio.h> #include <linux/mdio.h>
#include <linux/gpio.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include "qca8k.h" #include "qca8k.h"
...@@ -1046,6 +1047,20 @@ qca8k_sw_probe(struct mdio_device *mdiodev) ...@@ -1046,6 +1047,20 @@ qca8k_sw_probe(struct mdio_device *mdiodev)
priv->bus = mdiodev->bus; priv->bus = mdiodev->bus;
priv->dev = &mdiodev->dev; priv->dev = &mdiodev->dev;
priv->reset_gpio = devm_gpiod_get_optional(priv->dev, "reset",
GPIOD_ASIS);
if (IS_ERR(priv->reset_gpio))
return PTR_ERR(priv->reset_gpio);
if (priv->reset_gpio) {
gpiod_set_value_cansleep(priv->reset_gpio, 1);
/* The active low duration must be greater than 10 ms
* and checkpatch.pl wants 20 ms.
*/
msleep(20);
gpiod_set_value_cansleep(priv->reset_gpio, 0);
}
/* read the switches ID register */ /* read the switches ID register */
id = qca8k_read(priv, QCA8K_REG_MASK_CTRL); id = qca8k_read(priv, QCA8K_REG_MASK_CTRL);
id >>= QCA8K_MASK_CTRL_ID_S; id >>= QCA8K_MASK_CTRL_ID_S;
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/gpio.h>
#define QCA8K_NUM_PORTS 7 #define QCA8K_NUM_PORTS 7
...@@ -174,6 +175,7 @@ struct qca8k_priv { ...@@ -174,6 +175,7 @@ struct qca8k_priv {
struct mutex reg_mutex; struct mutex reg_mutex;
struct device *dev; struct device *dev;
struct dsa_switch_ops ops; struct dsa_switch_ops ops;
struct gpio_desc *reset_gpio;
}; };
struct qca8k_mib_desc { struct qca8k_mib_desc {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册