From a1f91282b49b22fe845182d860319a75f0b84627 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Thu, 30 May 2013 17:38:26 +0000 Subject: [PATCH] generic: ar8216: allow to specify SGMII config via platform data Signed-off-by: Gabor Juhos SVN-Revision: 36798 --- .../generic/files/drivers/net/phy/ar8216.c | 25 ++++++++++++++++--- .../generic/files/drivers/net/phy/ar8216.h | 6 +++++ .../files/include/linux/ar8216_platform.h | 6 +++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index bc36efc3a83..3a696c2986e 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1099,13 +1099,32 @@ ar8327_hw_config_pdata(struct ar8xxx_priv *priv, 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; } - if (new_pos != pos) { - new_pos |= AR8327_POWER_ON_STRIP_POWER_ON_SEL; - priv->write(priv, AR8327_REG_POWER_ON_STRIP, new_pos); + if (pdata->sgmii_cfg) { + t = pdata->sgmii_cfg->sgmii_ctrl; + if (priv->chip_rev == 1) + t |= AR8327_SGMII_CTRL_EN_PLL | + AR8327_SGMII_CTRL_EN_RX | + AR8327_SGMII_CTRL_EN_TX; + else + t &= ~(AR8327_SGMII_CTRL_EN_PLL | + AR8327_SGMII_CTRL_EN_RX | + AR8327_SGMII_CTRL_EN_TX); + + priv->write(priv, AR8327_REG_SGMII_CTRL, t); + + if (pdata->sgmii_cfg->serdes_aen) + new_pos &= ~AR8327_POWER_ON_STRIP_SERDES_AEN; + else + new_pos |= AR8327_POWER_ON_STRIP_SERDES_AEN; } + priv->write(priv, AR8327_REG_POWER_ON_STRIP, new_pos); + return 0; } diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.h b/target/linux/generic/files/drivers/net/phy/ar8216.h index 086d58fbab4..ea6d6821c18 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.h +++ b/target/linux/generic/files/drivers/net/phy/ar8216.h @@ -327,6 +327,7 @@ #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_POWER_ON_STRIP_SERDES_AEN BIT(7) #define AR8327_REG_INT_STATUS0 0x020 #define AR8327_INT0_VT_DONE BIT(20) @@ -357,6 +358,11 @@ #define AR8327_REG_HEADER_CTRL 0x098 #define AR8327_REG_PORT_HEADER(_i) (0x09c + (_i) * 4) +#define AR8327_REG_SGMII_CTRL 0x0e0 +#define AR8327_SGMII_CTRL_EN_PLL BIT(1) +#define AR8327_SGMII_CTRL_EN_RX BIT(2) +#define AR8327_SGMII_CTRL_EN_TX BIT(3) + #define AR8327_REG_PORT_VLAN0(_i) (0x420 + (_i) * 0x8) #define AR8327_PORT_VLAN0_DEF_SVID BITS(0, 12) #define AR8327_PORT_VLAN0_DEF_SVID_S 0 diff --git a/target/linux/generic/files/include/linux/ar8216_platform.h b/target/linux/generic/files/include/linux/ar8216_platform.h index 92e8eda663d..23cd55b8224 100644 --- a/target/linux/generic/files/include/linux/ar8216_platform.h +++ b/target/linux/generic/files/include/linux/ar8216_platform.h @@ -63,6 +63,11 @@ struct ar8327_port_cfg { int duplex:1; }; +struct ar8327_sgmii_cfg { + u32 sgmii_ctrl; + bool serdes_aen; +}; + struct ar8327_led_cfg { u32 led_ctrl0; u32 led_ctrl1; @@ -75,6 +80,7 @@ struct ar8327_platform_data { struct ar8327_pad_cfg *pad0_cfg; struct ar8327_pad_cfg *pad5_cfg; struct ar8327_pad_cfg *pad6_cfg; + struct ar8327_sgmii_cfg *sgmii_cfg; struct ar8327_port_cfg port0_cfg; struct ar8327_port_cfg port6_cfg; struct ar8327_led_cfg *led_cfg; -- 2.30.2