aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2012-06-19 10:44:16 +0000
committerGabor Juhos <juhosg@openwrt.org>2012-06-19 10:44:16 +0000
commitb934fa2f160d6c652b5597e686ae31507031ffa9 (patch)
treef8632923f4b9c6c5d36280c4772c51971f4a5714
parentf509a87f2dfd6524792ace9725b0fb25521a0510 (diff)
downloadupstream-b934fa2f160d6c652b5597e686ae31507031ffa9.tar.gz
upstream-b934fa2f160d6c652b5597e686ae31507031ffa9.tar.bz2
upstream-b934fa2f160d6c652b5597e686ae31507031ffa9.zip
generic: ar8216: allow to configure AR8327 LEDs via platform data
SVN-Revision: 32456
-rw-r--r--target/linux/generic/files/drivers/net/phy/ar8216.c23
-rw-r--r--target/linux/generic/files/drivers/net/phy/ar8216.h2
-rw-r--r--target/linux/generic/files/include/linux/ar8216_platform.h9
3 files changed, 33 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 97ce04720c..698d92dd7d 100644
--- a/target/linux/generic/files/drivers/net/phy/ar8216.c
+++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
@@ -733,6 +733,8 @@ static int
ar8327_hw_init(struct ar8216_priv *priv)
{
struct ar8327_platform_data *pdata;
+ struct ar8327_led_cfg *led_cfg;
+ u32 pos, new_pos;
u32 t;
int i;
@@ -747,7 +749,26 @@ ar8327_hw_init(struct ar8216_priv *priv)
t = ar8327_get_pad_cfg(pdata->pad6_cfg);
priv->write(priv, AR8327_REG_PAD6_MODE, t);
- priv->write(priv, AR8327_REG_POWER_ON_STRIP, 0x40000000);
+ pos = priv->read(priv, AR8327_REG_POWER_ON_STRIP);
+ new_pos = pos;
+
+ led_cfg = pdata->led_cfg;
+ if (led_cfg) {
+ if (led_cfg->open_drain)
+ new_pos |= AR8327_POWER_ON_STRIP_LED_OPEN_EN;
+ else
+ new_pos &= ~AR8327_POWER_ON_STRIP_LED_OPEN_EN;
+
+ priv->write(priv, AR8327_REG_LED_CTRL0, led_cfg->led_ctrl0);
+ priv->write(priv, AR8327_REG_LED_CTRL1, led_cfg->led_ctrl1);
+ priv->write(priv, AR8327_REG_LED_CTRL2, led_cfg->led_ctrl2);
+ priv->write(priv, AR8327_REG_LED_CTRL3, led_cfg->led_ctrl3);
+ }
+
+ if (new_pos != pos) {
+ new_pos |= AR8327_POWER_ON_STRIP_POWER_ON_SEL;
+ priv->write(priv, AR8327_REG_POWER_ON_STRIP, new_pos);
+ }
for (i = 0; i < AR8327_NUM_PHYS; i++)
ar8327_phy_fixup(priv, i);
diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.h b/target/linux/generic/files/drivers/net/phy/ar8216.h
index c9b5e9f579..8948c52054 100644
--- a/target/linux/generic/files/drivers/net/phy/ar8216.h
+++ b/target/linux/generic/files/drivers/net/phy/ar8216.h
@@ -198,6 +198,8 @@
#define AR8327_PAD_RGMII_EN BIT(26)
#define AR8327_REG_POWER_ON_STRIP 0x010
+#define AR8327_POWER_ON_STRIP_POWER_ON_SEL BIT(31)
+#define AR8327_POWER_ON_STRIP_LED_OPEN_EN BIT(24)
#define AR8327_REG_INT_STATUS0 0x020
#define AR8327_INT0_VT_DONE BIT(20)
diff --git a/target/linux/generic/files/include/linux/ar8216_platform.h b/target/linux/generic/files/include/linux/ar8216_platform.h
index 1ecb6e5bf2..f5c2ef065f 100644
--- a/target/linux/generic/files/include/linux/ar8216_platform.h
+++ b/target/linux/generic/files/include/linux/ar8216_platform.h
@@ -62,11 +62,20 @@ struct ar8327_port_cfg {
int duplex:1;
};
+struct ar8327_led_cfg {
+ u32 led_ctrl0;
+ u32 led_ctrl1;
+ u32 led_ctrl2;
+ u32 led_ctrl3;
+ bool open_drain;
+};
+
struct ar8327_platform_data {
struct ar8327_pad_cfg *pad0_cfg;
struct ar8327_pad_cfg *pad5_cfg;
struct ar8327_pad_cfg *pad6_cfg;
struct ar8327_port_cfg cpuport_cfg;
+ struct ar8327_led_cfg *led_cfg;
};
#endif /* AR8216_PLATFORM_H */ \ No newline at end of file