summaryrefslogtreecommitdiff
path: root/drivers/net/phy
diff options
context:
space:
mode:
authorZhao Qiang <B45475@freescale.com>2014-03-21 06:59:17 (GMT)
committerJose Rivera <German.Rivera@freescale.com>2014-03-28 00:23:33 (GMT)
commit224220a55c6b7254739840fadbf3a79722821b1b (patch)
tree3bb0e9e66c2567a4af5aa078acc410e64602ac3a /drivers/net/phy
parentc67671a1397ec5ce26cd9e9706f7f5233b17208a (diff)
downloadlinux-fsl-qoriq-224220a55c6b7254739840fadbf3a79722821b1b.tar.xz
powerpc/phy: add config function to enable interrupt AT8033
AT8033 can't work well with auto-negotiation. Add .config_intr and .ack_interrupt functions for at8033_driver to config AT8033 to enable interrupt for auto-negotiation. Signed-off-by: Zhao Qiang <B45475@freescale.com> Change-Id: I47b539cf5fc9da52c6980e95e1bd105621abf102 Reviewed-on: http://git.am.freescale.net:8181/10282 Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Xiaobo Xie <X.Xie@freescale.com> Reviewed-by: Jose Rivera <German.Rivera@freescale.com>
Diffstat (limited to 'drivers/net/phy')
-rw-r--r--drivers/net/phy/at803x.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c
index 36b8b81..5124d3e 100644
--- a/drivers/net/phy/at803x.c
+++ b/drivers/net/phy/at803x.c
@@ -27,6 +27,9 @@
#define AT803X_MMD_ACCESS_CONTROL 0x0D
#define AT803X_MMD_ACCESS_CONTROL_DATA 0x0E
#define AT803X_FUNC_DATA 0x4003
+#define AT803X_INER 0x0012
+#define AT803X_INER_INIT 0xec00
+#define AT803X_INSR 0x0013
#define AT803X_DEBUG_ADDR 0x1D
#define AT803X_DEBUG_DATA 0x1E
#define AT803X_DEBUG_SYSTEM_MODE_CTRL 0x05
@@ -191,6 +194,31 @@ static int at803x_config_init(struct phy_device *phydev)
return 0;
}
+static int at803x_ack_interrupt(struct phy_device *phydev)
+{
+ int err;
+
+ err = phy_read(phydev, AT803X_INSR);
+
+ return (err < 0) ? err : 0;
+}
+
+static int at803x_config_intr(struct phy_device *phydev)
+{
+ int err;
+ int value;
+
+ value = phy_read(phydev, AT803X_INER);
+
+ if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
+ err = phy_write(phydev, AT803X_INER,
+ (value | AT803X_INER_INIT));
+ else
+ err = phy_write(phydev, AT803X_INER, value);
+
+ return err;
+}
+
static struct phy_driver at803x_driver[] = {
{
/* ATHEROS 8035 */
@@ -219,6 +247,8 @@ static struct phy_driver at803x_driver[] = {
.flags = PHY_HAS_INTERRUPT,
.config_aneg = &genphy_config_aneg,
.read_status = &genphy_read_status,
+ .ack_interrupt = &at803x_ack_interrupt,
+ .config_intr = &at803x_config_intr,
.driver = {
.owner = THIS_MODULE,
},