Skip to content

Commit

Permalink
phy/at8031: enable at8031 to work on interrupt mode
Browse files Browse the repository at this point in the history
The at8031 can work on polling mode and interrupt mode.
Add ack_interrupt and config intr funcs to enable
interrupt mode for it.

Signed-off-by: Zhao Qiang <B45475@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Zhao Qiang authored and David S. Miller committed Mar 29, 2014
1 parent 437de07 commit 77a9939
Showing 1 changed file with 30 additions and 0 deletions.
30 changes: 30 additions & 0 deletions drivers/net/phy/at803x.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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, 0);

return err;
}

static struct phy_driver at803x_driver[] = {
{
/* ATHEROS 8035 */
Expand Down Expand Up @@ -240,6 +268,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,
},
Expand Down

0 comments on commit 77a9939

Please sign in to comment.