-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
microchip_t1: Add driver for Microchip LAN87XX T1 PHYs
Add driver for Microchip LAN87XX T1 PHYs This patch support driver for Microchp T1 PHYs. There will be followup patches to this driver to support T1 PHY features such as cable diagnostics, signal quality indicator(SQI), sleep and wakeup (TC10) support. Signed-off-by: Nisar Sayed <Nisar.Sayed@microchip.com> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Nisar Sayed
authored and
David S. Miller
committed
May 10, 2018
1 parent
db1617a
commit 3e50d2d
Showing
3 changed files
with
80 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
// Copyright (C) 2018 Microchip Technology | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/module.h> | ||
#include <linux/mii.h> | ||
#include <linux/phy.h> | ||
|
||
/* Interrupt Source Register */ | ||
#define LAN87XX_INTERRUPT_SOURCE (0x18) | ||
|
||
/* Interrupt Mask Register */ | ||
#define LAN87XX_INTERRUPT_MASK (0x19) | ||
#define LAN87XX_MASK_LINK_UP (0x0004) | ||
#define LAN87XX_MASK_LINK_DOWN (0x0002) | ||
|
||
#define DRIVER_AUTHOR "Nisar Sayed <nisar.sayed@microchip.com>" | ||
#define DRIVER_DESC "Microchip LAN87XX T1 PHY driver" | ||
|
||
static int lan87xx_phy_config_intr(struct phy_device *phydev) | ||
{ | ||
int rc, val = 0; | ||
|
||
if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { | ||
/* unmask all source and clear them before enable */ | ||
rc = phy_write(phydev, LAN87XX_INTERRUPT_MASK, 0x7FFF); | ||
rc = phy_read(phydev, LAN87XX_INTERRUPT_SOURCE); | ||
val = LAN87XX_MASK_LINK_UP | LAN87XX_MASK_LINK_DOWN; | ||
} | ||
|
||
rc = phy_write(phydev, LAN87XX_INTERRUPT_MASK, val); | ||
|
||
return rc < 0 ? rc : 0; | ||
} | ||
|
||
static int lan87xx_phy_ack_interrupt(struct phy_device *phydev) | ||
{ | ||
int rc = phy_read(phydev, LAN87XX_INTERRUPT_SOURCE); | ||
|
||
return rc < 0 ? rc : 0; | ||
} | ||
|
||
static struct phy_driver microchip_t1_phy_driver[] = { | ||
{ | ||
.phy_id = 0x0007c150, | ||
.phy_id_mask = 0xfffffff0, | ||
.name = "Microchip LAN87xx T1", | ||
|
||
.features = SUPPORTED_100baseT_Full, | ||
.flags = PHY_HAS_INTERRUPT, | ||
|
||
.config_init = genphy_config_init, | ||
.config_aneg = genphy_config_aneg, | ||
|
||
.ack_interrupt = lan87xx_phy_ack_interrupt, | ||
.config_intr = lan87xx_phy_config_intr, | ||
|
||
.suspend = genphy_suspend, | ||
.resume = genphy_resume, | ||
} | ||
}; | ||
|
||
module_phy_driver(microchip_t1_phy_driver); | ||
|
||
static struct mdio_device_id __maybe_unused microchip_t1_tbl[] = { | ||
{ 0x0007c150, 0xfffffff0 }, | ||
{ } | ||
}; | ||
|
||
MODULE_DEVICE_TABLE(mdio, microchip_t1_tbl); | ||
|
||
MODULE_AUTHOR(DRIVER_AUTHOR); | ||
MODULE_DESCRIPTION(DRIVER_DESC); | ||
MODULE_LICENSE("GPL"); |