diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2013-03-15 15:50:08 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2013-03-15 15:50:08 +0000 |
commit | 7ba6a8d8e8b8b6637209e488978895f49536ffb4 (patch) | |
tree | 52a31a992d2e46e6947b4ea8bf5f182e3656138a /target/linux/generic | |
parent | ee12b1b7d5e7038950f3f3aa9db210ef06d99a5b (diff) | |
download | upstream-7ba6a8d8e8b8b6637209e488978895f49536ffb4.tar.gz upstream-7ba6a8d8e8b8b6637209e488978895f49536ffb4.tar.bz2 upstream-7ba6a8d8e8b8b6637209e488978895f49536ffb4.zip |
generic: ar8216: add OF configuration support for AR8327
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
SVN-Revision: 36047
Diffstat (limited to 'target/linux/generic')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/ar8216.c | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index d4ef7bd195..9889698b07 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -33,6 +33,8 @@ #include <linux/lockdep.h> #include <linux/ar8216_platform.h> #include <linux/workqueue.h> +#include <linux/of_device.h> + #include "ar8216.h" /* size of the vlan table */ @@ -1086,6 +1088,50 @@ ar8327_hw_config_pdata(struct ar8xxx_priv *priv, return 0; } +#ifdef CONFIG_OF +static int +ar8327_hw_config_of(struct ar8xxx_priv *priv, struct device_node *np) +{ + const __be32 *paddr; + int len; + int i; + + paddr = of_get_property(np, "qca,ar8327-initvals", &len); + if (!paddr || len < (2 * sizeof(*paddr))) + return -EINVAL; + + len /= sizeof(*paddr); + + for (i = 0; i < len - 1; i += 2) { + u32 reg; + u32 val; + + reg = be32_to_cpup(paddr + i); + val = be32_to_cpup(paddr + i + 1); + + switch (reg) { + case AR8327_REG_PORT_STATUS(0): + priv->chip_data.ar8327.port0_status = val; + break; + case AR8327_REG_PORT_STATUS(6): + priv->chip_data.ar8327.port6_status = val; + break; + default: + priv->write(priv, reg, val); + break; + } + } + + return 0; +} +#else +static inline int +ar8327_hw_config_of(struct ar8xxx_priv *priv, struct device_node *np) +{ + return -EINVAL; +} +#endif + static int ar8327_hw_init(struct ar8xxx_priv *priv) { @@ -1093,7 +1139,12 @@ ar8327_hw_init(struct ar8xxx_priv *priv) int ret; int i; - ret = ar8327_hw_config_pdata(priv, priv->phy->dev.platform_data); + if (priv->phy->dev.of_node) + ret = ar8327_hw_config_of(priv, priv->phy->dev.of_node); + else + ret = ar8327_hw_config_pdata(priv, + priv->phy->dev.platform_data); + if (ret) return ret; |